ショットの実装について

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

ショットの実装について

#1

投稿記事 by 256bit » 16年前

 ナムコの「バトルシティ」のような2Dアクションゲームを制作しています。
 プログラミング初心者で、ゲームプログラミングの館の項目24「4方向移動~2D~」に項目26のショット「シューティングの基本」のプログラムを実装したいのですが、キャラクターが動かなくなったりしてうまくいきません。
 24項目に26項目のプログラムの組み方を教えてくれませんか?
 
 上記の図のように4方向に弾を飛ばすことを現在実装しています。

zwi

Re:ショットの実装について

#2

投稿記事 by zwi » 16年前

24項目までのソースコードの一行一行の意味は、どのぐらい理解できていますか?
それと例えば歩く処理の中で実際にキャラクタの座標を変えているのはどの部分でしょうか?
私の質問の答えと今現在のうまく動かないソースコードを見せてくださいね。

256bit

Re:ショットの実装について

#3

投稿記事 by 256bit » 16年前

 >>zwiさんへ

 キャラクタの座標を変化させる部分の答えを掲示します。

 歩くフラグ(ch.walking_flag)が立っているかつ各キー入力のいづれかでch.mukiを動かすと、変数の値が増減してキャラを動かすことができる。

if(ch.walking_flag==1){ //歩くフラグが立っていたら //1P
if (ch.muki==0) //上向きならch.y座標を減らす
ch.y=ch.y-2;
else if(ch.muki==1) //左向きならch.x座標を減らす
ch.x=ch.x-2;
else if(ch.muki==2) //下向きならch.y座標を増やす
ch.y=ch.y+2;
else if(ch.muki==3) //右向きならch.x座標を増やす
ch.x=ch.x+2;
}
 

  

softya

Re:ショットの実装について

#4

投稿記事 by softya » 16年前

zwi改め、softyaです。
そこまで理解されているのであれば、KEY_INPUT_RETURNで弾が発射される時にch.xとch.yをtama.xとyにコピーするだけです。
そのとき、tama構造体にもmukiを持たせてキャラの向きをコピーするようにしてください。
で、26章では上方向しか弾の処理がありませんので、tama構造体のmukiに合わせて4方向の処理を作ります。
よろしいでしょうか?ソースを見せていただければ、もう少し具体的な説明が出来たのですが。

256bit

Re:ショットの実装について

#5

投稿記事 by 256bit » 16年前

 >>softyaさん

 コードが長いと書き込めないので、どこからどこまでのコードを掲示したほうがいいですか?

softya

Re:ショットの実装について

#6

投稿記事 by softya » 16年前

ソースコードは、この掲示板の添付機能で添付できると思いますので添付でお願いします。

256bit

Re:ショットの実装について

#7

投稿記事 by 256bit » 16年前

 >>softyaさん

 昨日いじってたソースを送ります。

softya

Re:ショットの実装について

#8

投稿記事 by softya » 16年前

ソース見ましたけで、弾が下から発射されるだけで、自キャラには何も問題ないはずですけど。
ためしに、弾関係を
#if 0
#endif
でコメントアウトして問題が再現するか試してみてください。
デバッグの基本中の基本ワザです。
で少しずつ弾処理のコードを有効にしていって問題点が再現する場所を見つけましょう。

256bit

Re:ショットの実装について

#9

投稿記事 by 256bit » 16年前

 >>softyaさん

 実行すると、方向キーどちらか押した状態でエンターで弾を撃つとキャラの動きが止まります。押し続けると、キャラも弾に化けます。

softya

Re:ショットの実装について

#10

投稿記事 by softya » 16年前

ごめんなさい。DOCファイルから取り出したらタブが乱れてしまいました。
今度からtxtファイルで添付してくださいね。

で、下記のコメントアウト状態でも同じですか?
#if 0
                        if(counter<5)                        //前にエンターを押してから5カウント未満なら
                        counter++;                       //カウントアップ
 
                else if( Key[ KEY_INPUT_RETURN ]  == 1 ){//5カウント以上たっていたら
                        counter=0;                       //カウンターを戻す
                        for(i=0;i<10;i++){             
                                if(tama.flag==0){     //発射していない玉を探し、
				        tama.flag=1;  //発射フラグを立てる
                                        break;
                                }
                        }
                }
                for(i=0;i<10;i++){
                        if(tama.flag==1){              //発射している玉なら
                                tama.y-=4;             //座標を8減らす
                                DrawGraph( tama.x , tama.y , image2[1] , TRUE );//玉を描画
                                if(tama.y < -32){      //もし画面外まで来たら
                                        tama.y=ch.y;    //初期値に戻し、					
					tama.x=ch.x;    //初期値に戻し、
                                        tama.flag=0;   //発射フラグを戻す
                                }
                        }
                }
#endif

これでENTERキーの影響があるはず無いんですが。

256bit

Re:ショットの実装について

#11

投稿記事 by 256bit » 16年前

 >>softyaさん
 わかりました。今後プログラムは、txtファイルで添付します。A^_^;)
 ショットのコードを上記の文に置き換えましたら、キャラが正常に動きました(^_^)。
 

softya

Re:ショットの実装について

#12

投稿記事 by softya » 16年前

今朝ソースを見たら問題点に気づきました。
tamaの配列が、
struct shot tama[2];
と宣言されているのに使うときは、
for(i=0;i<10;i++){
と配列を添え字が9まで参照したり変更してますよね。
つまり、配列外のメモリを参照したり破壊したりしてます。
なので異常が起きているんですが、異常終了しなかったのが不思議なくらいです。
struct shot tama[10];
に戻して置いてください。
あとは、前に書いた事に注意して組み直してもらえば弾がちゃんと飛ぶはずです。

256bit

Re:ショットの実装について

#13

投稿記事 by 256bit » 16年前

 >>softyaさん
 
 ありがとうございます。
 昼間アクセスできなかったので、今返信書きました。
 tama[10]に直したましたら、移動中でもしっかり打てました。

256bit

Re:ショットの実装について

#14

投稿記事 by 256bit » 16年前

 >>softyaさん

 弾が4方向に飛ぶようになりました。^_^b
 しかし、右と下にショットを撃つと初期化されません。
 もう一度プログラムを見てもらってもいいですか?

ねこ

Re:ショットの実装について

#15

投稿記事 by ねこ » 16年前

if(tama.y < 32){
if(tama.x < 32){
判定のここ不等号が逆じゃない?「>」だと思う

256bit

Re:ショットの実装について

#16

投稿記事 by 256bit » 16年前

>>ねこさん

 逆にするとショットが飛びませんでした。><

MNS

Re:ショットの実装について

#17

投稿記事 by MNS » 16年前

if(tama.y < 32){
if(tama.x < 32){

if(tama.y > 480){
if(tama.x > 640){
ではないでしょうか?

256bit

Re:ショットの実装について

#18

投稿記事 by 256bit » 16年前

 >>みなさん

 本当ありがとうございます。 ^_^b
 4方向しっかり弾が初期化され、ショットが完全実装できました。
 また何かありましたら、よろしくおねがいします。m(__)m

閉鎖

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