• ベストアンサー

シューティングゲームのタスクシステム

ゲームを作っているプログラミング初心者です。 C言語とDXライブラリを使ってシューティングゲームを作っているのですが、敵の消滅でバグがおきています。 どこがおかしいのかが全く分からないのですが、どこがおかしいのでしょうか・・・? ↓ソースだけアップしてあります。 http://kaede.zzkt.com/shootsouece/index.html ↓は圧縮ファイルのパスです。画像などの素材も入ってます。 http://kaede.zzkt.com/program/shootinggame.lzh どなたかよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

 まず、直さなければいけないのは、配列周りです。  配列は int t[100]と宣言したら、t[0]~t[99]までが有効になります。  コードを拝見すると、1~100のようにアクセスしているようです。  例えば、bulletは 200の要素数ですが、for文で 1~200まででアクセスしています。  これを全箇所修正して下さい(タスクの next/prev周りが指すインデックスも)。  まずこれらを正常にしないと他に問題があっても気付きにくいかと思います。 >なぜか、enemy構造体のthistcb変数の中に何故か200が代入される現象も発見しました。 >変数名変えたほうがいいでしょうか・・・?  変数名を変えても問題は解決しないと思いますが、 thistcbは自分のインデックス番号かなにかでしょうか?  使われている形跡がないのでthistcbの役割がよくわからず、 何が正しいのかちょっとわからないです。  見た限り「敵弾のタスクリストの初期化」のコメントの下の for文の中で、200を代入しているようです。  これを上の修正を行うと、多分 200だったところが 199になるかと思います。

kaede0501
質問者

お礼

解決しました。 if(enemy[e].next==0 && enemy[e].prev==0){ enemy[e].next = efree.next; enemy[e].prev = 0; enemy[efree.next].prev = e; efree.next = e; eactive.next=0; eactive.prev=0; } else{ ichihoa = enemy[e].next; ichihob = enemy[e].prev; enemy[efree.next].prev = e; enemy[e].next = efree.next; efree.next = e; enemy[e].prev = 0; enemy[ichihob].next = ichihoa; enemy[ichihoa].prev = ichihob; } これではenemy[e].nextもしくはenemy[e].prevのみが0のとき、efree.nextやefree.prevにアクセスしないようになっていました。 ↓以下が新しいソースです。efreeがenemyfree、eactiveがenemyactiveに変わっています。 if((enemy[e].next==0)&&(enemy[e].prev==0)){ enemy[e].next = enemyfree.next; enemy[e].prev = 0; enemy[enemyfree.next].prev = e; enemyfree.next = e; enemyactive.next=0; enemyactive.prev=0; } else{ if((enemy[e].next!=0)&&(enemy[e].prev==0)){ ichihoa=enemyfree.next; enemy[enemy[e].next].prev=0; enemy[enemyfree.next].prev=e; enemyfree.next=e; enemyactive.next=enemy[e].next; enemy[e].next=enemyfree.next; enemy[e].prev=0; enemy[e].next=ichihoa; } else{ if((enemy[e].next==0)&&(enemy[e].prev!=0)){ enemy[enemy[e].prev].next=0; enemyactive.prev=enemy[e].prev; enemy[e].next=enemyfree.next; enemy[e].prev=0; enemy[enemyfree.next].prev=e; enemyfree.next=e; } else{ ichihoa = enemy[e].next; ichihob = enemy[e].prev; enemy[enemyfree.next].prev = e; enemy[e].next = enemyfree.next; enemyfree.next = e; enemy[e].prev = 0; enemy[ichihob].next = ichihoa; enemy[ichihoa].prev = ichihob; } } } 文化祭に間に合いそうです。 本当にありがとうございました。 できれば他にミスがあれば教えていただけませんか?

kaede0501
質問者

補足

宣言の数を10から11に変更して直しました。 結局、thistcbはタスクのエラーを発見するときに使おうとしていただけなので消しました。 今まで動いてたのが逆に不思議ですね 敵のタスクは直ってません。 敵を消したときに複数同時に消える現象をみて気づいたのですが、 これは削除していようとしているタスクがeactiveの先頭と誤認されているから、他のタスクが隔離されている、ということなのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

回答No.3

No.2です。 >それなので削除した後の描写処理でハングアップしているようです  なるほど。  私のほうで確認した現象は敵が何匹か出てきたところで、 敵の移動ループの中で eが 50という配列の外を指してしまい enemy[e].typeの switch-caseでERROR_EXIT()が実行される、 というものでした。  現象が少し違うようですが、根は同じなのかもしれませんね。 #正直このタスク(?)は結構厳しいですね。  使いづらくないですか?

kaede0501
質問者

補足

>タスク(?) 私もそう思います。本当にタスクなのか微妙です。 C言語でやるのを自分ひとりで考えた結果こんな使いづらいものに。 まぁ一度作ってしまえば呼び出せばいいだけなのでそこは・・・ あまり作り直す時間も無いのでそこは御勘弁を。 なぜか、enemy構造体のthistcb変数の中に何故か200が代入される現象も発見しました。 変数名変えたほうがいいでしょうか・・・? そして指摘してくださったエラーの原因はどこなのでしょう・・・?

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

