第6講 ゲーム基礎その2
第4話 ゲームモードの変更
解答例
#include "DxLib.h"
void hajimennogamen(); //ゲームの最初の画面を担当する社員
void gamemain(); //ゲーム画面を担当する社員
void make(); //ゲームオーバー画面を担当する社員
void kachi(); //ゲームクリア画面を担当する社員
char m; //ゲームモードを決定する整数 0:ゲームの最初の画面 1:ゲーム画面 2:ゲームオーバー 3:ゲームクリア画面
int x=100,y=100; //整数型の箱xとyを用意
int h ; //画像に付けられた出席番号を収納する箱を用意
int siro = GetColor(255, 255, 255); //白色の出席番号収納する箱
int kiiro = GetColor(255, 255, 0); //黄色の出席番号収納する箱
int mizuiro = GetColor(0, 255, 255); //水色の出席番号を収納する箱
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
ChangeWindowMode(true); //ウィンドウモードの切り替え
SetGraphMode(800, 600, 32); //ウインドウサイズの変更
if (DxLib_Init() == -1)return(-1); // DXライブラリ初期化処理
SetDrawScreen(DX_SCREEN_BACK); //裏画像を描画対象に加える(2017/06/28追加) 画面のちらつき対策
m=0;
while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) {
if(m==0)hajimennogamen();
if(m==1)gamemain();
if(m==2)make();
if(m==3)kachi();
}
WaitKey(); // キー入力待ち
DxLib_End(); // DXライブラリ終了処理
return 0;
}
void hajimennogamen(){ //ゲームの最初の画面
SetFontSize(32); //フォントサイズを32に変更
DrawFormatString(200, 100,siro, "メニュー画面"); // 文字を描画する
DrawFormatString(0, 200,siro, "ゲームを始めるにはエンターキーを押して下さい。"); // 文字を描画する
if (CheckHitKey(KEY_INPUT_RETURN) != 0) m=1;
}
void gamemain(){ //ゲーム画面
h = LoadGraph("画像/00.png"); //画像に付けられた出席番号を箱hに収納
DrawGraph(x, y, h, true); //画像を描く
if (CheckHitKey(KEY_INPUT_RIGHT) != 0) x+=2;
if (CheckHitKey(KEY_INPUT_LEFT) != 0)x-=2;
if (CheckHitKey(KEY_INPUT_DOWN) != 0)y+=2;
if (CheckHitKey(KEY_INPUT_UP) != 0)y-=2;
}
void make(){ //ゲームオーバー画面
SetFontSize(32); //フォントサイズを32に変更
DrawFormatString(200, 100,kiiro, "ゲームオーバー"); // 文字を描画する
}
void kachi(){ //ゲームクリア画面
SetFontSize(32); //フォントサイズを32に変更
DrawFormatString(200, 100,mizuiro, "ゲームクリア"); // 文字を描画する
}
コピペ用添付ファイル
の2つの画面を試写は、
m=0;
を
m=2;
m=3;
とすればできます。
ところで、ゲームオーバーとゲームクリアの条件はゲーム開発で考えるにしても、
とりあえず、コードをいじらずにエンターキーを押すたびに4つの画面が切り替わるように、
void gamemain(){ //ゲーム画面
h = LoadGraph("画像/00.png"); //画像に付けられた出席番号を箱hに収納
DrawGraph(x, y, h, true); //画像を描く
if (CheckHitKey(KEY_INPUT_RIGHT) != 0) x+=2;
if (CheckHitKey(KEY_INPUT_LEFT) != 0)x-=2;
if (CheckHitKey(KEY_INPUT_DOWN) != 0)y+=2;
if (CheckHitKey(KEY_INPUT_UP) != 0)y-=2;
if (CheckHitKey(KEY_INPUT_RETURN) != 0) m=2;
}
void make(){ //ゲームオーバー画面
SetFontSize(32); //フォントサイズを32に変更
DrawFormatString(200, 100,kiiro, "ゲームオーバー"); // 文字を描画する
if (CheckHitKey(KEY_INPUT_RETURN) != 0) m=3;
}
void kachi(){ //ゲームクリア画面
SetFontSize(32); //フォントサイズを32に変更
DrawFormatString(200, 100,mizuiro, "ゲームクリア"); // 文字を描画する
if (CheckHitKey(KEY_INPUT_RETURN) != 0) m=0;
}
とすれば良さそうですが、
エンターキーを押すと、それぞれの画面が一瞬だけ出て、
はじめの画面に戻ったり、他の画面が出たりします。
これはどうしてかというと、
CheckHitKey(KEY_INPUT_*)は、*を押して離したときのみに、
0以外の値を返すのではなく、
押している間ずっと0以外の値を返し続けます。
人間にとっては一瞬でも、
1秒で60フレーム回転するゲームでは、
非常に長い時間です。
ですから、
if (CheckHitKey(KEY_INPUT_RETURN) != 0) m=1;
if (CheckHitKey(KEY_INPUT_RETURN) != 0) m=2;
if (CheckHitKey(KEY_INPUT_RETURN) != 0) m=3;
if (CheckHitKey(KEY_INPUT_RETURN) != 0) m=0;
が連続して起きて奇妙な現象が生じます。
残念ながらキーを押して離したときのみキーを押したと判断する関数(社員)はありませんので、
これは自作する必要があります。
この関数の自作が第5話以降の課題となります。
第3話へ 第5話へ
初心者のための excel 2016 マクロ VBA 入門講義 基礎から応用まで
vc++ c言語 c++ 入門 初心者 基礎から応用まで
eclipse c++ 入門
魔方陣 数独で学ぶ VBA 入門
数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
本サイトトップへ