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


HSPTV!掲示板


未解決 解決 停止 削除要請

2019
0310
名無三OBAQにて回転を固定7未解決


名無三

リンク

2019/3/10(Sun) 17:36:34|NO.86856


randomize #include "obaq.as" bgscr 0,ginfo_dispx,ginfo_dispy,0,0,0 qreset//OBAQの初期化 mapsize=ginfo_winy-20. players=5 dim wkey,players dim skey,players dim akey,players dim dkey,players dim my,players ddim xpos,players ddim zpos,players ddim speed,players ddim yrad,players ddim yradadd,players repeat players x1= 1.7 y1=-3.0 y2= 3.0 model=-x1,y1 , -x1,y2 , x1,y2 , x1,y1 xpos(cnt)=20.*cnt zpos(cnt)=20.*cnt loop //背景指定 qcnvaxis var_x1,var_y1,-mapsize/2,-mapsize/2,1 qcnvaxis var_x2,var_y2, mapsize/2, mapsize/2,1 qborder var_x1,var_y1,var_x2,var_y2 qgravity 0,0 repeat players qcnvaxis var_x,var_y,xpos(cnt)+ginfo_winx/2,zpos(cnt)+ginfo_winy/2,1 qaddmodel my(cnt),model,-1, var_x,var_y,0,1.0,1.0,colsw_active,1,,1 qweight my(cnt) , 24.0 , 0.01 qinertia my(cnt) , 0.95 , 1.0 loop repeat // stick key if key&128 { end } getkey wkey(0),'W' getkey skey(0),'S' getkey akey(0),'A' getkey dkey(0),'D' repeat players speed(cnt)*0.0:yradadd(cnt)*0.0; カーソルキーで操作 if wkey(cnt) : speed(cnt)=-0.02 ; カーソルキーで操作 if skey(cnt) : speed(cnt)= 0.02 ; カーソルキーで操作 if akey(cnt) : yradadd(cnt)=-0.01 ; カーソルキーで操作 if dkey(cnt) : yradadd(cnt)= 0.01 ; カーソルキーで操作 loop repeat players qspeed my(cnt), -speed(cnt)*sin(yrad(cnt)),speed(cnt)*cos(yrad(cnt)),yradadd(cnt),2 loop repeat players qgetpos my(cnt),var_x,var_y,yrad(cnt) qcnvaxis ans_x,ans_y,var_x,var_y,0 xpos(cnt)=double(ans_x-ginfo_winx/2) zpos(cnt)=double(ans_y-ginfo_winy/2) loop //DRAW redraw 0 qexec//OBAQによるオブジェクトの更新 color:boxf repeat players qcollision my(cnt) qgetcol i,colx,coly if i>=0 { color 255,255,0 qcnvaxis ix,iy,colx,coly pos ix,iy:mes "HIT!" } loop qdraw//オブジェクトの描画 color 0,255,0 repeat players pos 150*cnt,0 mes "PLAYER : "+cnt mes "X : "+xpos(cnt) mes "Y : "+zpos(cnt) mes speed(cnt)* 60. *3.6 mes rad2deg(yrad(cnt)) loop redraw 1 await 1000./60. loop

こんな感じにできてきてはいるのですが、なるべく回転しないように(移動にのみ物理を適応)したい
です。
qposでは座標も指定が必要ようなので使えなさそうです…回転のしやすさなどを変更することはできませんか?



この記事に返信する


あり

リンク

2019/3/10(Sun) 20:00:03|NO.86858

回転のし易さはqweightのモーメント値で決まりますが
回転を完全に固定したければqtypeでtype_bindRを指定して下さい。



名無三

リンク

2019/3/10(Sun) 22:56:27|NO.86865

もう1度試してみましたが、それでは自機の回転も制限されるのではないですか?



あり

リンク

2019/3/10(Sun) 23:37:37|NO.86866

各パラメーターはオブジェクト毎に設定できるので大丈夫です。
例えばオブジェクト作成部分を以下のようにすれば自機のみ回転可能になります。

