|
|
|
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
速度値などを実際に使用する値にしたのですが、なぜか動きません…なにゆえ…
| |
|
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
| |
|