DXライブラリ マップチップ マップ 描画 描く 学習メモ

アバター
LDR
記事: 0
登録日時: 11年前
連絡を取る:

DXライブラリ マップチップ マップ 描画 描く 学習メモ

投稿記事 by LDR » 11年前

VC++2008EEで作業 DXライブラリ使用
サンプルプログラミングの館 10 RPGのサンプル参考
上記サンプルコードから、マップ描画部分だけを抜き出し動きを学ぶ目的。
マップチップ画像を使って、マップを表示させるだけ。

CODE:

//main.cpp
#define LOAD

#include "DxLib.h"
#include "GV.h"

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){

	//ウィンドウモード変更 DXライブラリ初期化 裏画面設定
	ChangeWindowMode(TRUE),DxLib_Init(),SetDrawScreen(DX_SCREEN_BACK);

	load();//データロード

	//裏画面を表画面に反映 メッセージ処理 画面クリア
	while(ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0){

		map_graph();//マップ描画

	}

	DxLib_End();
	return 0;
}

CODE:

//GV.h
#include "DxLib.h"

#define WIND_WIDE  640		//横ウィンドウサイズ
#define WIND_HIGHT 480		//縦ウィンドウサイズ 
#define WIDE	32			//一区間の大きさ。例(32x32)

//main.cppのみここを通る 
#ifdef LOAD


//画像変数
int mapchip_img[1][2];	//マップチップ画像


//以下、main関数で呼ぶためのetern宣言。ソリューションエクスプローラーの通りに書いてある。


//マップ描画
void map_graph();


//load.cpp マップチップの画像データロード
extern void load();


int map[WIND_HIGHT/WIDE][WIND_WIDE/WIDE]={//マップデータを格納するための2次元配列
	// ↑縦の区間個数  ↑横の区間個数
	//最上段部で指定したウィンドウサイズと一区間の大きさで計算している
	//例:縦480 /(割る) 一区間32 = 15
	// :横640 /(割る) 一区間32 = 20
	// :int map[15][20] と言う二次元配列になる(20個の小部屋がある家を15個作っている)

		{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
		{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
		{0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0},
		{0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0},
		{0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0},
		{0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0},
		{0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0},
		{0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0},
		{0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0},
		{0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0},
		{0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0},
		{0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0},
		{0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0},
		{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
		{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
};


//main.cpp以外ではココを通る
#else

//画像変数
//externはまだ理解してない 要は他のファイルでも指定した変数を使えるようにしてる?
extern int mapchip_img[1][2];

extern int map[WIND_HIGHT/WIDE][WIND_WIDE/WIDE];

#endif //LOAD 

CODE:

//load.cpp
#include "GV.h"

void load(){
	
	//マップチップ画像ロード
	//imageファイルの中にある0.pngファイルを、GV.hで用意した二次元配列mapchip_imgにロード
	//分割した総数2 横2分割 縦1分割(分割なし) 分割された1画像のサイズ32*32
	LoadDivGraph( "image/0.png" , 2 , 2 , 1 , 32 , 32 , mapchip_img[0]);

	return ;
}

CODE:

//map_graph.cpp
#include "GV.h"

void map_graph(){//マップの描画

	int i,j;//forで繰り返し処理するための変数

	//横のウィンドウサイズ/1区間のサイズ=横の区間個数
	//上記サイズはGV.hで指定している
	//変数iの数が0から+1しながら繰り返す 横の区間数繰り返したら終わる
	for(i=0;i<WIND_WIDE/WIDE;i++){

		//縦のウィンドウサイズ/1区間のサイズ=縦の区間個数
		for(j=0;j<WIND_HIGHT/WIDE;j++){

			//いったん全ての区間に芝生を描画
			//WIDEは一区間のサイズなので32
			//iとjは表示させたいマップの横と縦の位置
			//今回のマップの一番左上はi=0,j=0になる
			//またマップの一番右下はi=20,j=15(何故かはGV.hの注釈で)
			//後は計算でどのxy位置に画像が表示されるか指定される
			DrawGraph( i*WIDE , j*WIDE , mapchip_img[0][0] , TRUE);

			//芝生の上に画像を表示する区間の時
			if(map[j][i]!=0)

				//その画像を描画
				DrawGraph( i*WIDE , j*WIDE , mapchip_img[0][ map[j][i] ] , TRUE);
		}
	}
	return ;
}
改めて、動きが一巡り(完成)しているオープンのサンプルコードは、死ぬほどありがたい。
何より、自分の学ぼうとしているプログラム言語で動いている。重要。
かつて言われた、
英語で会話したいなら、英単語を学ぶより「会話自体を学べ」。
いまさらになって、はーんと思えた。
添付ファイル

[拡張子 zip は無効化されているため、表示できません]


コメントはまだありません。