プレイ日記
ごごちー gogochii
質問です。スプライトをランダムに配置する際にスプライトが重ならないようにするにはどうすればいいでしょうか?
4そうだね
プレイ済み
返信[1]
親投稿
Hanzo rzsense
重なったら配置し直す、 ではダメですか?
1そうだね
プレイ済み
返信[2]
親投稿
ごごちー gogochii
えーと...SPCOLとか使うということでしょうか? ...やってみます!(`・ω・´)>
0そうだね
プレイ済み
返信[3]
親投稿
Hanzo rzsense
そうです。SPCOL と SPHITSP を使って、スプライトの重なりを判定します。 やってみて分からなかったら、添付を参考にしてみてください。添付は、64個のスプライトを1個ずつランダムに配置しますが、その際、既に置いたスプライトと重なってたら、重ならなくなるまで再配置を繰り返します。 ・・・と言っても、プチコンは処理が速いので、再配置を含めて一瞬で終わりますけどね。
1そうだね
プレイ済み
返信[4]
親投稿
ごごちー gogochii
こんな感じでやってみたのですが スプライトが画面の左上でチラツいてる状況です... SPCOLの使い方などツッコミ所があれば教えてくれるとありがたいです
0そうだね
プレイ済み
返信[5]
親投稿
ごごちー gogochii
コメントありがとうございます! さっそく試してみます!
0そうだね
プレイ済み
返信[6]
親投稿
Hanzo rzsense
既にお気づきであれば、入れ違いで恐縮ですが、添付していただいたプログラムには、次のようなツッコミどころがあります。 1.スプライトの衝突を判定したら、@FURIに戻って繰り返そうとしているようですが、そのたびにSPSETを実行しているのがよくないです。SPSETは、指定管理番号のスプライトを初期化します。SPSET直後のスプライトの初期位置は(0,0)、すなわち左上になります。 2.@FURIループの中では、スプライトの位置をランダムに変えて、スプライト同士の重なりがあるかないかを確かめなければならないのに、SPOFSでは固定座標(-16,-16)を指定してしまっています。 つまり、SPSETでスプライトの座標が(0,0)になり、直後のSPOFSで(-16,-16)になる、これを延々と繰り返しているようです。
0そうだね
プレイ済み
返信[7]
親投稿
ごごちー gogochii
こんな感じにしてみましたがうまくいきません...
0そうだね
プレイ済み
返信[8]
親投稿
Hanzo rzsense
今気がつきましたが、これは、10×3のマスの中に、DMX+1個(6個?)のスプライトを配置する、ということですよね? だとすると、自分で言っといて何ですが、SPHITSPを使うのはあまりかしこいやりかたではなさそうです。 多分、最初にやろうとしていたように、10×3の2次元配列を使って、スプライトのあるなしを管理して、既にスプライトが置いてあれば再配置する、とやるのが筋です。 じゃあなぜ最初そうしようとしていたのにできなかったか、ですが、スプライトの座標を(0,0)~(9,2)のマス目で管理するのか、実際の表示座標で管理するのかが混同されているような気がします。
1そうだね
プレイ済み
返信[9]
親投稿
ごごちー gogochii
54行目でout of rangeになっちゃうのですがどこがDX[I]の値にマイナスが入るとまずかったりしますか?
0そうだね
プレイ済み
返信[10]
親投稿
ごごちー gogochii
訂正、22行目でした
0そうだね
プレイ済み
返信[11]
親投稿
この場合のマイナスはNG。Hanzoさんも指摘しているように、なんか混同しておかしくなってる印象を受けますね
1そうだね
プレイ済み
返信[12]
親投稿
Hanzo rzsense
DX[I]は、そのままDP配列の添字(そえじ)になりますが、配列の添字にマイナスを指定するのはNGです。Out of range(範囲外)エラーになりませんでしたか? DX[I]が表示座標だとしても、マイナスを指定する理由が分からず、恐縮ですが・・・ なるべく、ごごちーさんの意図を汲んだ形でプログラムを作ってみましたので、添付をご参照ください。
0そうだね
プレイ済み
返信[13]
親投稿
ごごちー gogochii
とても参考になります! 何から何まですみません
0そうだね
プレイ済み
返信[14]
親投稿
Hanzo rzsense
10×3の計30のマス目のうち、例えば最上列の10マスにスプライトを並べて、マス目ごとシャッフルすれば、スプライトが重ならない配置が実現できそうです。この場合、スプライトが重なることによる再配置を考えなくて済むので、処理時間的にも無駄がありません。 このようなアルゴリズムを、フィッシャー・イェーツ(Fisher-Yates)のアルゴリズムと言いまして、例えば添付のように実行します。 同じ目的を達成するために、実にいろいろなやり方を選択できるのが、プチコンプログラミングの面白いところですね。
1そうだね
プレイ済み
返信[15]
親投稿
Hanzo rzsense
あ、間違えました! 先ほどのプログラム、18行目は SWAP DS[I],DS[RND(30-I)+I] が正しいです。恐縮です。
1そうだね
プレイ済み
返信[16]
親投稿
ごごちー gogochii
SWAP文ではDS[I]のIをl以上30以内のランダムな番号にしているのでしょうか? あと話が変わるのですが、マス目上に配置したスプライトを動かすにはどうすればいいでしょうか...!><
0そうだね
プレイ済み
返信[17]
親投稿
ごごちー gogochii
動かない...
0そうだね
プレイ済み
返信[18]
親投稿
Hanzo rzsense
スプライトをどのように動かしたいのかがよく分かりませんが、例えば添付のようなものは参考になりますか?
0そうだね
プレイ済み
返信[19]
親投稿
ごごちー gogochii
作ってみました! マス目のボードごと右に動かす、もしくはスプライトを右にスクロールさせたいのです...
0そうだね
プレイ済み
返信[20]
親投稿
Hanzo rzsense
こんな感じですか?
1そうだね
プレイ済み
返信[21]
親投稿
ごごちー gogochii
そんな感じです!ありがとうございます! ...ちなみにこのプログラムでスプライトにタッチとかできますか? BGを使ったことがなくて... とにかく、ありがとうございます!
0そうだね
プレイ済み
返信[22]
親投稿
Hanzo rzsense
スプライトをタッチできるようにするには、新たに次のような処理が必要で、そのためには、()内の命令を使います。 ・今まで上画面に表示させていたものを、下画面に表示させる  (XSCREEN, DISPLAY) ・タッチペンの位置情報取得  (TOUCH OUT) ・タッチペンとスプライトの衝突判定  (SPCOL, SPHITRC)
0そうだね
プレイ済み