第6講 ゲーム基礎その2
第4話 ゲームモードの変更
0010
008
解答例
#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, "ゲームクリア"); // 文字を描画する
}
コピペ用添付ファイル


0011
0013
の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話へ

002

初心者のための excel 2016 マクロ VBA 入門講義 基礎から応用まで
vc++ c言語 c++ 入門 初心者 基礎から応用まで
eclipse c++ 入門
魔方陣 数独で学ぶ VBA 入門

数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
本サイトトップへ