複数面のつなげ方

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
yu

複数面のつなげ方

#1

投稿記事 by yu » 16年前

ここのサイトのプロジェクトを参考にしてシューティングゲームを作っています。
複数ステージを作り、ステージ1をクリアしたらステージ2へ…というようにステージを繋げて遊べるようにしたいです。
どのようにすればできるでしょうか。

アドバイスお願いします。

ひよこ

Re:複数面のつなげ方

#2

投稿記事 by ひよこ » 16年前

かんたんな考え方ですけど
参考になるでしょうか・・・・

まずステージを表す数を作り
スイッチ文で
stage[/url]

ケース0
初期化

ケース1
stage[0]だったら1面へ
stage[2]だったら2面へ

ケース2 1面
ラスボスが倒されたら
stage[/url]の中身を増やしケース1へ
って感じでいいんでしょうかね。

yu

Re:複数面のつなげ方1

#3

投稿記事 by yu » 16年前

アドバイスありがとうございますm(__)m
その方法でやってみようと思います。

この場合、各ステージの道中やボスの分岐はどのようにすればいいのでしょうか?

ひよこ

Re:複数面のつなげ方1

#4

投稿記事 by ひよこ » 16年前

こういうのでよろしいのでしょうかね・・・
ケース0
最低限の初期化

ケース1
stage[0]だったら1面へ
stage[2]だったら2面へ

ケース2 
1面の内容(敵のデータ、音楽など)をロード
ケース3
1面
ラスボスが倒されたら
ケース2のデータを削除
stage[/url]の中身を増やしケース1へ

ケース4 
2面の内容(敵のデータ、音楽など)をロード
ケース5
2面
ラスボスが倒されたら
ケース2のデータを削除
stage[/url]の中身を増やしケース1へ

繰り返し

自分にはこれしか思いつきませんね。

ひよこ

Re:複数面のつなげ方1

#5

投稿記事 by ひよこ » 16年前

なんかプログラムが変でした。
まちがい

ケース1
stage[0]だったら1面へ
stage[2]だったら2面へ

修正後

ケース1
stage[0]だったら1面へ
stage[1]だったら2面へ

あくまで参考に・・・してください。

yu

Re:複数面のつなげ方1

#6

投稿記事 by yu » 16年前

実装してみたいと思います。

ありがとうございました!

ひよこ

Re:複数面のつなげ方1

#7

投稿記事 by ひよこ » 16年前

シューティングゲームができるの楽しみに待ってます。

yu

Re:複数面のつなげ方1

#8

投稿記事 by yu » 16年前

同じ名前の方がw

自分は一つ一つケースで分けるのではなくて
ステージに番号を付けて処理しました。
後はその番号に合わせて画像や敵情報をロードしました。

しかし、自分のやりやすい方法で良いと思います。


後、ひよこさんに対してですが、
stageは配列じゃなくてもいいんじゃないでしょうか?

stage++;

で大丈夫だと思います。

ステージを 0→1→4→2
のように繋げるのならそちらのほうで良いと思いますが

#追記
#配列なんてどこにも書いてありませんでした・・・
#勝手なこと言ってすみません;

yu

Re:複数面のつなげ方11

#9

投稿記事 by yu » 16年前

