>くもきさん
BGもスプライトとほぼ同様のアニメーション命令がありますよー。SPANIMに対して、BGANIMになります。
使い方はかなりSPANIMと同じなので、片方を理解していれば使いやすいと思いますよ。
0そうだね プレイ済み
ちょっとオマケで書くとBGCHKはBGANIM中の状態を調べられる命令なんだけど、結果がフラグ的なもので返ってきます。まったく動いてないときは0。
で、そのフラグ的なものから移動指定("XY"や"XY+")した場合の情報を抜き出す為の記述がAND #CHKXYなのですが、今回の場合はBGANIM1つしか動作してないのでわざわざフラグを抜き出して判定しなくても大丈夫とも言えます。なので、
WHILE BGCHK(0):VSYNC:WEND
でも目的を達成できます。理解した上でなら省略してもいいと思うので、こっちの方が短くて良いかもですね。
0そうだね プレイ済み
移動量は16ですよ。早さに影響するのは-10のところです。
それよりも大きな問題はBGANIMの移動が完了するまでは再度BGANIMをしてはいけません。今のプログラムの場合、ボタンを押している間、BGANIMを何度も実行するので正常な動作にならないと思います。
一つの方法としては、移動中はメインループに戻さない手があります。その場合、24行目を
WHILE BGCHK(0)AND #CHKXY:VSYNC:WEND
としておけば移動が終わるまでこの行で待機させることが出来ます。
(なので移動後に25行目以降のランダムチェックが入ることになりますが)
1そうだね プレイ済み
VSYNCはメインループの中に入っていた方がいいと思うので@LOOPの下にして、22行目のVSYNCは要らないかなって思います。
1そうだね プレイ済み
ちょっと勘違いがあったので修正…。
BGANIMの箇所ですが、元の位置に戻すために1,0,0としていますが、それは要らなかったです。相対指定なので基準が命令実行時点での位置なので戻さなくても勝手に戻っていたという…。
なので、
BGANIM 0,"XY+",-60,16,0,0
で問題ないはずです。
失礼しました!
0そうだね プレイ済み
BGANIM 0,"XY+",-20,16,0,1
レイヤー番号0のBGを相対的に20フレーム(-20)で(16, 0)ドット(なので横)に1回スクロールさせる。
1そうだね プレイ済み
16ドット動かす場合、いきなり足すよりもSPANIMやBGANIMをつかった方がスムーズな動きになるよ。
2そうだね プレイ済み
ゴメン間違え…。
SPVAR 5,0,2
RESTORE "@KAIWADATA"+STR$(SPVAR(SP,0))
でした…
1そうだね プレイ済み
みむさんのアイデアにプラスして、もしメッセージの管理番号が密接になってしまうのが気になる感じがあったら、スプライトに対して役者(セリフ?)IDのような数値を設定するようにして、その数値でセリフを変えるのも良いかもです。
その際、スプライト自体に値を設定する方法としてはSPVARが使えるので、これを使うと便利です。例えばスプライト管理番号5にセリフ番号2を割り当てるようなイメージだとしたら、
SPVAR 5,2
としておけば、
RESTORE "@KAIWADATA"+STR$(SPVAR(SP,5))
のような感じでスプライトに割り当てたセリフ番号からDATAを読み込むような流れにも出来ます。
1そうだね プレイ済み
という感じで、話していた内容に近い処理になっているはずです。この考え方が僕の解説したやり方に近い方法です。
あとは自分のやり方に合わせてカスタマイズすれば希望に近い動作になるような気がしますが、本編を改良したわけではないので、その辺は使えそうな部分を組み合わせて……って感じかなと思います。
頑張ってください!
1そうだね プレイ済み
ちょっと僕が解説した内容にした始めのサンプルをアップしました。
公開キー:PK2KV54X
変更点は以下の通りです。
1:スプライト定義番号によって5つの種類に変更しています。
2:カウンタにMAINCNTを使う場合、カウンタを止めることが出来ないので自分でカウンタを用意しました。(SCNT)
3:出現時の重なりチェックをスプライトの当たり判定にして配列は廃止しました。
4:SPANIMを少し変えてスピードと距離を一定にしました。(ので距離はあらかじめ少し長くしています)
5:距離を長くした関係でアニメーションが終わるより前に画面外に出るので、画面外に出たときにスプライトを消去するように変更しました。
6:Yボタンを押した時に画面切り替えを仮定してスプライトを消しました。Aボタンで再開(復元)します。
1そうだね プレイ済み
そうですね。そんな風にイメージして組み合わせてみるといいと思いますよ!
頑張ってください!
0そうだね プレイ済み
そうですねー。グラフィックを使う積極的な理由がなければ背景はBGで処理した方が楽な面も多いと思いますよ。BG自体も4面ありますしねー。
0そうだね プレイ済み
あ、
BX[I]=BY[I]=-99999 '未使用という意味
この書き方、プチコンでは出来なかったかも? その場合は素直に、
BX[I]=-99999
BY[I]=-99999
とします。(BXだけで判断できるのならBYは値を入れなくてもいいかもだけど)
1そうだね プレイ済み
流れたスプライトをタッチして場面展開する場合は、0〜24の管理番号のスプライトを使わないようにして非表示にするか、もしくは場面展開する直前で、バックアップ用の配列に位置情報など保存しておく必要がある情報をスプライト管理番号を要素番号として保存しておきます。
例:位置情報の配列バックアップ。BX,BY配列は始めにDIMしておく
@BACKUP_SPRITE
FOR I=0 TO 24
IF SPUSED(I) THEN
SPOFS I OUT BX[I], BY[i]
SPCLR I
ELSE
BX[I]=BY[I]=-99999 '未使用という意味
ENDIF
NEXT
RETURN
みたいな感じですね。未使用をどう表現するかはケースバイケースですがここでは座標で判断するような仕組みにしてみました。(ありえない座標をキーにしておく)
0そうだね プレイ済み
DLして軽く見てみました。なるほど〜。グラフィックがないので星座のままでしたがスクリーンショットも含めてなんとなくイメージがわかりました。
25個のスプライトを5つに区切って5種類の機能を持たせる場合、僕だったらスプライト管理番号は0〜24固定で管理番号の組で分けるかなぁ…?
種類はその管理番号で判断するか、それともスプライトに割り当ててある絵の定義番号で判別する感じで。
もしそれ以上の情報がスプライトに必要な場合は、先ほど話したSPVARなどを使ってスプライトに値として持たせておきます。
もしくは、管理番号を配列の要素番号にして別の配列変数に追加データとして記録しておく感じかな。
1そうだね プレイ済み
なるほど〜。そうなると多少は変わってくるとは思いますが、ただ配列の使い方は調整した方が組みやすくなりそうな気がしますね。とくに管理番号はスプライト表示の中心なので、管理番号を元(インデックス)に他のデータを管理する方法もあるかと思います。
それとスプライトにも8つまでの値なら持たせるSPVARという機能もあるので、それを使いこなせるようになると、もっとやりやすくなる可能性もありますね。
スプライトの座標の記録に関しては数にもよりますが移動先で同じスプライト管理番号を使わないようにして一時的にスプライトを止める&非表示にしておくという方法もありますね。まあそうじゃないにしても常に記録しなくても画面を切り替える時に、配列などに待避させるという方法でも良いような気がします。
という感じではありますが、とりあえず新しい方の公開キーの内容も見てみますね。
1そうだね プレイ済み
プチコンBIGは春配信なんですよ! だからきっと2017年の春に決まってますよ!
1そうだね プレイ済み
そういえば直書きなんてパターンもありましたねー…。
直書きのメリットは表示物が少ない場合はDATA式よりコードが短くなるかな?
あと読みにくいメリットとしては逆にプログラムを見ても画面内容がイメージしにくい(ので実行するまで隠す効果が少しある?)みたいな感じですかね〜。
デメリットに関してはあまさとさんが書いてあるので略で。
1そうだね プレイ済み