プレイ日記
ごごちー gogochii
[質問´_`]3秒おきにスプライトが発生して動くプログラムなのですが発生するそれぞれのスプライトの移動中のXY座標を取得するにはどうすればよいでしょうか 現状、3秒ごとに取得座標が上書きされている感じなのですが....
5そうだね
プレイ済み
返信[1]
親投稿
ごごちー gogochii
質問してばっかやな俺...orz
0そうだね
プレイ済み
返信[2]
親投稿
補完しても「SP何とか OUT 変数」で得た値は一気に値が変わるらしい
1そうだね
プレイ済み
返信[3]
親投稿
SPFUNC CALL SPRITEを使うと座標取得が簡単です 私が以前公開したゲーム「バードフォトグラファー」もランダムに出現して右から左へ鳥や敵が移動していって 座標が範囲外に行ったら消えるように作っています
2そうだね
プレイ済み
返信[4]
親投稿
実際のプログラムです 鳥の移動と消去を行います
1そうだね
プレイ済み
返信[5]
親投稿
鳥のスプライトを作成する関数です SPFUNCに関数を指定しています 呼ぶ所はメインループの中で8フレームおきにCALL SPRITEを実行するようにしています(スプライトの移動の関係で8フレームにしています)
1そうだね
プレイ済み
返信[6]
親投稿
ごごちー gogochii
難しい...です でも何となく感じた点があるのですが SPSET OUTで空きのSPを使っている部分で、私のプログラムでは事前にSPSETしてあってそこからランダムで選出出現させてるのですがそれでも出現したSPの座標を取得できますか?
0そうだね
プレイ済み
返信[7]
親投稿
ごごちー gogochii
SPSET
0そうだね
プレイ済み
返信[8]
親投稿
ごごちー gogochii
画像はりわすれました><
0そうだね
プレイ済み
返信[9]
親投稿
SPFUNCで呼ばれた部分はCALLIDXにスプライトの管理番号が入っていますが、 これはどんな方法で作成したスプライトであっても関係ありません 大丈夫ですよ
0そうだね
プレイ済み
返信[10]
親投稿
あ、ちょっと書いた文うっかりしましたね 最初の部分は CALL SPRITEで呼ばれた SPFUNCに設定した関数では ですね 失礼しましたm(_ _)m
0そうだね
プレイ済み
返信[11]
親投稿
ごごちー gogochii
SPOFSの数値をCALLIDXにしたら上書きされずにすみました!!! 遅ればせながらありがとうございます!
1そうだね
プレイ済み
返信[12]
親投稿
なんとなくスプライト番号とか配列の管理がうまくいってないような感じがしますねー…。 本来ちゃんと矛盾がなければ配列でも動作するような気がしますが、それがうまくいってないのはその辺りが原因かと…。 まあCALLIDXの場合は、呼び出し元のスプライト管理番号が必ず入るので、そういう面では間違いないですが、逆に配列との矛盾が生じる可能性はありますね…。
0そうだね
プレイ済み
返信[13]
親投稿
ごごちー gogochii
今はこんな感じです 正直まだ理解できたわけじゃないですけど...問題なく動いてます(・ー・)
0そうだね
プレイ済み
返信[14]
親投稿
ごごちー gogochii
spmove
0そうだね
プレイ済み
返信[15]
親投稿
ごごちー gogochii
spfc
0そうだね
プレイ済み
返信[16]
親投稿
実は色々混ざっているのでどんな風に動いているのかがあまり想像できないんですよねー…。部分的には見れてるんですが…。 もし公開キーを出す事に抵抗がなければ、現時点のプログラムの公開キーを出してもらえれば、その動きとプログラムを見てみてコメントをすることも出来ますが、どうでしょうね? でも公開キーを出す事に抵抗があれば、そういう人の気持ちもわかるので大丈夫です。嫌って次から発言しないとかはしませんので、笑
0そうだね
プレイ済み
返信[17]
親投稿
ごごちー gogochii
あとでゲームに組み込む用のプログラムなのでまだゲームとして形になってないですけど...(汗) もし宜しければコードを確認して頂きたいので投稿してみます! 初投稿です!
0そうだね
プレイ済み
返信[18]
親投稿
ごごちー gogochii
公開キー【XKEECEAV】です すごい手軽にアップできるんですね!
0そうだね
プレイ済み
返信[19]
親投稿
公開キーどうもですー。そうなんですよね。手軽なのが良いところですよね。 DLして動作やプログラムを見てみたいと思っています。 ちょっとすぐに返事が出来ない可能性もありますが、必ずチェックしますので〜。
0そうだね
プレイ済み
返信[20]
親投稿
まず軽く見た感じの動作と確認です。 今想定している動作ってどういう動作なイメージですか? とりあえず3秒毎に2体ずつスプライトが登場しているっぽいですよね? それはイメージ通りですか? ちょっと見た感じだと管理番号の管理がゴチャゴチャしている感じで、本当に意図通りの動作なのか謎でした。(たまたまそう見えるだけなのか、とか) なので出来れば、今実装しているプログラムが、どういう処理のイメージなのかとかわかれば、その通りの動作なのかなどがわかると思います。 一応こっちでも再度見てみたりしますが、もし良かったら色々と確認させてください!
1そうだね
プレイ済み
返信[21]
親投稿
とりあえずの意図はわからない部分もあるのですが、今行われている処理と同様の処理を無駄が少なくなるように改変してみたプログラムをアップしました。 公開キーは:TE54F3KJです。 とりあえず今の処理は配列を使っている意味が実はほとんど無くて、最低限の部分だけ残すと公開キーで公開したようなプログラムになるんです。 もしかして削りすぎたことで今後追加していく上で問題があるのかもしれませんが、とりあえず現時点での動作は再現出来ているはずですので参考にしてみてください。 改変したプログラムについてなんでそうなったのかとかの説明が欲しいときは、質問してくれれば答えますのでー…。 と言いつつ実は今日投稿できる回数があと4回になってしまっています…。いつ回数が増えるかわからないですが、そんな感じなので投稿できなくて返事が遅れることがあるかもしれませんが、その時はすいません。
1そうだね
プレイ済み
返信[22]
親投稿
投稿数が回復したので、少しだけコメントをプラスします。 主な改良としては、たくさんある配列がほとんど使い捨て程度にしか使われてなかったのでバッサリと削除しました。スプライトが使用されているかどうかはSPSET前ならSPUSEDという命令が利用出来るので、それを利用して使用スプライト(管理番号)を判別しています。 またCALL SPRITEで呼び出されるスプライトはCALLIDXで管理番号を得られるので、その番号をそのまま生かせば配列は不要になるので、そこも変わっています。 と言うことで今生きている配列は、3秒毎にスプライトを登場させる時に同じ場所(目的地?)に出ないようにチェックする為の配列だけになっています。 改良したプログラムも完全な意味で最適というわけじゃなくて、今の動作をトレースしつつ無駄を省くという感じで書き換えた感じです。その意味での問題は残ってるかも?
1そうだね
プレイ済み
返信[23]
親投稿
ごごちー gogochii
拝見しました 改良してくださりありがとうございます! SP[25]としたのは、25このスプライトを5ずつで区切って5種類の機能を持たせたかったからです。 右へ流れていくスプライトにタッチすることで場面移動を行おうとしています。たとえばお店やダンジョンなどです。移動先での用が済んだらまたもとの画面に戻るので、スプライトの座標を記録しておきたかったのです
0そうだね
プレイ済み
返信[24]
親投稿
ごごちー gogochii
こんな感じです
0そうだね
プレイ済み
返信[25]
親投稿
ごごちー gogochii
未完成品ですが仕様を確認していただきたい(お忙しそうなので無理にとは言えませんが...)ので本編の方も上げたいと思います なお、スプライト移動の仕組みなどは教えていただく前の物となっていますので御了承下さい
0そうだね
プレイ済み
返信[26]
親投稿
ごごちー gogochii
公開キー【PKENX54Y】です バトルシステムはネットで公開してたものを若干改良したものです
0そうだね
プレイ済み
返信[27]
親投稿
なるほど〜。そうなると多少は変わってくるとは思いますが、ただ配列の使い方は調整した方が組みやすくなりそうな気がしますね。とくに管理番号はスプライト表示の中心なので、管理番号を元(インデックス)に他のデータを管理する方法もあるかと思います。 それとスプライトにも8つまでの値なら持たせるSPVARという機能もあるので、それを使いこなせるようになると、もっとやりやすくなる可能性もありますね。 スプライトの座標の記録に関しては数にもよりますが移動先で同じスプライト管理番号を使わないようにして一時的にスプライトを止める&非表示にしておくという方法もありますね。まあそうじゃないにしても常に記録しなくても画面を切り替える時に、配列などに待避させるという方法でも良いような気がします。 という感じではありますが、とりあえず新しい方の公開キーの内容も見てみますね。
1そうだね
プレイ済み
返信[28]
親投稿
DLして軽く見てみました。なるほど〜。グラフィックがないので星座のままでしたがスクリーンショットも含めてなんとなくイメージがわかりました。 25個のスプライトを5つに区切って5種類の機能を持たせる場合、僕だったらスプライト管理番号は0〜24固定で管理番号の組で分けるかなぁ…? 種類はその管理番号で判断するか、それともスプライトに割り当ててある絵の定義番号で判別する感じで。 もしそれ以上の情報がスプライトに必要な場合は、先ほど話したSPVARなどを使ってスプライトに値として持たせておきます。 もしくは、管理番号を配列の要素番号にして別の配列変数に追加データとして記録しておく感じかな。
1そうだね
プレイ済み
返信[29]
親投稿
流れたスプライトをタッチして場面展開する場合は、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そうだね
プレイ済み
返信[30]
親投稿
あ、 BX[I]=BY[I]=-99999 '未使用という意味 この書き方、プチコンでは出来なかったかも? その場合は素直に、 BX[I]=-99999 BY[I]=-99999 とします。(BXだけで判断できるのならBYは値を入れなくてもいいかもだけど)
1そうだね
プレイ済み
返信[31]
親投稿
ちょっと僕が解説した内容にした始めのサンプルをアップしました。 公開キー:PK2KV54X 変更点は以下の通りです。 1:スプライト定義番号によって5つの種類に変更しています。 2:カウンタにMAINCNTを使う場合、カウンタを止めることが出来ないので自分でカウンタを用意しました。(SCNT) 3:出現時の重なりチェックをスプライトの当たり判定にして配列は廃止しました。 4:SPANIMを少し変えてスピードと距離を一定にしました。(ので距離はあらかじめ少し長くしています) 5:距離を長くした関係でアニメーションが終わるより前に画面外に出るので、画面外に出たときにスプライトを消去するように変更しました。 6:Yボタンを押した時に画面切り替えを仮定してスプライトを消しました。Aボタンで再開(復元)します。
1そうだね
プレイ済み
返信[32]
親投稿
という感じで、話していた内容に近い処理になっているはずです。この考え方が僕の解説したやり方に近い方法です。 あとは自分のやり方に合わせてカスタマイズすれば希望に近い動作になるような気がしますが、本編を改良したわけではないので、その辺は使えそうな部分を組み合わせて……って感じかなと思います。 頑張ってください!
1そうだね
プレイ済み
返信[33]
親投稿
ごごちー gogochii
すみませんコメントする場所まちがえました:~: でんべんさんが改めて立ててくださったトピックスのほうのコメントは削除してください 改めて、ありがとうございました。
1そうだね
プレイ済み