質問させていただいた方のyuです。
名前同じでしたね(笑

獲得ポイントや精進状態が共有されてしまっているようなのですが、名前を変えた方がいいでしょうかf^_^;


さて
回答ありがとうございます。
ステージ自体の分岐のさせかたは分かりましたが、具体的なステージの内容の分岐について分からない所が出てしまったので質問させてください。
データを読み込む系(BGMや道中のcsvデータ)の分岐は、多分、ステージごとに、読み込むファイルの種類を変えてやればいいのかなと思います。
しかし、ボス関連のデータの分岐がわかりません。
(一面ではこのボスがでてきてこんな攻撃をしてくる。二面ではこのボスが出てきてこんな攻撃をしてくる。…というような分岐です)
boss_shot.cppで処理をすればいいのでしょうか。

BEMANI

Re:複数面のつなげ方1

#10

投稿記事 by BEMANI » 16年前

>>親記事のyuさん

>ボス関連のデータの分岐がわかりません
BGM等のデータが分岐できるのであれば考え方は同じだと思います。
例えば・・・

1面:1面ボスの情報、攻撃パターン関数1, 2, 3, 4・・・
2面:2面ボスの情報、攻撃パターン関数1, 2, 3, 4・・・
3面:3面ボスの情報、攻撃パターン関数1, 2, 3, 4・・・

このようにステージ毎に完全に分けて実装するという手段があります。
似たような攻撃で関数を二つ作るのはどうかな~と感じた時は
引数で変えれるように実装したりするといいと思います。

>boss_shot.cppで処理をすればいいのでしょうか
boss_shot.cppで全て処理する必要はないです。
必要であれば、yuさんがファイルを追加しても構いません。(Stage1_Boss.cpp・Stage2_Boss.cpp等)

yu

Re:複数面のつなげ方1

#11

投稿記事 by yu » 16年前

回答ありがとうございます。
ファイルを増やす方法でいってみようと思います。

yrao

Re:複数面のつなげ方1

#12

投稿記事 by yrao » 16年前

質問者の方のyuです
名前が被ってしまっていたので変えました。



データの読み込みについて質問です。

例えば、load.cpp内に
load.cpp()
…ゲームボードや弾画像など、全ステージ共通のデータの読み込み
load_stage_1()
…一面で使うBGMや敵のドット絵の読み込み
load_stage_2()
…二面で使うBGMなどの読み込み

を作り、main.cppで

case0 :
load();



case99 ://一面初期化
load_stage_1();


case100 ://一面開始




case199 ://二面初期化
load_stage_2();


case200 ://二面開始




…としていく場合に、一面が終わった時、load()はそのままにしてload_stage_1()の読み込みを消し、load_stage_2を読み込みたいのですがどうすればよいでしょうか。

Dixq (管理人)

Re:複数面のつなげ方1

#13

投稿記事 by Dixq (管理人) » 16年前

私もyuさんと同じく、caseで分けるのではなく、ステージに番号を付けて、その番号に合わせてデータをロードするようにしています。

龍神録は通常5面+EXステージ+ファンタズムステージなんですが、
計算上EXは6面、ファンタズムは7面という考え方でした。

敵の出現データやHP、その他諸々の情報が書かれている
1面の情報を持った
1.dat
というファイル、
2面の情報を持った
2.dat
というファイル、、、
このように作っておけば現在のステージ数を表すStageという変数があったならば

sprintf(FileName, "%d.dat", Stage);
fopen(FileName, "rb");
fread....

といった処理が出来て便利では無いかと思います。

基本的に「何か特別な変数を沢山用意する」とか「様々な新しい考え方を取り入れないと
複数ステージが作れない」とかってことは無いと思います。
データのロードが個別に行えたのなら、今まで使っていた
敵の出現情報であったりする部分に今まで通り代入すればいいだけです。

ただ、ゲームに関わるデータを変数宣言と同時に格納している部分があればそれを
ファイルからロード出来るように変更して下さい。
そうすることで、色々な変数が使いまわせます。

後、違うとするならば、ini関数で初期化する時に全部初期化しないように気をつけること位でしょうか。
例えば、ゲームの仕様にもよりますが、自機の残機数データやスコアデータ、現在のステージ数のデータなんかまで一緒に
初期化してしまうと最初の状態戻ってしまいます。

その辺気をつけたら大丈夫だと思います。


>>一面が終わった時、load()はそのままにしてload_stage_1()の読み込みを消し、load_stage_2を読み込みたいのですがどうすればよいでしょうか。

load_stage_1で読み込んだデータを消去する関数
delete_stage_1なるものを用意し、load_stage_2が呼ばれる前に呼んでやればいかがでしょうか?

yrao

Re:複数面のつなげ方111

#14

投稿記事 by yrao » 16年前

ありがとうございますm(__)m

難しいですね…
このサイトで初めてプログラミングに触れたもので、基本的な所が分からなかったりするんです;

最後の、『読み込んだデータを削除する関数』について詳しく教えていただけませんでしょうか。

Dixq (管理人)

Re:複数面のつなげ方11

#15

投稿記事 by Dixq (管理人) » 16年前

難しいことではないですよ。

例えばImageAという名前の変数にAという画像をロードしたとしましょう。
ロード関数では

ImageA = LoadGraph(A);

とロードしているかもしれません。ならば消去する時は

DeleteGraph(ImageA);

で消せますよね。
ですからもし仮にload_stage_1で

ImageA = LoadGraph(A);
ImageB = LoadGraph(B);
ImageC = LoadGraph(C);

してるならdelete_stage_1内で

DeleteGraph(ImageA);
DeleteGraph(ImageB);
DeleteGraph(ImageC);

すればいいというただそれだけのことです。

yrao

Re:複数面のつなげ方1

#16

投稿記事 by yrao » 16年前

ありがとうございます、助かりました<(__)>

yrao

Re:複数面のつなげ方1

#17

投稿記事 by yrao » 16年前

先程教えてもらったデータの削除ですが、csvデータの読み込みをしているload_story()の場合はどのようにすればいいでしょうか。画像の読み込み、削除と同じようにできますか?

閉鎖

“C言語何でも質問掲示板” へ戻る