>敵の消滅でバグがおきています  具体的にはどういうバグですか?  症状がわからないのでは、答えようがありません。

kaede0501
質問者

補足

バグというよりか、エラーでした。 さっき変数を表示させてわかったのですが、 自機のショットで敵の体力を0以下にした時に、タスクをアクティブタスクからフリータスクに戻すようにしているのですが、削除したときにアクティブタスクが永久ループに陥るようになっているようです。 それなので削除した後の描写処理でハングアップしているようです。

全文を見る
すると、全ての回答が全文表示されます。
  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

DirectXSDK、まだ入れていないのでビルドしてはいませんが… Visual Studioのデバッガなどでおおよその位置の絞り込みとかできませんか?

kaede0501
質問者

補足

回答ありがとうございます。 VisualStudio2005でビルドしてみましたがさっぱりです。 Borlandしかまともに使ったことがないのでVisualStudioは・・・ あと、DxLibraryを使ってるのでDirectXSDKは必要ありません。 以下からライブラリをダウンロードするだけでいけるはずです。 http://homepage2.nifty.com/natupaji/DxLib/ 自分は学生なのですが、文化祭で出展したいのでどうかおねがいします・・・

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 縦スクロールのゲームの参考本

    DXライブラリとCを使ってシューティングゲームを作成したいと思っています。 14歳から始めるC言語ゲームプログラミングでDXライブラリと横スクロールゲームについて勉強し http://l.huu.cc/s/ このサイトで縦スクロールのゲームを作成しています。今このサイトはしばらく更新していないようなのですが・・・敵と自弾までの判定はできたものの、敵と自機、敵の弾と自機との判定ができず現在勉強中です・・・。 現在東方のような縦スクロールシューティングゲームをDXライブラリとC言語を作成しようと思っているのですがそのようなゲームの参考本はないでしょうか? 理想としてはサンプルゲームプログラムがあり、プレイヤーの移動→弾の発射→・・・といった具合に作成していく参考書が望ましいです。 開発環境は C言語 DXライブラリ ビジュアルスタジオ2003.net です。よろしくお願いします。

  • シューティングゲーム向けの開発言語

    某弾幕ゲームの影響でプログラミングをし始めたんですが C言語やC++語以外ゎあまり手をつけたことがなく どの言語が弾幕ゲー開発に最適なのか把握しきれていません。 個人的にはXMLやJAVAのほうがシューティングに向いているように 感じるのですがその辺もどうなんでしょう? お勧め言語等、ご教授お願いします。

  • 簡単なシューティングゲーム制作

    下記の内容を目標に簡単なシューティングゲームを作っているのですが、アドバイスをいただけたら幸いです。 ・敵(ライブラリーからステージに複数配置・移動・スピード・敵同士の間隔に可変性を持たせる・弾にヒットしたら消える) ・自機(・マウスに追従・マウスクリックで弾発射・弾を制限なしで連射可・敵にヒットしたらスコア表示) ・制限時間 ・スコア表示 参考サイトなどありましたら、教えていただけると助かります。 大変申し訳ありませんが、宜しくお願いいたします。

  • Flashで、簡単なシューティングゲーム制作

    下記の内容を目標に簡単なシューティングゲームを作っているのですが、アドバイスをいただけたら幸いです。 ・敵(ライブラリーからステージに複数配置・移動・スピード・敵同士の間隔に可変性を持たせる・弾にヒットしたら消える) ・自機(・マウスに追従・マウスクリックで弾発射・弾を制限なしで連射可・敵にヒットしたらスコア表示) ・制限時間 ・スコア表示 参考サイトなどありましたら、教えていただけると助かります。 大変申し訳ありませんが、宜しくお願いいたします。

  • シューティングゲームの作り方

    また行き詰ってしまったので質問させてください。 趣味のプログラミングでシューティングゲームを作ろうと思っていて、下記URLのコードまでは完成しました。 しかし、色々と問題があります。 (1)自機が敵機に当たったときには、衝突応答の関数が実行されるのに、弾が敵に当たった時には実行されないのがなぜだかわからない。 (2)背景の画像をスクロールさせるのに効率のいい方法(できるだけ重くない処理) (3)自機を枠の外に行かないようにするには… (4)”マウスのボタンをクリックするたびに弾を発射”ではなく、”押している間は常に弾を発射する”という処理にするにはどうすればいいのか… (5)マウスを押したままでも、自機の移動を可能にするには…(画像を表示させると、クリック状態で自機の移動ができなくなる) (6)右クリックの禁止ができません。どのサイトを見ても同じようなコードしか書いてなく、そのコードでは右クリックの禁止ができません…(divにoncontextmenu="return false;") (7)その他、下記URLのコードの無駄や、ゲームを作るならもっとこういう書き方の方がいい!などありましたら教えていただけるとうれしいです。(何より動作の軽いゲームを作りたい(javascriptで。今回他の言語等は考えていません。)) (8)それから、注文が多くて申し訳ありませんが、(7)以外は下記のコードをベースに解決方法を教えていただければ幸いです。 http://www7b.biglobe.ne.jp/~k326/javascript/STG.html 8つも一度に質問するのも気が引けましたが、何度も投稿するよりは…と思ったのでまとめさせていただきました。自分なりにグーグルで10サイト以上は見て回ったのですが、解決できませんでした。(検索の仕方が悪いのかもしれません…)どうかご教授お願いします。 ※趣味の範囲なので、できれば「センスない」などの中傷はしないでください。お願いします。 ※動作チェックはIEです。とりあえずはIEでできるように…と考えています。 ※2000文字に入りきらなかったので、直接コードを記述せずにURLを載せる事にしました。

  • どんな東方のゲームで遊んでみたいですか?【同人ゲーム作成】

    アンケートです。 東方、同人というジャンルを知っている方はアンケート協力お願いします。 私は学校でC言語プログラミングを習っています。 もちろん、プログラミングもなかなかできます。 卒業作品で何かゲームを作成しないといけなくなってしまいました。 どうしようかなっと悩んでいます。 そこで、東方をベースとしたなにか同人ゲームを作ろうと思います。 東方といえばシューティング。でもシューティングは作ろうとは思えば作れるし、ZUNさんを超えるものは作れないと思っていますのでそれ以外で。 東方の同人ゲームでプレイしてみたいゲームジャンルがありましたら是非教えてください。

  • ゲームを作成する時

    題名と違いますが、プログラマーになるためにはどのような言語を学べばいいのですか? ひとえにプログラマー言いましてもたくさんあると思いますが一番使われている言語はやはりC言語でしょうか? あとC言語でゲームを作成するときには外部ライブラリというものを使いますよね? たとえばDrawGraph()はDXライブラリで出てきますが、こういう関数はすべて暗記したほうがよいのでしょうか?

  • ゲーム作成オススメライブラリ

    どうもー。 最近ゲームプロ作成を始めた者ですが、今回はライブラリについての質問です。 色々なサイトを見て周って画面に色々表示させたり、基本的なプログラムはできるようになったのですが、いまいちライブラリを理解しきれてません。 なので、今はVC++とDXライブラリを使ってるのですが今後の事と自分の製作する傾向にあったライブラリがわかりません。 使用言語はC++です。 調べて周ると、 DXライブラリ チュートリアルやマニュアルが充実していてプログラミング初心者にもお薦めです。2D専用。 Selene 高機能かつ2Dゲームも3Dゲームも作れるライブラリです。DXライブラリと比べるとドキュメントがまだ整備されていませんが、サンプルプログラムが一通りそろっているのでそれを読めばだいたい習得できるでしょう。 の、二つがよく目に付いたのですが、もしよかったらみなさんのオススメのライブラリや初級者~中級者向けのを教えてもらえないでしょうか? ちなみに、今製作目標としてるはRPG系(FFとかじゃなくVP風です)で余裕ができたらアクションとか3Dにも手を出そうかと考えています。

  • JAVAでゲーム開発する際の環境

    C言語とC++を一通り学習し終えたあと、 趣味でゲーム開発をしています。 開発環境は、Windows7、VC++2010 C++とDXライブラリを使用して、 簡単なシューティング系のオフラインゲームを作製し、 ロダで配布したりしています。 Zipの内容は、実行ファイルとデータファイルだけの単純なものです。 しかしこれだとWindowsのPC限定である為、 今後の事も考えてJAVAでの開発に移行したいのですが、 どの様な環境を用意するのかが分かりません。 まずは今までにC++とDXライブラリで作った超簡単なゲームを、 JAVAに書き直しながら勉強して行きたいと考えています。 エディタはEclipsかNetBeansあたりを考えています。 C++の場合は、龍神録プログラミングの館と言うサイトを参考に勉強しましたが、 JAVAの場合は、パスやフォルダ構成、環境設定等の超基礎的なレベルから ゲーム作成を解説してある、詳しいサイトが見つかりませんでした。 アプレットやWebアプリ、サーバーサイド系のページの他、 クラスやら演算子やらの、JAVAそのものの解説系サイトは見つかるのですが。。。 Q1、映像や音楽関連のライブラリは何を用意すべきでしょうか? Q2、JAVAゲーム開発が初心者レベルの、解説の詳しいサイト等を教えて下さい。 Q3、そのほかで、注意事項やアドバイス等がありましたら、是非お願いします。

  • DXライブラリの動作速度

    DXライブラリというライブラリを使って小規模なをプログラムをしてきたのですが、ここで(まともな)シューティングゲームを作ろうと思いました。 そこで質問なのですが、60FPSで動作する2Dグラフィックの弾幕シューティングゲーム作成はDXライブラリでも十分な速度を得られるものなのでしょうか? また、他に使いやすいライブラリやAPIはないでしょうか? どなたか回答お願いします。