HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2016
1226
アイドル複数の反射の処理2解決


アイドル

リンク

2016/12/26(Mon) 22:34:30|NO.77731

少しお久しぶりです。
物体にぶつかったとき、反射するプログラムを書いているのですが、複数の物だとうまくいかなくって困っています。


「配列0個目の四角と、配列0個目の丸」
「配列1個目の四角と、配列1個目の丸」
上記の場合はうまくいくのですが。

「配列0個目の四角と、配列1個目の丸」
「配列1個目の四角と、配列0個目の丸」
上記の場合は変な挙動をおこします。

原因は、「0個同士」「1個同士」でしか見れてないのが原因だと思うのですが、
後ひと押しの処理がどうしても思いつかないのです。
いつもならなんとかなってたのですが、どうも何も思いつかなくって困っています。

それではよろしくお願いします(。´Д⊂)



screen 0,500,480 ;*************情報**************** ;■ SIKAKU_MAX = 2 dim SIKAKU_x,SIKAKU_MAX ;X dim SIKAKU_y,SIKAKU_MAX ;Y ;● MARU_MAX = 2 dim MARU_f,MARU_MAX ;フラグ dim MARU_x,MARU_MAX ;X dim MARU_y,MARU_MAX ;Y dim MARU_IDO_x,MARU_MAX ;移動X dim MARU_IDO_y,MARU_MAX ;移動Y ;*************座標**************** ;■ SIKAKU_x = 150,100 SIKAKU_y = 200,50 ;● MARU_x = 250,250 MARU_y = 50,200 ;200,50だとちゃんと反射する ;***********メインループ********** *メイン redraw 0 : color : boxf ;************カウンター*********** color ,255 pos 420,100 : mes "hit " + hit ;********************************* gosub *処理 gosub *四角VS丸 ;******************************* ;■ repeat SIKAKU_MAX ;最大数(2) pos SIKAKU_x(cnt),SIKAKU_y(cnt) : mes "■"+(cnt) loop ;● color 255 repeat MARU_MAX;最大数(2) pos MARU_x(cnt),MARU_y(cnt) :mes "●"+(cnt) loop redraw : await 15 goto *メイン ;**************処理************ *処理 repeat MARU_MAX ;最大数(2) if MARU_f(cnt) = 0 { MARU_f(cnt) = 1 ;フラグを「立てる」 MARU_IDO_x(cnt) = 1 ;移動X } ;画面端にぶつかったら反射する if MARU_x(cnt)!limit(MARU_x(cnt), 42,412-24) : MARU_IDO_x(cnt)* = -1 MARU_x(cnt) + MARU_IDO_x(cnt) * 4 ;スピード loop return ;***********四角VS丸**************** *四角VS丸 repeat MARU_MAX ;最大数(2) MARU_xx = MARU_x(cnt) MARU_yy = MARU_y(cnt) repeat SIKAKU_MAX ;最大数(2) if (SIKAKU_x(cnt) < MARU_xx+10) AND (SIKAKU_x(cnt)+10 > MARU_xx) AND (SIKAKU_y(cnt) < MARU_yy+10) AND (SIKAKU_y(cnt)+10 > MARU_yy) { hit += 1 // repeat MARU_MAX ;最大数(2) // (0)→(1)で判定しようと思ったけど、これもダメだった MARU_IDO_x(cnt)=-MARU_IDO_x(cnt);四角にぶつかったら、移動をマイナスする // loop }loop loop return



この記事に返信する


スペース

リンク

2016/12/26(Mon) 23:29:52|NO.77732

あれ、単純に移動をマイナスにする処理に問題があるのでは?

MARU_IDO_x(cnt)=-MARU_IDO_x(cnt)
これが書かれてる位置は四角に関するループですよね?
何故そのループのcntをそのまま丸に関する配列変数に使っているのでしょう。
適当な変数(このサンプルではct)にrepeat MARU_MAXのcntを記録しておいて、
移動をマイナスにする処理でcntの代わりにその変数を指定すれば、とりあえず上手くいきました。

*四角VS丸 repeat MARU_MAX ;最大数(2) MARU_xx = MARU_x(cnt) MARU_yy = MARU_y(cnt) ct=cnt repeat SIKAKU_MAX ;最大数(2) if (SIKAKU_x(cnt) < MARU_xx+10) AND (SIKAKU_x(cnt)+10 > MARU_xx) AND (SIKAKU_y(cnt) < MARU_yy+10) AND (SIKAKU_y(cnt)+10 > MARU_yy) { hit += 1 // repeat MARU_MAX ;最大数(2) // (0)→(1)で判定しようと思ったけど、これもダメだった MARU_IDO_x(ct)=-MARU_IDO_x(ct);四角にぶつかったら、移動をマイナスする // loop }loop loop return

一応保険をかけます。
プログラム全体を完全に理解しているわけではないので間違っていたらごめんなさい。



アイドル

リンク

2016/12/27(Tue) 20:15:12|NO.77742


*四角VS丸 repeat MARU_MAX ;最大数(2) ct=cnt repeat SIKAKU_MAX ;最大数(2) if (SIKAKU_x(cnt) < MARU_xx+10) AND (SIKAKU_x(cnt)+10 > MARU_xx) AND (SIKAKU_y(cnt) < MARU_yy+10) AND (SIKAKU_y(cnt)+10 > MARU_yy) { MARU_IDO_x(ct)=-MARU_IDO_x(ct);四角にぶつかったら、移動をマイナスする }loop loop return

「repeat MARU_MAX ;最大数(2)」の後に、
cnt値を変数に入れないといけなかったのはわかってたんだけど、何故か


MARU_IDO_xx=cnt 「MARU_IDO_xx(cnt)=-MARU_IDO_xx(cnt)」

ってやっちゃったんですよね・・・そりゃうまくいかないわけだわ・・・
cnt値を変数に入れてやったら動作しました。これで問題ないです。
スペースさんありがとうございます!



ONION software Copyright 1997-2021(c) All rights reserved.