第9講 ロールプレイングゲーム風のアクションゲームその2
第4話 壁を建設して通れなくして、凸鍵を地図上に配置してそれをゲットしないとゲームクリアできない設定にする
を実現するコード例
#include "DxLib.h"
void syokika(); //しょきか ゲームの初期状態を設定する社員(関数)
void main(); //ゲームを進行させる社員
void saisyonogamen(); //さいしょのがめん ゲームの初期画面を描く社員(関数)
void make(); //まけ ゲームオーバーを描く社員(関数)
void kachi(); //かち ゲームクリアを描く社員(関数)
void chizusakusei(); //ちずさくせい 地図を作成する社員(関数)
void ugoki(); //うごき キャラクターの動きを制御
int m; //ゲームの状態 0:ゲーム始め 1:ゲーム 2:ゲームオーバー 3:ゲールクリア
int siro; //白色の出席番号収納する箱
int kiiro; //黄色の出席番号を収納する箱
int hai; //灰色の出席番号収納する箱
int haikeigazou, syujinkou, syuten; //はいけいがぞう しゅじんこう しゅうてん 背景画像と主人公とゴールの出席番号を入れる箱
int moujyu; //もうじゅう 猛獣(ハイエナ)の出席番号を収納する箱
int ryu; //りゅう 竜の出席番号を収納する箱
int kabe; //かべ 壁の出席番号を収納する箱
int kagi; //鍵(凸)の出席番号を収納する箱
int hx , hy; //ヒーローの hx:横位置 hy:縦位置
int mx1_houkou; //mx1の方向 猛獣(ハイエナ1)の方向
int my2_houkou; //my2の方向 猛獣(ハイエナ2)の方向
int mx3_houkou; //mx3の方向 猛獣(ハイエナ3)の方向
const int houkougae = -1; //ほうこうがえ 方向チェンジ
int mx1, my1; //猛獣(ハイエナ1)の mx1:横位置 my1:縦位置
int mx2, my2; //猛獣(ハイエナ2)の mx2:横位置 my2:縦位置
int mx3, my3; //猛獣(ハイエナ3)の mx3:横位置 my3:縦位置
int kagiarunasi; //かぎあるなし 1:鍵がある 0:鍵なし
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
ChangeWindowMode(true); //ウィンドウモードの切り替え
SetGraphMode(640, 480, 32); //ウインドウサイズの変更
if (DxLib_Init() == -1)return(-1); // DXライブラリ初期化処理
syokika(); //初期化 ゲームの最初の状態を設定
m = 1; //ゲームの状態 0:ゲーム始め 1:ゲーム 2:ゲームオーバー 3:ゲールクリア
syokika(); //ゲーム初期状態の設定
SetDrawScreen(DX_SCREEN_BACK); //裏画像を描画対象に加える
while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) {
switch (m) { //mはゲームの状態 0:ゲーム始め 1:ゲーム 2:ゲームオーバー 3:ゲールクリア
Case 0:
saisyonogamen(); //さいしょのがめん ゲームの初期画面を描く社員(関数)
break;
Case 1:
main(); //ゲームを進行させる社員(関数)
break;
Case 2:
make(); //まけ ゲームオーバーを描く社員(関数)
break;
Case 3:
kachi(); //かち ゲームクリアを描く社員(関数)
break;
default:
break;
}
}
WaitKey(); // キー入力待ち
DxLib_End(); // DXライブラリ終了処理
return 0;
}
void make() {
SetFontSize(50); //フォントサイズを50に変更
DrawFormatString(20, 100, kiiro, "(>_<)"); // 文字を描画する
DrawFormatString(20, 200, kiiro, "ゲームオーバーです"); // 文字を描画する
DrawFormatString(20, 300, kiiro, "ゲームに再度挑戦する時は"); // 文字を描画する
DrawFormatString(20, 340, kiiro, "Zキーを押してください。"); // 文字を描画する
if (CheckHitKey(KEY_INPUT_Z) != 0) {
syokika();
m = 1;
}
}
void kachi() {
SetFontSize(50); //フォントサイズを50に変更
DrawFormatString(20, 100, kiiro, "ヾ(^v^)k"); // 文字を描画する
DrawFormatString(20, 200, kiiro, "ゲームクリアです"); // 文字を描画する
DrawFormatString(20, 300, kiiro, "ゲームに再度挑戦する時は"); // 文字を描画する
DrawFormatString(20, 345, kiiro, "Zキーを押してください。"); // 文字を描画する
if (CheckHitKey(KEY_INPUT_Z) != 0) {
syokika();
m = 1;
}
}
void main() {
chizusakusei(); //地図作製
ugoki(); //うごき キャラクターの動きを制御
}
void chizusakusei() {
int i, j;
haikeigazou = LoadGraph("画像/b00.png"); //背景画像の出席番号を収納
for (i = 0; i < 12; i++) {
for (j = 0; j < 16; j++) {
DrawGraph(35 * j, 35 * i, haikeigazou, false);
}
}
DeleteGraph(haikeigazou);
DrawBox(40, 40, 600, 80, hai, true); //1本目の道路を描く
DrawBox(280, 80, 320, 120, hai, true); //1本目の途中にあるくぼみを描く
DrawBox(560, 80, 600, 440, hai, true); //2本目の道路を描く
DrawBox(520, 200, 560, 240, hai, true); //2本目の途中にあるくぼみを描く
DrawBox(40, 400, 600, 440, hai, true); //3本目の道路を描く
DrawBox(340, 360, 380, 400, hai, true); //3本目の途中にあるくぼみを描く
DrawBox(40, 120, 80, 400, hai, true); //4本目の道路を描く
DrawBox(80, 300, 300, 340, hai, true); //5本目の道路を描く
DrawBox(80, 200, 460, 240, hai, true); //6本目の道路を描く
DrawBox(80, 120, 460, 160, hai, true); //7本目の道路を描く
syuten = LoadGraph("画像/g00.png"); //ゴール(鍵凹)の出席番号を収納
DrawGraph(270, 300, syuten, true); //ゴール(鍵凹)を描く
DeleteGraph(syuten); //凹鍵のハンドルを削除
kabe = LoadGraph("画像/kb00.png"); //かべ 壁の出席番号を収納
DrawGraph(28, 250, kabe, true); //壁を描く
DeleteGraph(kabe); //壁のハンドルを削除
if (kagiarunasi == 1) {
kagi = LoadGraph("画像/k00.png"); //かぎ 鍵(凸)の出席番号を収納
DrawGraph(430, 210, kagi, true); //鍵(凸)を描く
}
ryu = LoadGraph("画像/r01.png"); //りゅう 竜の出席番号を収納
DrawGraph(40, 120, ryu, true); //竜を描く
DeleteGraph(ryu); //竜のハンドルを削除
}
void ugoki() {
syujinkou = LoadGraph("画像/h00.png"); //主人公の出席番号を収納
//1本目の道路内に動きを限定
if (CheckHitKey(KEY_INPUT_RIGHT) != 0 && hx <= 560 && hy >= 32 && hy <= 53) hx += 4;
if (CheckHitKey(KEY_INPUT_LEFT) != 0 && hx >= 40 && hy >= 32 && hy <= 48) hx -= 4;
//1本目の道路の途中にあるくぼみには入れるようにする
if (CheckHitKey(KEY_INPUT_DOWN) != 0 && hx >= 280 && hx <= 293 && hy >= 40 && hy <= 126) hy += 4;
if (CheckHitKey(KEY_INPUT_UP) != 0 && hx >= 280 && hx <= 293 && hy >= 44 && hy <= 130) hy -= 4;
//2本目の道路内に動きを限定
if (CheckHitKey(KEY_INPUT_DOWN) != 0 && hx >= 560 && hx <= 573 && hy >= 40 && hy <= 406) hy += 4;
if (CheckHitKey(KEY_INPUT_UP) != 0 && hx >= 560 && hx <= 573 && hy >= 44 && hy <= 410) hy -= 4;
//2本目の道路の途中にあるくぼみには入れるようにする
if (CheckHitKey(KEY_INPUT_LEFT) != 0 && hx >= 524 && hx <= 573 && hy >= 180 && hy <= 210) hx -= 4;
if (CheckHitKey(KEY_INPUT_RIGHT) != 0 && hx >= 520 && hx <= 569 && hy >= 180 && hy <= 210) hx += 4;
//3本目の道路内に動きを限定
if (CheckHitKey(KEY_INPUT_LEFT) != 0 && hx >= 44 && hx <= 573 && hy >= 390 && hy <= 420) hx -= 4;
if (CheckHitKey(KEY_INPUT_RIGHT) != 0 && hx >= 40 && hx <= 569 && hy >= 390 && hy <= 420) hx += 4;
//3本目の道路の途中にあるくぼみには入れるようにする
if (CheckHitKey(KEY_INPUT_DOWN) != 0 && hx >= 340 && hx <= 363 && hy >= 360 && hy <= 406) hy += 4;
if (CheckHitKey(KEY_INPUT_UP) != 0 && hx >= 340 && hx <= 363 && hy >= 364 && hy <= 410) hy -= 4;
//4本目の道路内に動きを限定
if (CheckHitKey(KEY_INPUT_DOWN) != 0 && hx >= 40 && hx <= 50 && hy >= 115 && hy <= 236) hy += 4;
if (CheckHitKey(KEY_INPUT_UP) != 0 && hx >= 40 && hx <= 50 && hy >= 119 && hy <= 240) hy -= 4;
if (CheckHitKey(KEY_INPUT_DOWN) != 0 && hx >= 40 && hx <= 50 && hy >= 290 && hy <= 420) hy += 4;
if (CheckHitKey(KEY_INPUT_UP) != 0 && hx >= 40 && hx <= 50 && hy >= 294 && hy <= 424) hy -= 4;
//5本目の道路内に動きを限定
if (CheckHitKey(KEY_INPUT_LEFT) != 0 && hx >= 44 && hx <= 273 && hy >= 280 && hy <= 310) hx -= 4;
if (CheckHitKey(KEY_INPUT_RIGHT) != 0 && hx >= 40 && hx <= 269 && hy >= 280 && hy <= 310) hx += 4;
//6本目の道路内に動きを限定
if (CheckHitKey(KEY_INPUT_LEFT) != 0 && hy >= 190 && hy <= 210 && hx >= 44 && hx <= 436) hx -= 4;
if (CheckHitKey(KEY_INPUT_RIGHT) != 0 && hy >= 190 && hy <= 210 && hx <= 432) hx += 4;
//7本目の道路内に動きを限定
if (CheckHitKey(KEY_INPUT_LEFT) != 0 && hx >= 44 && hx <= 433 && hy >= 120 && hy <= 130) hx -= 4;
if (CheckHitKey(KEY_INPUT_RIGHT) != 0 && hx >= 40 && hx <= 429 && hy >= 120 && hy <= 130) hx += 4;
if (hx >= 430 && hx <= 440 && hy >= 200 && hy <= 210)kagiarunasi = 0; //鍵を拾う
if (hx >= 265 && hx <= 275 && hy >=280 && hy <= 310) { //ゲームクリア
m = 3;
return;
}
DrawGraph(hx, hy, syujinkou, true); //ヒーローの hx:横位置 hy:縦位置
DeleteGraph(syujinkou); //ヒーローを描く
moujyu = LoadGraph("画像/m00.png"); //もうじゅう ハイエナの出席番号を収納
if (mx1 == 100)mx1_houkou *= houkougae;
if (mx1 == 500)mx1_houkou *= houkougae;
mx1 += 2 * mx1_houkou;
if (hy >= my1 - 8 && hy <= my1 + 8 && hx >= mx1 - 8 && hx <= mx1 + 8) {
m = 2;
return;
}
DrawGraph(mx2, my2, moujyu, true); //ハイエナ2の mx2:横位置 my2:縦位置
if (my2 == 100)my2_houkou *= houkougae;
if (my2 == 360)my2_houkou *= houkougae;
my2 += 2 * my2_houkou;
if (hy >= my2 - 8 && hy <= my2 + 8 && hx >= mx2 - 8 && hx <= mx2 + 6) {
m = 2;
return;
}
DrawGraph(mx3, my3, moujyu, true); //ハイエナ3の mx3:横位置 my3:縦位置
if (mx3 == 120)mx3_houkou *= houkougae;
if (mx3 == 500)mx3_houkou *= houkougae;
mx3 += 2 * mx3_houkou;
if (hy >= my3 - 8 && hy <= my3 + 8 && hx >= mx3 - 8 && hx <= mx3 + 6) {
m = 2;
return;
}
DrawGraph(mx1, my1, moujyu, true); //ハイエナ1の mx1:横位置 my1:縦位置
DeleteGraph(moujyu); //ハイエナのハンドルを削除
}
void saisyonogamen() {
SetFontSize(36); //フォントサイズを36に変更
DrawFormatString(0, 100, kiiro, "ゲームを始めるにはZキー"); // 文字を描画する
DrawFormatString(0, 140, kiiro, "を押してください。"); // 文字を描画する
if (CheckHitKey(KEY_INPUT_Z) != 0) m = 1;
}
void syokika() {
siro = GetColor(255, 255, 255); //白色に出席番号を割り振りその番号を箱siroに収納
hai = GetColor(220, 220, 220); //灰色に出席番号を割り振りその番号を箱kiiroに収納
kiiro = GetColor(255, 255, 0); //黄色に出席番号を割り振りその番号を箱kiiroに収納
hx = 40, hy = 42; //ヒーローの hx:横位置 hy:縦位置
mx1 = 480, my1 = 48; //猛獣(ハイエナ1)の mx1:横位置 my1:縦位置
mx1_houkou = -1; //猛獣(ハイエナ1)の最初の方向
my2_houkou = 1; //猛獣(ハイエナ2)の最初の方向
mx2 = 560, my2 = 140; //猛獣(ハイエナ2)の mx2:横位置 my2:縦位置
mx3 = 200, my3 = 408; //猛獣(ハイエナ3)の mx3:横位置 my3:縦位置
mx3_houkou = 1; //猛獣(ハイエナ3)の最初の方向
kagiarunasi = 1; //地図上に鍵がある状態にしている。
}
コピペ用添付ファイル
次の課題は、竜が炎を吐くようにすることです。
時間によって、炎は0個から4個なります。
ただし、0個→1個→2個→3個→4個→0個→・・・・
を繰り返すものとします。
これを実現するためにグローバル変数
int hajimenojikoku; //始めの時刻を収納する箱
int genjikoku; //現在の時刻を収納する箱
を用意します。
現在の時刻は、
hajimenojikoku = GetNowCount(); //はじめの時刻を箱hajimenojikokuに収納
でゲットできます。
これは単位ミリ秒の整数です。
秒にするには1000で割ります。
while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) {
の直前ではじめの時刻をゲットして、
chizusakusei()で現時刻を取得して、
両者の差を利用して、for文にて実現してください。
ヒントは%を使用するということです。
つまり、余りを求めれば、
0個→1個→2個→3個→4個→0個→・・・・が実現できます。
第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 入門 サイト 基礎から応用まで
本サイトトップ