第9講 ロールプレイングゲーム風のアクションゲームその2
第6話 竜に炎を吐かせるコードの解説
コード主要部分再掲
genjikoku = GetNowCount(); //現時刻を箱genjikokuに収納
hono = LoadGraph("画像/ho00.png"); //炎の出席番号を収納
int kosu = ((genjikoku - hajimenojikoku) / 1000) % 5; //現時刻と最初の時刻の差を利用して炎の個数を算出
for (int i = 0; i < kosu; i++) {
DrawGraph(70 + 30 * i, 120, hono, true); //ゴール(鍵凹)を描く
//ゲームオーバーであるかを判定し、ゲームオーバーの場合ゲームオーバーの画面を出す
if (hx >= 65 + 30 * i && hx <= 75 + 30 * i && hy >= 110 && hy <= 130) {
m = 2;
return;
}
}
解説
genjikoku - hajimenojikokuは現在時刻とゲームを始めたときの時刻との
時刻差を計算しています。
/ 1000はミリ秒を秒に換算するためのものです。
ゲームを始めたときの時刻が12時35分20.589秒で、
今の時刻が12時35分23.676秒であるなら、
genjikoku - hajimenojikoku=23676-20589=3087ミリ秒です。
(genjikoku - hajimenojikoku) / 1000によって秒単位に換算され、
小数部分が切り捨てられますから、
(genjikoku - hajimenojikoku) / 1000=3秒となります。
小数部分が切り捨てられる理由は、genjikokuもhajimenojikokuも整数型変数であるからです。
(genjikoku - hajimenojikoku) / 1000は時刻の経過に従って、
0,1,2,4,5,6,7,8,9,10,・・・と動いていきます。
それを ((genjikoku - hajimenojikoku) / 1000) % 5によって5で割った余りにすると、
0,1,2,3,4,0,1,2,3,4,0,1,2,・・・となります。
これが整数を入れる箱kosuに入れられます。
kosu=0のときは、
for (int i = 0; i < kosu; i++) {
・・・・
}
は
for (int i = 0; i < 0; i++) {
・・・・
}
となりますが、iが0のときに条件を満たしていませんので、
if文の{}内は実行されません。
つまり、0秒から1秒の間は火は吐かれません。
経過時間が1から2秒の間の時は、
kosu=1となります。
ですから、
for (int i = 0; i < kosu; i++) {
・・・・
}
は
for (int i = 0; i < 1; i++) {
・・・・
}
となり、if文の{}内が1回だけ実行されて炎が1つ吐かれた状態になります。
同様に、 経過時間が1から2秒の間の時は、
kosu=2となります。
ですから、
for (int i = 0; i < kosu; i++) {
・・・・
}
は
for (int i = 0; i < 2; i++) {
・・・・
}
となり、if文の{}内が2回実行されて炎が2つ吐かれた状態になります。
経過時間が3から4秒の間の時は、
kosu=3となります。
ですから、
for (int i = 0; i < kosu; i++) {
・・・・
}
は
for (int i = 0; i < 3; i++) {
・・・・
}
となり、if文の{}内が3回実行されて炎が3つ吐かれた状態になります。
経過時間が4から5秒の間の時は、
kosu=4となります。
ですから、
for (int i = 0; i < kosu; i++) {
・・・・
}
は
for (int i = 0; i < 4; i++) {
・・・・
}
となり、if文の{}内が4回実行されて炎が4つ吐かれた状態になります。
経過時間が5〜6秒の時は、kosu=0になりますので、
炎の個数が
0個→1個→2個→3個→0個→1個→2個→3個→0個→・・・
ゲームが続いている間は繰り返されるのです。
変わるタイミングは1秒ごとです。
もしゲームの難易度を変えたければ、
((genjikoku - hajimenojikoku) / 1000) % 5
の1000の部分を変えればよいのです。
例えば、500とすれば、
0個→1個→2個→3個→0個→1個→2個→3個→0個→・・・
が切り替わる時間は0.5秒となります。
速さを2倍にするには、1000を1/2倍にするのか2倍にするのか、
迷うと思いますが、わからないときは試してみればよいのです。
コード(ソース)を少しつけ加えては、デバッグする習慣を身につけてください。
さて、第7話の課題を出しましょう。
第7講の最後の話(第10話)で、ゲームの最初の画面で、
ゲームのモード(難易度)選べるようにしたのと同様に、
ロールプレイングゲーム風アクションパズルも難易度を設定できるようにしましょう。
そのためには、炎の出るタイミングやハイエナの速さなどを、
具体的な数字ではなく、グローバル変数にする必要があります。
また、ゲーム初期画面、ゲームオーバー画面、ゲームクリア画面も
作り直してください。
そして、ブロック崩しの時と同じようにAもBもCも押し忘れて、
Zを押してゲームを始めてしまった場合には、
初級(A)の設定になるようにしてください。
第5話へ 第7話へ
初心者のための excel 2016 マクロ VBA 入門講義 基礎から応用まで
vc++ c言語 c++ 入門 初心者 基礎から応用まで
eclipse c++ 入門
魔方陣 数独で学ぶ VBA 入門
数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための]世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
本サイトトップ