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


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
0219
q跳ね返り4解決


q

リンク

2013/2/19(Tue) 16:14:05|NO.52502

このように円とのあたり判定はうまくいったものの、球の跳ね返りがおかしくなってしまいます。
物がぶつかり合う時の跳ね返りのようにできないでしょうか。

十字キーで球を作動


gsizex=500:gsizey=500;画面サイズ screen 0,gsizex,gsizey randomize //----必要情報割り当て spedx=0.00:spedy=0.00;キャラの速度 mpsx=100.00:mpsy=100.00;キャラの位置 mstu=0.0005;摩擦 prset=0.002;加速度 enekepx=0.00:enekepy=0.00;エネルギーのキープ用 //----キャラ情報作成(半径) kysize=10;キャラの半径 //----障害物 sskap=5;作成するオブジェクト数 dim sdai,sskap;オブジェクトの種類(0=無,1=円,2=正方形) dim smpsx,sskap:dim smpsy,sskap;位置 dim skysize,sskap;半径サイズ //----障害物作成 repeat sskap sdai(cnt)=1 smpsx(cnt)=rnd(gsizex-100)+100:smpsy(cnt)=rnd(gsizey-100)+100 skysize(cnt)=50 loop onexit *dend;win8ではエラーになるのでとりあえず記入 *main //----キー入力 stick key,15 if key=1{enekepx-prset} if key=2{enekepy-prset} if key=4{enekepx+prset} if key=8{enekepy+prset} if key=3{ enekepx-prset*sqrt(2):enekepy-prset*sqrt(2)};斜めは詳細値を取得 if key=6{ enekepy-prset*sqrt(2):enekepx+prset*sqrt(2)} if key=12{ enekepx+prset*sqrt(2):enekepy+prset*sqrt(2)} if key=9{ enekepy+prset*sqrt(2):enekepx-prset*sqrt(2)} //----摩擦 if enekepx<0{enekepx+mstu}if enekepx>0{enekepx-mstu} if enekepy<0{enekepy+mstu}if enekepy>0{enekepy-mstu} //----壁とのあたり判定 if 0>=mpsx-kysize|gsizex<=mpsx+kysize | 0>=mpsy-kysize|gsizey<=mpsy+kysize{ enekepx*-1:enekepy*-1} //----エネルギーを位置に増加 mpsx+enekepx:mpsy+enekepy //----キャラの表示 circle mpsx-kysize,mpsy-kysize,mpsx+kysize,mpsy+kysize //----障害物とのあたり判定 repeat sskap if sdai(cnt)=1{//円の場合 circle smpsx(cnt)-skysize(cnt),smpsy(cnt)-skysize(cnt) , smpsx(cnt)+skysize(cnt),smpsy(cnt)+skysize(cnt) color 255,0,0:circle smpsx(cnt)-3,smpsy(cnt)-3 , smpsx(cnt)+3,smpsy(cnt)+3:color;中心の赤い丸 x=smpsx(cnt)-mpsx:y=smpsy(cnt)-mpsy kyr=sqrt(x*x+y*y);キャラとの距離 if skysize(cnt)+kysize>=kyr{ enekepx*-1:enekepy*-1 } } loop redraw 1:await 1:redraw 0 color 255,255,255:boxf:color goto *main *dend end



この記事に返信する


@key

リンク

2013/2/19(Tue) 17:07:52|NO.52504

キーを押しても動かねぇ・・・って思ってたら長押しでじわじわ動いた

動作を見た感じ、当たると進行方向を反転にしてるだけのようです
リアルにするには壁の角度と進行角度を考慮して計算して処理しましょう


あと根本的な問題として、xy加速度で処理するのではなく移動速度と進行角度で処理するほうが
反射処理などが楽・・・・・・・かもしれません



saku

リンク

2013/2/19(Tue) 19:33:56|NO.52505

一例ですが、反射ベクトルを使った方法を書いてみました。
ベクトルについては、このページがとても参考になりました。→ ttp://hakuhin.jp/as/vector.html
qさんのスクリプトと違い、
・斜め移動時・平行移動時、常に速度を一定にする処理は行っていません
・画面端の判定はしておりません


randomize screen 0,500,500 mx = 100f : my = 100f : mrad = 10f ; 自機 座標 / 半径 mxv = 0f : myv = 0f : ma = 0.1 ; 自機 速度 / 加速度 masatu = 0.98 ; 摩擦力 enum = 15 ; 障害物の数 ddim ex,enum : ddim ey,enum : ddim erad,enum ; 障害物 座標 / 半径 // 障害物の配置 repeat enum ex(cnt) = double( rnd( 500 ) ) ; 自機と当らない位置に生成 if ex(cnt) < 250 : a = 250f : b = 250f : else : a = 500f : b = 0f ey(cnt) = double( rnd( a ) ) + b erad(cnt) = double( rnd( 40 ) ) + 30f loop *main // キー入力 stick key,15 if key & 1 : mxv - ma if key & 4 : mxv + ma if key & 2 : myv - ma if key & 8 : myv + ma mx + mxv : my + myv ; 座標に速度加算 mxv * masatu : myv * masatu ; 摩擦 // 障害物との当り判定 repeat enum dx = mx - ex(cnt) : dy = my - ey(cnt) ; dx,dy = 自機と障害物の座標の差 ベクトル a = mrad + erad(cnt) ; a = 自機の半径 + 障害物の半径 leng = sqrt( dx*dx + dy*dy ) ; leng = 自機と障害物の距離 if leng < a { b = 1f / leng : dx * b : dy * b ; dx,dy を 正規化 mx = ex(cnt) + dx * (a+0.1) : my = ey(cnt) + dy * (a+0.1) ; 自機を障害物の外に移動 t = -( dx * mxv + dy * myv ) / ( dx * dx + dy * dy ) ; 反射ベクトルで当った後の速度を決める mxv = mxv + t * dx * 2f : myv = myv + t * dy * 2f } loop // 画面描画 color 255,255,255 : boxf ; 背景 color : circle mx - mrad, my - mrad, mx + mrad, my + mrad ; 自機 repeat enum ; 障害物( 黒部分 ) circle ex(cnt) - erad(cnt), ey(cnt) - erad(cnt), ex(cnt) + erad(cnt), ey(cnt) + erad(cnt) loop color 255 repeat enum ; 障害物( 赤部分 ) color 255 : circle ex(cnt) - 3, ey(cnt) - 3, ex(cnt) + 3, ey(cnt) + 3 loop redraw 1 : redraw 2 : await 15 goto *main



GENKI

リンク

2013/2/20(Wed) 01:13:25|NO.52511

こういうのってベクトル習う前だったりすると結構きついですよね…といいつつベクトルをつかった説明をする。

自機も相手も円なのでこの場合は、衝突時に受ける力のベクトルはそれぞれの中心から中心に向かう方向です。
摩擦は円周方向(半径と垂直方向)になります。

向きさえあってれば後は適当でもそれっぽく見える気がします!(適当)




昔てきとうに書いた資料でよければどうぞ。

物理のおおまかな話 - HSP開発wiki
http://hspdev-wiki.net/?%CA%AA%CD%FD%A4%CE%A4%AA%A4%AA%A4%DE%A4%AB%A4%CA%CF%C3



q

リンク

2013/2/20(Wed) 17:47:01|NO.52515

なるほど、
ベクトル、ソースをよく見てみたのですが、かなり難しかったです。
実行してみましたが、これでもゲームになるのではないかと感動しました!(>>52505)
私もまだまだ初歩的な者ですが、できるところから始めたいと思います。



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