トピック
shoum shoum0403

シューティングゲームについて1

シューティングゲームで自分の自機のショットを連続3発撃たせるにはどうしたらいいですか? 今のところ1発、1発しか撃てないので、困っています
1そうだね
プレイ済み
返信[1]
親投稿
だにえる haru2016nen
一度ボタンを押すごとに3発ってこと?
0そうだね
プレイ済み
返信[2]
親投稿
Mc mc014483
一発目が飛んでいる間に次の二発目、続いて同じく3発目、、、という風に、3発を別々に管理したいとのことだろうと思います。 配列変数を使ったら出来ないかな。僕もそこのところを悩んでいます。
0そうだね
プレイ済み
返信[3]
親投稿
あきと SideBurnsM
自分の弾の座標をTX,TYとかにして一発だけ飛ばせるようにしているという事でしょうか。 まずは DIM TX[3] DIM TY[3] と配列宣言を使って3つの弾の座標で管理してみるといいと思います。 弾が発射されているときは座標がどうなっているか、発射されていないときはどうなっているか考えてみましょう。 もしくはDIM TFLAG[3]という弾が発射されているかどうか判定する別な配列を作ってしまうという手もあります。
0そうだね
プレイ済み
返信[4]
親投稿
shoum shoum0403
えーと、簡単にいえば、サンプルみたいなかんじです。
0そうだね
プレイ済み
返信[5]
親投稿
shoum shoum0403
画像です。どこを直せばよいでしょうか?
0そうだね
プレイ済み
返信[6]
親投稿
Mc mc014483
サンプルも一発ずつですよ。VSYNCをいじって、見てください。 本当にDIMでできるのですね。気が向いたらやってみます。
0そうだね
プレイ済み
返信[7]
親投稿
あきと SideBurnsM
MSFがMYSHOTFLAGの略だと思うのですが、今はMSFが一つしかないので全部発射か発射していないかの2つしか表現できません。 MSFも配列してしまうのが良いと思います。 80行目と82行目のMSFはMSF[]にする。81行目で画面外に消えたら隠す処理が書かれていますが、SPHIDE Mの後ろにMSF[]=0も必要でしょう。 ところでFOR I=5 TO 8になっていますがこれだと4発弾がでることになってしまいますよ。 たぶんスプライトを0は自機、2~4は敵、5~8は弾というように管理番号をつけているのかもしれませんが、FOR I=5 TO 8というような手抜きな書き方は後々バグのもとになるので SHOTSP=5 FOR I=0 TO 2 IF MSF[I]==1 THEN SPOFS SHOTSP+I,MSX[I],MSY[I] NEXT とかしておいた方が
0そうだね
プレイ済み
返信[8]
親投稿
あきと SideBurnsM
あと弾が消滅する座標が-300になってますが、-48ぐらいでいいのでは? 消えるまでかなりかかってしまいますよ。
0そうだね
プレイ済み
返信[9]
親投稿
だにえる haru2016nen
僕のSTGでは Z=弾数 DIM S[Z] FOR L=0 TO S-1 IF ボタン&&!S[L]THEN 発射    S[L]=1 BREAK ENDIF NEXT のようにしています。
1そうだね
プレイ済み
返信[10]
親投稿
shoum shoum0403
あきとさん>>直したのですが、やはり4連続で球は打てず、1発1発しか打てません。したで、PRINTしてみたら、全部一斉に動いてました。あと球は3連続じゃなくて4連続です。すみません。 だにえるさん>>わかりそうで、わからない、勉強中...
0そうだね
プレイ済み
返信[11]
親投稿
Mc mc014483
配列変数を使いこなせない初心者。積極的に使っていくことで慣れるものです。 BREAKとは如何に。
0そうだね
プレイ済み
返信[12]
親投稿
shoum shoum0403
写真です。
0そうだね
プレイ済み
返信[13]
親投稿
shoum shoum0403
Mcさん>>そうですね。2次元配列とか触れてもいませんですしね。やっと1次元配列?が使えるようになったところでっせ。 それと、[BREAKとは如何に]とは?
0そうだね
プレイ済み
返信[14]
親投稿
だにえる haru2016nen
»BREAKとは如何に これは僕のプログラムについてですかね。 FORやWHILEやREPERTなどの ループ専用の命令を使っている際に、 (GOTO系はループ専用ではないので違う) ループ内で効果を発揮し、 ループから強制的に抜け出します。 DEF内のRETURNに似てます。 上コメのプログラムのFOR~NEXTを メインループに入れています。 BREAKを付けることで 1回のループで発射できる回数が 1度に限られます。
1そうだね
プレイ済み
返信[15]
親投稿
あきと SideBurnsM
FORループを2つに分ける必要があります。 ボタンを押したら空きの場所を探して弾を発射するというループと、MSF[M]が1の時は弾が上に飛んでいき画面外に消えたらMSF[]に0を入れるというループです。 今はボタンを押したときに全てのMSF[]に1が入ってしまっていますね。
0そうだね
プレイ済み
返信[16]
親投稿
あきと SideBurnsM
もう一つ、MSF[]の0の場所を見つけて弾を発射する処理を行ったらBREAK文でループを抜けるようにしないとMSF[]が全部0だったら4つとも1を入れてしまいますね。
0そうだね
プレイ済み
返信[17]
親投稿
shoum shoum0403
空きの場所とは??どういったプログラムを組めばいいのですか?
0そうだね
プレイ済み
返信[18]
親投稿
だにえる haru2016nen
あ、上プログラムのFORは正しくは 「FOR L=0 TO Z-1」です。 S[]は弾が存在しているか (発射されたままか、画面内に残っているか) みたいな事を知るためのフラグです。 発射された弾が敵に当たったり、 画面外に行ってしまったりすれば、 FORでS[]の数値を調べ、 中身が1のやつを0にする (もちろんここでもBREAKを利用) という処理をすればいいかと。 まあ、僕のSTGでは弾数1~30調整可能で 弾それぞれがもっと区別されて処理 されてますので、ちょっと違います。
1そうだね
プレイ済み
返信[19]
親投稿
あきと SideBurnsM
空きの場所とはMSF[M]が0の場所をという事です。 上のshoumさんのソースはMSFが[0,0,0,0]の状態から一気に[1,1,1,1]になってしまうはずです。 [1,0,0,0]と1つだけ弾が発射した状態にするにはFOR文でループしてMSF[M]が0の場所を見つけたらBREAK文ですぐ抜けないと、たとえばMが5で始まってMSF[5]が0だったら弾を登録した後6,7,8には行かないようにしないといけないわけです
0そうだね
プレイ済み
返信[20]
親投稿
あきと SideBurnsM
もしかしてFOR文の中にBREAK文を入れたことがないかな? 80行目の最後にBREAKを入れてみるといいですよ。4回ループしないでFOR文から抜けることができます。 そのおかげで弾が別々に発射されるようになると思います。 その代わり、Aボタンを押した時だけ弾が止まるようになるでしょう。 この現象を回避するためには「ボタンを押したら弾が出る処理」と「発射された弾を管理する処理」は別々のループで行われる必要があるという事です。
0そうだね
プレイ済み
返信[21]
親投稿
横から失礼 FORの途中でBREAKするとスタックが溜まってプチコンが落ちるってハカセがmkIIの講座で言ってた希ガス
2そうだね
プレイ済み
返信[22]
親投稿
みむ*mim hidemimtp
お、楽しそうなスレが。またちょっと書いてみよう。
0そうだね
プレイ済み
返信[23]
親投稿
BlackSoft BlackSoft.mkII3g
ループからの脱出については、過去に議論されていますね。多重ループの最深部からGOTO脱出しても、特に問題はなさそうなので、3号では解消されていると見て良いと思います。 https://miiverse.nintendo.net/posts/AYMHAAACAAADVHiJeRPfaw
1そうだね
プレイ済み
返信[24]
親投稿
みむ*mim hidemimtp
と思ったらほぼ出来てるのですね。 私も、Aボタンが押されたときだけ通る「発射GOSUB」(一発発射したらBREAKでFOR文を抜ける)と、毎ループ通る「弾移動GOSUB」は分けた方がいいと思います。
0そうだね
プレイ済み
返信[25]
親投稿
みむ*mimさんも言われているように弾の発射と弾の処理は分けた方がプログラムが書きやすくなると思います。 今は全てまとめてやろうとし過ぎて、弾の発射の処理で一度に全ての弾を同じ場所に出してしまったりしていますし、出てない弾まで位置を変えるような処理が入ってませんか? 皆さんが言われている内容を考えてみて、わかりにくい所とか理解出来ないところとかあったらまた質問してみるといいと思いますよ。
0そうだね
プレイ済み
返信[26]
親投稿
shoum shoum0403
みなさんのおかげで一応連射できるようになりました。ありがとうございます。BREAKの使い方がポイントでしたね。
0そうだね
プレイ済み
返信[27]
親投稿
Mc mc014483
BREAKの意味が分かりました。使いこなすまでに時間がかかりそうだけども、教えていただいただけでちょっと頭がよくなった気分。ありがとうございました。
1そうだね
プレイ済み
返信[28]
親投稿
TERA(LL) tera0413
ここまで誰もSPVARを出さない件について。 プログラムの見た目は、悪くなりますが、SPにわざわざ配列を別途用意するなんて・・・
0そうだね
プレイ済み
返信[29]
親投稿
みむ*mim hidemimtp
>TERA(LL)さん プチコンはSPVARがあるのでそれを使えばいいんですが、どの言語でも通用するような基本的なやり方で書かれていて解決しそうな時に他のやり方を提案するのは混乱するだけかなーと思いまして。 私がもしこれを自分で組むなら配列もSPVARも使わないでSPFUNC1つで済ませます(^^;
0そうだね
プレイ済み
返信[30]
親投稿
みむ*mim hidemimtp
>shoumさん このロジックだと弾を発射したフレームは移動ロジックを通らないので、新たに発射したとき、発射済みの弾が全て一瞬停止しちゃいません? 実際のプレイにあまり支障はないかもしれませんが・・・
0そうだね
プレイ済み
返信[31]
親投稿
プチコンの機能を生かすならフラグの代わりにSPUSED、移動はSPANIM、その他の処理(消去等)はSPFUNCを利用するのが良さそうですよね。
0そうだね
プレイ済み
返信[32]
親投稿
あとSPSETのOUTを使う手もありますね。
0そうだね
プレイ済み
返信[33]
親投稿
あきと SideBurnsM
私もshoumさんの理解優先で書き込みしてました。 そうでなければSPFUNCのサンプルソース(昔作った)を公開してはい終わりにしてたかも。
0そうだね
プレイ済み
返信[34]
親投稿
ショー syo0918syo
>>shoums 99~102行少し短縮できますよ↓
0そうだね
プレイ済み
返信[35]
親投稿
ショー syo0918syo
For Loop=1 To 4 Locate 0,Loop:?Msy[Loop+4] Next 変数Loopは適当な変数名でおkです
0そうだね
プレイ済み