私は今、STGを制作しています。 龍神録をだいぶ参考にさせていただいています。
しかし、龍神録にまだ書かれていない内容について、いまかなり困っています。
それは、ボムの回数制限とゲームオーバーorクリアのプログラムです。
いろんなサイトを参考にしているんですが、いまいちプログラムの入れ方がわかりません。
宣言によって、入れる場所が変わるのでなかなかです。
// ------------------------------------------------
// デファインの宣言
// ------------------------------------------------
#define MODE_GAME 0 // ゲーム中
#define MODE_OVER 1 // ゲームオーバー
#define MODE_TITLE 2 // タイトル
(中略)
// ------------------------------------------------
// 関数(サブルーチン)の宣言
// ------------------------------------------------
void title_main();
(中略)
// ------------------------------------------------
// メインプログラム
// ------------------------------------------------
// この関数名はウィンドウズから呼ばれているので変えないでください
void game_loop(void)
{
switch(game_mode)
{
case MODE_GAME:
ship_move();
tama_get();
tama_move();
teki_get();
teki_move();
tama_hit();
ship_hit();
break;
case MODE_OVER:
over_main();
break;
case MODE_TITLE:
title_main();
break;
}
normal_pr();
flip_screen();
}
// ゲームモードによって分岐
// ゲーム中ならば
// ゲームオーバーならば
// ゲームオーバー処理
// タイトルならば
// タイトル処理
// ------------------------------------------------
// 基本の表示
// ------------------------------------------------
void normal_pr()
{
(中略)
// メッセージを書く
if (game_mode==MODE_TITLE)
{
pr_msg("STGサンプル、タイトル画面",200,200);
pr_msg("Hit Enter Key",240,200);
}
}
// ------------------------------------------------
// タイトル
// ------------------------------------------------
void title_main()
{
if (HIBYTE(GetKeyState(VK_RETURN)))
{
game_mode=MODE_GAME;
}
}
// エンターキーが押されたらば
// ゲームモードをゲーム中にする
どのようにすればいいですか?
お願いします。
どのようにすればいいですか
Re:どのようにすればいいですか
関数名なども書き換えられてるみたいなので、内部構造も多少変わってるのかもしれませんが
龍神録をかなり参考にされてるらしいので、(龍神録用語(仕様)を使って書きます。)
多分かなり理解されてると思うので、それは分かってるとか言われそうですが・・・
たとえば、龍神録でいうGV.hに
GLOBAL int life; //残機カウント
GLOBAL int bom; //ボムカウント
と宣言しておきます。
ini_first()で
任意に初期値を設定しておきます。
ボムは[Xキー]が押された時をifで判断し発動しますよね。
なので[Xキー]の押された回数をカウントし(例えば)初期値4→減算などして、使用回数を制限するなりすれば良いと思います。
その後ボムカウントが0ならXキーを無効化してあげればボムは使えなくなります。
残機カウントも初期値を(例えば)4程度にしておき、(当り判定部の)被弾をカウントし、0になったらゲームオーバー画面に飛ばす処理を入れておけば良いはずです。
・・・・こんな感じで良いのでしょうか。
どこに処理を入れれば良いのか。
ボム→ボム発動時を判断する処理内
ゲームオーバー→自機当り判定内
ってな感じで良いと思います。
龍神録をかなり参考にされてるらしいので、(龍神録用語(仕様)を使って書きます。)
多分かなり理解されてると思うので、それは分かってるとか言われそうですが・・・
たとえば、龍神録でいうGV.hに
GLOBAL int life; //残機カウント
GLOBAL int bom; //ボムカウント
と宣言しておきます。
ini_first()で
任意に初期値を設定しておきます。
ボムは[Xキー]が押された時をifで判断し発動しますよね。
なので[Xキー]の押された回数をカウントし(例えば)初期値4→減算などして、使用回数を制限するなりすれば良いと思います。
その後ボムカウントが0ならXキーを無効化してあげればボムは使えなくなります。
残機カウントも初期値を(例えば)4程度にしておき、(当り判定部の)被弾をカウントし、0になったらゲームオーバー画面に飛ばす処理を入れておけば良いはずです。
・・・・こんな感じで良いのでしょうか。
どこに処理を入れれば良いのか。
ボム→ボム発動時を判断する処理内
ゲームオーバー→自機当り判定内
ってな感じで良いと思います。
Re:どのようにすればいいですか
life,bomにかかわる変数はch_tの中に入れてしまうとすっきりするかもしれません。
また、もし東方や龍神録のような喰らいボムを実装されている場合は、被弾しただけで残機を減らさないよう注意して下さい。
ゲームオーバーになってまたゲームを再開するときは初期化関数を呼んでまたゲームを始めればオッケーです。
初期化漏れはバグの元なので、くれぐれも初期化には気をつけて下さい。
全部構造体にまとめてしまえば初期化漏れのリスクも軽減されます。
また、もし東方や龍神録のような喰らいボムを実装されている場合は、被弾しただけで残機を減らさないよう注意して下さい。
ゲームオーバーになってまたゲームを再開するときは初期化関数を呼んでまたゲームを始めればオッケーです。
初期化漏れはバグの元なので、くれぐれも初期化には気をつけて下さい。
全部構造体にまとめてしまえば初期化漏れのリスクも軽減されます。