プレイ日記
ごごちー gogochii
質問です N秒ごとにスプライトが発生し左から右に移動し続けるにはどうすればよいでしょうか…
5そうだね
プレイ済み
返信[1]
親投稿
とりあえず考え方としては、メインループの中で一定時間(N)毎に出現用のプログラムを実行します。 一定時間のカウントはシステム変数のMAINCNTを使うのが便利だと思います。 出現処理は、使用できるスプライト管理番号を求めて、そのスプライトを表示します。そしたらSPANIMで左から右に動かすのが手っ取り早いと思います。 出現したスプライトは不要になったら(画面外など)消さないと、いずれ管理番号が不足するので注意してください。 SPANIMを使わない場合は、出現しているスプライトを毎フレーム右に動かす処理が必要になります。 出現中のスプライトの処理では、スプライトコールバック呼び出しのCALL SPRITEを使うと便利なのですが、この命令はバージョンアップ後に増えたものでもあるし、初心者はちょっと手間取るかもしれません。わかると難しい機能では無いのですが…。
1そうだね
プレイ済み
返信[2]
親投稿
スー thanks_0u0
概ね説明はされていますので、CALL SPRITEの使い方について補足をば(・д・) 1.まずSPにさせたい処理(サブルーチンかDEF)を書きます。SP番号にCALLIDXを使う以外は普通に書いて大丈夫です。 2.SPSETのすぐ後に、SPFUNCで先ほど書いた処理を指定します。これで「お前の動きはここに書いてあるからー」って教えたことになります。 3.ループ内でCALL SPRITE!これで、各SP達はさっき言われたところを見て動きます。 例えば2.で、クリボーにはクリボーの動き、ノコノコにはノコノコの動き、を教えてあげれば、CALL SPRITEするだけでその通りに動き始めます。 一定時間毎に敵が湧く、ってケースでは「もし画面外に出たらSPCLR」っていう処理をSPFUNCで教えてあげると、無限に敵が湧き続けるようになります。とても便利です(・u・)
4そうだね
プレイ済み
返信[3]
親投稿
ごごちー gogochii
皆さんありがとうございます! SPANIMの”XY”の変更の使い方がよくわかりません
0そうだね
プレイ済み
返信[4]
親投稿
ごごちー gogochii
画像です
0そうだね
プレイ済み
返信[5]
親投稿
そのSPANIMの場合、今いるスプライトの位置から、 1:-200なので200フレームでX:400, Y:132+DY[I]*16の場所に移動する。 2:次に-30なので30フレームでX:200, Y:100の場所に移動する。 3:ループ回数が指定されてないので上記の1と2を無限ループする。 という動作になるはずです。合ってますか?
1そうだね
プレイ済み
返信[6]
親投稿
ごごちー gogochii
なるほど ということは一方向に等速で動かす場合、座標は一つでいいと言うことですね!
0そうだね
プレイ済み
返信[7]
親投稿
そうですね〜。あとループさせないのだったら、最後に,1をつけてループ回数1を指定するといいですよ。構文的には、 SPANIM 管理番号,"アニメ対象",時間1,項目1[,項目2] [,時間2,項目1[,項目2]]… [,ループ] こんな感じなので、ループ回数を省略は出来ますが省略すると無限ループになります。
0そうだね
プレイ済み
返信[8]
親投稿
ごごちー gogochii
どうしても等速にならないです...
0そうだね
プレイ済み
返信[9]
親投稿
100フレームでX:400, Y:132+DY[I]*16の場所に移動する。 となってますが、スタート地点はどこですか? スタート地点はあらかじめSPOFSなどで指定してその場所にスプライトを表示しておく必要があります。 あとそのSPANIMって何度も呼び出されてないですよね? 何度も(毎フレーム)呼び出すと、その度にアニメが初期化されて予想外の動作になってしまいます。
0そうだね
プレイ済み
返信[10]
親投稿
ごごちー gogochii
画面右端にたどり着かず速度を落として止まったりします><
0そうだね
プレイ済み
返信[11]
親投稿
ごごちー gogochii
スタートは左側、画面外です
0そうだね
プレイ済み
返信[12]
親投稿
なんとなくSPANIMを何回も呼び出してしまっているような気がするのですが違いますか? SPANIMは一度呼び出したらアニメーションが終わるまでは同じ動作を呼びだしてはいけません。 なんとなくそのあたりの処理が間違っているような気がするのですが…
0そうだね
プレイ済み
返信[13]
親投稿
ごごちー gogochii
なんとなく画面左端から現れる瞬間急減速している気がしますができました!ありがとうございます!
0そうだね
プレイ済み
返信[14]
親投稿
出来たのは良かったです! ただぱっと見ですが@SPMOVEが毎回呼び出されているように感じるんだけど大丈夫なのかなぁ? 全体を見てないので何とも言えませんが、ちょっと気になる点も多いので、その辺を気をつけて確認してみてくださいねー。
1そうだね
プレイ済み
返信[15]
親投稿
スーさんの説明したCALL SPRITEも含めて、僕が始めに説明した内容を簡単なサンプルにしたものを作ってみたので参考に載せますね。 サンプルで聞きたいことがあれば答えますが、とりあえずそんな感じのやり方の一つでした。今後の参考になればと言う感じです。 頑張ってください!
1そうだね
プレイ済み
返信[16]
親投稿
ごごちー gogochii
ありがとうございます!! ぜひぜひ参考にします!
0そうだね
プレイ済み
返信[17]
親投稿
ごごちー gogochii
こうですかね? 確かに異常があったので修正しました!重ね重ねありがとうございますー!
0そうだね
プレイ済み
返信[18]
親投稿
良かったです! あとちょっと気になってるんですが、60行目のFORは何のためにある感じですか? あとから数字を増やす予定かな? それなら問題ないんですが、0 TO 0ってとても気になったので〜
0そうだね
プレイ済み
返信[19]
親投稿
ごごちー gogochii
増やす予定です!
0そうだね
プレイ済み
返信[20]
親投稿
そかそか、了解です〜。 頑張ってください!
0そうだね
プレイ済み
返信[21]
親投稿
ごごちー gogochii
度々すみません2つ質問です SPANIMでスプライトを移動させる時、移動中の座標を取得することはできますか? またSPANIMでxyを変更する際に、目標との距離が異なる複数のスプライトを同じ速度で動かすのに添付のやり方で合っていますか?
0そうだね
プレイ済み
返信[22]
親投稿
ごごちー gogochii
spofs
0そうだね
プレイ済み
返信[23]
親投稿
移動中の座標はSPOFSのOUT指定でとれると思いますよ。(たぶん) ただし取得するのはメインフレームの中で毎回取得するか、SPFUNCとかを使って呼び出す関数でとかになるとは思いますが…。 あと正確に目標地点が違うスプライトを速度的に同じで動かしたい場合は、目的地点までの距離を求めて、その距離に速度をかけたような値を時間として設定するようなプログラムになるんじゃないかなって思います。
1そうだね
プレイ済み
返信[24]
親投稿
ごごちー gogochii
MAINLOOPにSPOFS OUT命令を入れるとout of rangeしちゃうんです.. 速さってことは 距離をSPANIMのフレーム数で割るってことでしょうか?
0そうだね
プレイ済み
返信[25]
親投稿
プログラムを部分的にしか見てないので全容はわかりませんが、どうも出現とメインループの切り分けがうまくいってないような気がしますね…。 早さを固定する場合は移動にかかる時間を計算しないといけないです。 例えばSX,SYがスタート地点でEX,EYが目的地だとすると、 L=SQR(POW(EX-SX,2) + POW(EY-SY,2)) でLに距離が求まります。この距離に対して速度をかけて、その値を-で設定する時間の方に当てはめる感じです。
0そうだね
プレイ済み
返信[26]
親投稿
@SPMOVEの中でSPOFSやSPCHKをしているようですが、それだと出現した瞬間しか表示されないと思いますし、またもしこの@SPMOVEがメインループで毎回呼び出された場合は、毎回SPANIMをする事になるのでおかしな動作になってしまいます。
1そうだね
プレイ済み
返信[27]
親投稿
ごごちー gogochii
これで一応問題なく動きました! スプライトは事前に25こ用意してそれをランダムで使い回していく感じです!
0そうだね
プレイ済み
返信[28]
親投稿
ごごちー gogochii
メインループとspofs
0そうだね
プレイ済み