repeat players qcnvaxis var_x,var_y,xpos(cnt)+ginfo_winx/2,zpos(cnt)+ginfo_winy/2,1 qaddmodel my(cnt),model,-1, var_x,var_y,0,1.0,1.0,colsw_active,1,,1 qweight my(cnt) , 24.0 , 0.01 qinertia my(cnt) , 0.95 , 1.0 if cnt >= 1 : qtype my(cnt), type_bindR ; 自機以外の回転を禁止 loop



名無三

リンク

2019/3/11(Mon) 07:24:22|NO.86870

なるほど…ありがとうございます。
qweightについてなのですが、モーメントが小さいほど回りやすいのは何故でしょうか?



名無三

リンク

2019/3/11(Mon) 07:26:53|NO.86871

すいません、リファレンスに求める式がありましたね…家に帰り次第色々変更してみます



名無三

リンク

2019/3/12(Tue) 22:09:59|NO.86883


randomize #include "obaq.as" bgscr 0,ginfo_dispx,ginfo_dispy,0,0,0 qreset//OBAQの初期化 acrobaq=1.0 mapsize=ginfo_winx/acrobaq players=5 dim wkey,players dim skey,players dim akey,players dim dkey,players dim my,players ddim xpos,players ddim zpos,players ddim speed,players ddim yrad,players ddim yradadd,players repeat players x2=-1.75 x1= 1.75 y2= 3.55 y1=-3.51 model= x2,y1 , x2,y2 , x1,y2 , x1,y1 xpos(cnt)=10.*cnt zpos(cnt)=10.*cnt loop //背景指定 qcnvaxis var_x1,var_y1,-mapsize*acrobaq/2,-mapsize*acrobaq/2,1 qcnvaxis var_x2,var_y2, mapsize*acrobaq/2, mapsize*acrobaq/2,1 qborder var_x1,var_y1,var_x2,var_y2 qgravity 0,0 repeat players qaddmodel my(cnt),model,-1, xpos(cnt),zpos(cnt),0,acrobaq,acrobaq,colsw_active,1,,1 qweight my(cnt) , 24.0 , 1000.0 qinertia my(cnt) , 0.95 , 1.0 loop frate=60. repeat // stick key if key&128 { end } getkey wkey(0),'W' getkey skey(0),'S' getkey akey(0),'A' getkey dkey(0),'D' maxspd = (60./3.6);/frate maxspdback = (20./3.6);/frate trunspd = deg2rad(54); /frate repeat players player=cnt if wkey(player)+skey(player)=0 {speed(player)*0.95} if wkey(player)=1{ speed(player)+maxspd/(frate*5.) if speed(player)>=maxspd{speed(player)=maxspd} } if skey(player)=1{ speed(player)-maxspdback/(frate*0.5) if speed(player)<=-maxspdback{speed(player)=-maxspdback} } if dkey(player)+akey(player)=0 {yradadd(player)*0.95} if akey(player)=1{ yradadd(player)+trunspd/(frate*0.5) if yradadd(player)>=trunspd{yradadd(player)=trunspd} } if dkey(player)=1{ yradadd(player)-trunspd/(frate*0.5) if yradadd(player)<=-trunspd{yradadd(player)=-trunspd} } /* yrad(cnt)+yradadd(cnt) xpos(cnt)-speed(cnt)*sin(-yrad(cnt)) zpos(cnt)-speed(cnt)*cos(-yrad(cnt)) */ qspeed my(cnt), speed(cnt)*sin(-yrad(cnt)),speed(cnt)*cos(-yrad(cnt)),yradadd(cnt),1 loop repeat players qgetpos my(cnt),xpos(cnt),zpos(cnt),yrad(cnt) loop //DRAW redraw 0 qexec//OBAQによるオブジェクトの更新 color:boxf repeat players qcollision my(cnt) qgetcol i,colx,coly if i>=0 { color 255,255,0 qcnvaxis ix,iy,colx,coly pos ix,iy:mes "HIT!" } loop qdraw//オブジェクトの描画 color 0,255,0 repeat players pos 150*cnt,0 mes "PLAYER : "+cnt mes "X : "+xpos(cnt) mes "Y : "+zpos(cnt) mes speed(cnt);* 60. *3.6 mes rad2deg(yrad(cnt)) loop redraw 1 await 1000./60. loop

