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


HSPTV!掲示板


未解決 解決 停止 削除要請

2009
0808
mixwater跳ね返ったとき6解決


mixwater

リンク

2009/8/8(Sat) 18:40:43|NO.26899

今左からやってくるボールをボードで打ち返すというゲームを作っています。


dim px//キャラx座標 dim py//同y座標 dim zy//反射時のずれ px=10//X初期座標の設定 mouse -1 repeat redraw 0 syscolor 15 boxf color pos 0,0 mes"ポイント:"+point+"" //もしどちらかの壁についていたら、Y座標をランダムにする if ok=0:{ randomize py=rnd(ginfo(13)-20) ok=1 } //加算減算 変数swはこの加算するかどうかのスイッチ //反射時の変数もここで設定 if sw=0:px+7 if sw=1:{ zy=rnd(11) px-7 py-zy } //ボールの生成 pos px,py mes "●" //ボードの生成 pos mousex,mousey color 255,0,0 boxf mousex-1,mousey-40,mousex+1,mousey+40 //接触の判断 ;壁接触 if px<0+1:px=10:ok=0:sw=0:point+1 if px>ginfo(12)-20:px=10:ok=0:sw=0:point-1 ;ボード接触 if px>mousex-10&py>mousey-40&py<mousey+40:{ sw=1 zysw=rnd(1)//ずれの上下を設定 } redraw 1 wait 1 loop


このスクリプトで実行すると、跳ね返ったときにボールが震えてしまいます。
どうすれば防げるのでしょうか?



この記事に返信する


mixwater

リンク

2009/8/8(Sat) 18:41:56|NO.26900

zysw=rnd(1)//ずれの上下を設定
すみません。これは気にしなくていいです。



Ve

リンク

2009/8/8(Sat) 19:29:40|NO.26902


dim px//キャラx座標 dim py//同y座標 dim zy//反射時のずれ px=10//X初期座標の設定 mouse -1 repeat redraw 0 syscolor 15 boxf color pos 0,0 mes"ポイント:"+point+"" //もしどちらかの壁についていたら、Y座標をランダムにする if ok=0:{ randomize py=rnd(ginfo(13)-20) ok=1 } //加算減算 変数swはこの加算するかどうかのスイッチ //反射時の変数もここで設定 ;反射前 if sw=0{ px+7 } ;反射後 if sw=1:{ ;zy=rnd(11) px-7 py-zy } //ボールの生成 pos px,py mes "●" //ボードの生成 pos mousex,mousey color 255,0,0 boxf mousex-1,mousey-40,mousex+1,mousey+40 //接触の判断 ;壁接触 if px<0+1:px=10:ok=0:sw=0:point+1 if px>ginfo(12)-20:px=10:ok=0:sw=0:point-1 ;ボード接触 if px>mousex-10&py>mousey-40&py<mousey+40:{ sw=1 zysw=rnd(1)//ずれの上下を設定 ;━━━━━━━━━━━━━━ ; 追加行 ;━━━━━━━━━━━━━━ ;角度を固定するなら zy=??←数字 ;ランダムで上下へ zy=rnd(5) : zy-=rnd(5) } redraw 1 wait 1 loop



Ve

リンク

2009/8/8(Sat) 19:35:10|NO.26903

原因は zy=rnd(11)の挿入行。
毎回実行される場所に入れると毎回値が変わってブルブル震える。

後、repeat〜loopやif〜の中は、
TABで実行される処理を分かりやすくした方が良いよ。



mixwater

リンク

2009/8/8(Sat) 19:42:11|NO.26905

なめらかにいきました。
ありがとうございます。



SATTO

リンク

2009/8/8(Sat) 19:49:15|NO.26906


if sw=1:{ zy=rnd(11) px-7 py-zy }
この部分でswが真のときは毎回y座標の変位が変わってしまうのが原因ですね
基本的に移動する物体の座標を管理する場合は、物体の座標と変位量(ベクトル)を分けて保存
したほうがいいとおもいます
Veさんがやっているように、物体の移動を変化させたい時に変位量の変数を書き換えてやれば
物体が移動するための処理をいちいち書き換えなくても、座標変数に変位量変数を足してやる
だけでよくなります
たとえばこんな感じで

randomize screen 0, 640, 480 //玉の座標 x = ginfo(12)/2 y = ginfo(13)/2 //玉のベクトル vecx = rnd(5) vecy = rnd(5) mes "●" //玉の大きさ w = ginfo(14) h = ginfo(15) repeat //玉の移動 x += vecx y += vecy //壁に当たったら、ベクトルの符号を変える if (x < 0) | (x > ginfo(12)-w) : vecx = -vecx if (y < 0) | (y > ginfo(13)-h) : vecy = -vecy //画面の初期化 color 255,255,255 : boxf //玉の描画 color 0,0,0 : pos x, y mes "●" redraw 1 :redraw 0 await 10 loop



mixwater

リンク

2009/8/8(Sat) 21:01:42|NO.26909

プラスになることをありがとうございます。
まだベクトルの意味がよく分かっていないものですが、勉強して理解していこうと思います。



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