こんにちは。今回も前回まで続きで、RPGを作っていきます。
Title.hの追加
では、早速やっていきましょう。Title.hを新しくつくり、Titleクラスを追加してください。
/* Title.h */
#pragma once
class TITLE
{
public:
void Draw()
{
//影付き
DrawFormatStringToHandle(22, 34, Color.WHITE, Font.MS[50], "Dx\nRPG");
DrawFormatStringToHandle(18, 30, Color.BLUE, Font.MS[50], "Dx\nRPG");
//影付き
DrawFormatStringToHandle(20, 152, Color.RED, Font.Meiryo[16], "Press Enter to Start");
DrawFormatStringToHandle(18, 150, Color.WHITE, Font.Meiryo[16], "Press Enter to Start");
if (Key[KEY_INPUT_RETURN] == 1)
{
Scene = COURCE::WORLD;
}
}
private:
};
TITLE Title;
できました。では、コードの解説を行います。
このDrawFormatStringToHandle関数の描画座標をずらして、2個の同じ文字列を描画することで、影付きの文字を表示することができます。
if (Key[KEY_INPUT_RETURN] == 1)はEnterキーが押されたらという意味です。
Scene = COURCE::STAGE1_1の処理は今は気にしないでください。これから、Main.cppで列挙型で、宣言します。
Sceneの値を変えて別の画面処理に移るということがわかれば大丈夫です。
Main.cppへの追加
では、先ほど作ったMain.cppとTitle.hをつなげていきます。Main.cppの変更点は赤色です。
#define WIN_X (256)
#define WIN_Y (240)
enum COURCE
{
START,
WORLD,
};
int Scene = COURCE::START;
#include <DxLib.h>
#include "Picture.h"
#include "Sub.h"
#include "Title.h"
int WINAPI WinMain(
_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPSTR IpCmdLine,
_In_ int nShowCmd)
{
ChangeWindowMode(TRUE);
DxLib_Init();
/*Window初期化*/
SetWindowText("DRAGON QUEST");
SetGraphMode(WIN_X, WIN_Y, 32);
SetBackgroundColor(255, 255, 255);
SetDrawScreen(DX_SCREEN_BACK);
SetWindowSize(1024, 960);
Picture.Load();
Color.Load();
Font.Load();
while (ScreenFlip() == 0 &&
ClearDrawScreen &&
ProcessMessage() == 0 &&
GetKey() == 0 &&
Key[KEY_INPUT_ESCAPE] == 0
)
{
switch(Scene)
{
case COURCE::START:
Title.Draw();
break;
case COURCE::WORLD:
break;
};
}
DxLib_End();
return 0;
}
変更点が多いですが一個一個考えていきましょう。
まず、enumで列挙体を宣言しています。これは、シーンの入れ替えを簡単に表せるようにしています。
次の変更点のint Sceneには現在のシーンが代入されています。シーンを変えるときは、この変数を使います。
また、Title.hのインクルードも忘れないようにしてください。
メインループ内のswitch文はScene変数を使ったシーンの入れ替えです。
コードの説明はここで終わります。
最後に実行してみると、こうなります。
少し寂しいですね。タイトル画面はあとあと追加するかもしれません。
ステージを描画する
では、タイトル画面ができたところで、ステージ画面を表示していきます。新しくStage.hファイルを作ってください。
#pragma once
/* Stage.h */
class STAGE
{
public:
struct
{
int Type[STAGE_MAX_X][STAGE_MAX_Y];
}Chip;
void Read()
{
FILE* stage;
stage = fopen("CourceFile/WorldMap.txt", "r");
for (int y = 0; y < STAGE_MAX_Y; y++)
{
for (int x = 0; x < STAGE_MAX_X; x++)
{
(void)fscanf(stage, "%d", &Chip.Type[x][y]);
}
}
};
void Draw(int Lateral, int Longitudinal)
{
int pic = 0;
for (int y = 0; y < STAGE_MAX_Y; y++)
{
for (int x = 0; x < STAGE_MAX_X; x++)
{
switch (Chip.Type[x + Lateral][y + Longitudinal])
{
case 0:
pic = Picture.Map[0];
break;
case 1:
pic = Picture.Map[1];
break;
case 2:
pic = Picture.Map[2];
break;
case 3:
pic = Picture.Map[3];
break;
case 4:
pic = Picture.Map[4];
break;
case 5:
pic = Picture.Map[5];
break;
case 6:
pic = Picture.Map[6];
break;
case 7:
pic = Picture.Map[7];
break;
case 8:
pic = Picture.Map[8];
break;
case 9:
pic = Picture.Map[9];
break;
case 10:
pic = Picture.Map[10];
break;
case 11:
pic = Picture.Map[11];
break;
case 12:
pic = Picture.Map[12];
break;
case 13:
pic = Picture.Map[13];
break;
case 14:
pic = Picture.Map[14];
break;
case 15:
pic = Picture.Map[15];
break;
case 16:
pic = Picture.Grace_River[0];
break;
case 17:
pic = Picture.Grace_River[1];
break;
case 18:
pic = Picture.Grace_River[2];
break;
case 19:
pic = Picture.Grace_River[3];
break;
case 20:
pic = Picture.Grace_River2[0];
break;
case 21:
pic = Picture.Grace_River2[1];
break;
case 22:
pic = Picture.Grace_River2[2];
break;
case 23:
pic = Picture.Grace_River2[3];
break;
case 24:
pic = Picture.Fill_Grace[0];
break;
case 25:
pic = Picture.Fill_Grace[1];
break;
case 26:
pic = Picture.Fill_Grace[2];
break;
case 27:
pic = Picture.Fill_Grace[3];
break;
}
DrawGraph(CELL * x , CELL * y, pic, FALSE);
}
};
};
private:
};
STAGE Stage;
CourceFileフォルダを作成し、中にWorldMap.txtファイルを作ります。
fopen関数はファイルを読み込む関数です。
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 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 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 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 1 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 1 1 16 21 21 21 17 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 16 24 3 6 6 25 21 21 21 17 1 1 1 1 16 21 21 17 1 1 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 1 1 20 3 6 6 3 3 3 3 3 25 21 17 1 1 18 22 26 25 17 1 1 1 1 0 0 0 0 0 0 0 0
0 0 0 0 0 1 16 24 3 3 3 3 3 3 3 3 27 22 19 1 1 1 1 20 3 25 21 21 17 1 1 0 0 0 0 0 0 0
0 0 0 0 0 1 20 3 3 3 3 3 3 3 27 22 19 1 1 1 1 1 1 20 3 3 3 3 25 17 1 1 0 0 0 0 0 0
0 0 0 0 1 1 20 3 3 3 3 3 3 3 23 1 1 1 1 1 1 1 1 20 3 3 3 3 3 25 17 1 0 0 0 0 0 0
0 0 0 0 1 16 24 3 3 6 6 3 3 27 23 1 1 1 1 1 1 1 1 20 3 3 7 3 3 3 23 1 0 0 0 0 0 0
0 0 0 1 1 20 3 3 6 6 6 6 6 3 23 1 1 1 1 1 1 1 1 20 3 3 3 3 3 3 23 1 0 0 0 0 0 0
0 0 0 1 16 24 3 6 6 6 2 2 6 3 23 1 1 1 1 1 1 1 16 24 3 3 3 3 27 22 19 1 0 0 0 0 0 0
0 0 0 1 20 3 3 6 6 2 2 6 6 3 23 1 1 1 1 1 1 1 20 3 3 3 3 3 23 1 1 1 0 0 0 0 0 0
0 0 0 1 18 26 3 3 6 6 2 6 6 3 23 1 1 1 1 1 1 16 24 3 3 3 27 22 19 1 0 0 0 0 0 0 0 0
0 0 0 1 1 20 3 3 3 6 6 6 3 3 25 21 21 21 21 21 21 24 3 3 3 3 19 1 1 1 0 0 0 0 0 0 0 0
0 0 0 0 1 18 26 3 3 3 3 3 3 3 3 3 3 6 6 3 3 3 3 3 3 19 1 1 1 0 0 0 0 0 0 0 0 0
0 0 0 0 1 1 18 26 3 3 3 3 3 3 3 3 6 6 2 2 3 3 3 3 23 1 1 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 1 1 18 26 3 3 3 3 3 6 6 6 6 6 3 3 3 3 27 19 1 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 1 20 3 3 3 3 6 6 2 6 6 3 3 27 22 22 19 1 1 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1 18 26 3 3 3 3 6 6 6 3 3 27 19 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1 1 18 26 3 3 3 3 6 3 3 27 19 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 1 1 18 22 22 22 22 22 22 22 19 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 1 1 1 1 1 1 1 1 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 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 1 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 1 16 21 21 21 17 1 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 1 18 26 7 3 25 21 21 17 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 1 1 20 3 3 3 3 3 23 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 1 20 3 3 3 12 3 23 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 1 20 3 3 3 3 3 23 1 1 0 0 0 0 0 0 0
0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 18 22 26 3 3 27 19 1 1 0 0 0 0 0 0 0
0 0 0 1 16 21 21 17 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 18 22 22 19 1 1 0 0 0 0 0 0 0 0
0 0 0 1 20 7 3 25 21 21 21 21 21 21 21 21 21 21 17 1 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0
0 0 0 1 20 3 3 2 2 2 2 2 15 15 15 15 15 15 23 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 18 26 3 3 2 2 2 2 15 15 10 11 15 15 23 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 1 18 3 3 3 3 3 3 15 15 15 15 15 15 23 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 1 20 3 3 3 3 3 3 3 3 3 3 3 23 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 1 18 22 22 22 22 22 22 22 22 22 22 22 19 1 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 1 1 1 1 1 1 1 1 1 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 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 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 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 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
空白を合わせないと38*48のマップファイルです。
今は数字の集まりですが、これをStage.hファイルで読み込むことで、それぞれに対応した画像に変換され表示されます。
Read関数でマップファイルを読み込み、Draw関数で画像に変換され表示されます。
実行するとマップが表示されました。これでステージの描画が完成です。
まとめ
今回は、タイトル画面の作成と、ステージの描画を行いました。
次回は、プレイヤーの表示とマップ当たり判定をやっていきます。
最後まで読んで頂き、ありがとうございました。ツイッターもやっているので確認して見て下さい。
コメント