速度値などを実際に使用する値にしたのですが、なぜか動きません…なにゆえ…



k

リンク

2019/3/15(Fri) 21:54:25|NO.86912

最初のスクリプトの前半部分を入れ替えたら動きましたが
細かい部分までは検証できていません^^;

randomize #include "obaq.as" bgscr 0,ginfo_dispx,ginfo_dispy,0,0,0 qreset//OBAQの初期化 mapsize=ginfo_winy-20. players=5 dim wkey,players dim skey,players dim akey,players dim dkey,players dim my,players ddim xpos,players ddim zpos,players ddim speed,players ddim yrad,players ddim yradadd,players repeat players x1= 1.7 y1=-3.0 y2= 3.0 model=-x1,y1 , -x1,y2 , x1,y2 , x1,y1 xpos(cnt)=20.*cnt zpos(cnt)=20.*cnt loop //背景指定 qcnvaxis var_x1,var_y1,-mapsize/2,-mapsize/2,1 qcnvaxis var_x2,var_y2, mapsize/2, mapsize/2,1 qborder var_x1,var_y1,var_x2,var_y2 qgravity 0,0 repeat players qcnvaxis var_x,var_y,xpos(cnt)+ginfo_winx/2,zpos(cnt)+ginfo_winy/2,1 qaddmodel my(cnt),model,-1, var_x,var_y,0,1.0,1.0,colsw_active,1,,1 qweight my(cnt) , 24.0 , 10000 qinertia my(cnt) , 0.95 , 1.0 loop qweight my(0) , 24.0 , 1 frate=60. repeat // stick key if key&128 { end } getkey wkey(0),'W' getkey skey(0),'S' getkey akey(0),'A' getkey dkey(0),'D' maxspd = (60./3.6);/frate maxspdback = (20./3.6);/frate trunspd = deg2rad(54); /frate repeat players player=cnt if wkey(player)+skey(player)=0 {speed(player)*0.95} if wkey(player)=1{ speed(player)+maxspd/(frate*500.) if speed(player)>=maxspd{speed(player)=maxspd} } if skey(player)=1{ speed(player)-maxspdback/(frate*500.) if speed(player)<=-maxspdback{speed(player)=-maxspdback} } if dkey(player)+akey(player)=0 {yradadd(player)*0.95} if dkey(player)=1{ yradadd(player)+trunspd/(frate*500.) if yradadd(player)>=trunspd{yradadd(player)=trunspd} } if akey(player)=1{ yradadd(player)-trunspd/(frate*500.) if yradadd(player)<=-trunspd{yradadd(player)=-trunspd} } /* yrad(cnt)+yradadd(cnt) xpos(cnt)-speed(cnt)*sin(-yrad(cnt)) zpos(cnt)-speed(cnt)*cos(-yrad(cnt)) */ qspeed my(cnt), speed(cnt)*sin(-yrad(cnt)),speed(cnt)*cos(-yrad(cnt)),yradadd(cnt),1 loop repeat players qgetpos my(cnt),xpos(cnt),zpos(cnt),yrad(cnt) loop //DRAW redraw 0 qexec//OBAQによるオブジェクトの更新 color:boxf repeat players qcollision my(cnt) qgetcol i,colx,coly if i>=0 { color 255,255,0 qcnvaxis ix,iy,colx,coly pos ix,iy:mes "HIT!" } loop qdraw//オブジェクトの描画 color 0,255,0 repeat players pos 150*cnt,0 mes "PLAYER : "+cnt mes "X : "+xpos(cnt) mes "Y : "+zpos(cnt) mes speed(cnt);* 60. *3.6 mes rad2deg(yrad(cnt)) loop redraw 1 await 1000./60. loop



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