ページ 1 / 1
ショットの実装について
Posted: 2009年10月04日(日) 01:11
by 256bit
ナムコの「バトルシティ」のような2Dアクションゲームを制作しています。
プログラミング初心者で、ゲームプログラミングの館の項目24「4方向移動~2D~」に項目26のショット「シューティングの基本」のプログラムを実装したいのですが、キャラクターが動かなくなったりしてうまくいきません。
24項目に26項目のプログラムの組み方を教えてくれませんか?
上記の図のように4方向に弾を飛ばすことを現在実装しています。
Re:ショットの実装について
Posted: 2009年10月04日(日) 07:14
by zwi
24項目までのソースコードの一行一行の意味は、どのぐらい理解できていますか?
それと例えば歩く処理の中で実際にキャラクタの座標を変えているのはどの部分でしょうか?
私の質問の答えと今現在のうまく動かないソースコードを見せてくださいね。
Re:ショットの実装について
Posted: 2009年10月04日(日) 15:28
by 256bit
>>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;
}
Re:ショットの実装について
Posted: 2009年10月04日(日) 16:26
by softya
zwi改め、softyaです。
そこまで理解されているのであれば、KEY_INPUT_RETURNで弾が発射される時にch.xとch.yをtama.xとyにコピーするだけです。
そのとき、tama構造体にもmukiを持たせてキャラの向きをコピーするようにしてください。
で、26章では上方向しか弾の処理がありませんので、tama構造体のmukiに合わせて4方向の処理を作ります。
よろしいでしょうか?ソースを見せていただければ、もう少し具体的な説明が出来たのですが。
Re:ショットの実装について
Posted: 2009年10月04日(日) 17:19
by 256bit
>>softyaさん
コードが長いと書き込めないので、どこからどこまでのコードを掲示したほうがいいですか?
Re:ショットの実装について
Posted: 2009年10月04日(日) 18:05
by softya
ソースコードは、この掲示板の添付機能で添付できると思いますので添付でお願いします。
Re:ショットの実装について
Posted: 2009年10月04日(日) 18:37
by 256bit
>>softyaさん
昨日いじってたソースを送ります。
Re:ショットの実装について
Posted: 2009年10月04日(日) 19:33
by softya
ソース見ましたけで、弾が下から発射されるだけで、自キャラには何も問題ないはずですけど。
ためしに、弾関係を
#if 0
#endif
でコメントアウトして問題が再現するか試してみてください。
デバッグの基本中の基本ワザです。
で少しずつ弾処理のコードを有効にしていって問題点が再現する場所を見つけましょう。
Re:ショットの実装について
Posted: 2009年10月04日(日) 21:18
by 256bit
>>softyaさん
実行すると、方向キーどちらか押した状態でエンターで弾を撃つとキャラの動きが止まります。押し続けると、キャラも弾に化けます。
Re:ショットの実装について
Posted: 2009年10月04日(日) 21:39
by softya
ごめんなさい。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キーの影響があるはず無いんですが。
Re:ショットの実装について
Posted: 2009年10月04日(日) 23:04
by 256bit
>>softyaさん
わかりました。今後プログラムは、txtファイルで添付します。A^_^;)
ショットのコードを上記の文に置き換えましたら、キャラが正常に動きました(^_^)。
Re:ショットの実装について
Posted: 2009年10月05日(月) 07:36
by softya
今朝ソースを見たら問題点に気づきました。
tamaの配列が、
struct shot tama[2];
と宣言されているのに使うときは、
for(i=0;i<10;i++){
と配列を添え字が9まで参照したり変更してますよね。
つまり、配列外のメモリを参照したり破壊したりしてます。
なので異常が起きているんですが、異常終了しなかったのが不思議なくらいです。
struct shot tama[10];
に戻して置いてください。
あとは、前に書いた事に注意して組み直してもらえば弾がちゃんと飛ぶはずです。
Re:ショットの実装について
Posted: 2009年10月06日(火) 02:14
by 256bit
>>softyaさん
ありがとうございます。
昼間アクセスできなかったので、今返信書きました。
tama[10]に直したましたら、移動中でもしっかり打てました。
Re:ショットの実装について
Posted: 2009年10月09日(金) 22:06
by 256bit
>>softyaさん
弾が4方向に飛ぶようになりました。^_^b
しかし、右と下にショットを撃つと初期化されません。
もう一度プログラムを見てもらってもいいですか?
Re:ショットの実装について
Posted: 2009年10月09日(金) 22:30
by ねこ
if(tama.y < 32){
if(tama.x < 32){
判定のここ不等号が逆じゃない?「>」だと思う
Re:ショットの実装について
Posted: 2009年10月09日(金) 22:41
by 256bit
>>ねこさん
逆にするとショットが飛びませんでした。><
Re:ショットの実装について
Posted: 2009年10月09日(金) 22:46
by MNS
if(tama.y < 32){
if(tama.x < 32){
は
if(tama.y > 480){
if(tama.x > 640){
ではないでしょうか?
Re:ショットの実装について
Posted: 2009年10月09日(金) 23:03
by 256bit
>>みなさん
本当ありがとうございます。 ^_^b
4方向しっかり弾が初期化され、ショットが完全実装できました。
また何かありましたら、よろしくおねがいします。m(__)m