OBAQで振り子を作るサンプル
OBAQで振り子を作るサンプル
#include "obaq.as"
;内積
#define ctype DotProduct2D(%1,%2,%3,%4) (double(%1)*(%3) + double(%2)*(%4))
qreset ; OBAQの初期化
; オブジェクト追加
qaddpoly mybox, 4, 80,30,0, 3.0,3.0
qaddpoly myball, 20, 80,60,0, 3.0,3.0
;qgravity 0,0
qtype mybox, type_bind
qinertia myball, 1.0
qgetpos mybox, px,py,pr
*main
redraw 0 ; 画面の更新を開始
color 0,0,0:boxf ; 画面をクリア
qexec ; OBAQによるオブジェクトの更新
; キー入力
stick key,15 ; キーの取得
if key&128 : end ; [ESC]キーで終了
if key&1 : px -= 0.5
if key&4 : px += 0.5
if key&2 : py -= 0.5
if key&8 : py += 0.5
; 操作用オブジェクトを移動
qpos mybox, px,py,0
; 振り子
qgetpos mybox, hx0, hy0, hr0
qgetpos myball, hx1, hy1, hr1
qgetspeed myball, vx,vy,vr
;ballからbox
dx = hx0 - hx1
dy = hy0 - hy1
;cos
dd = sqrt(dx*dx + dy*dy)
vv = sqrt(vx*vx + vy*vy)
c = DotProduct2D( vx, vy, -dx, -dy ) / vv / dd
;紐正規化
ix = dx / dd
iy = dy / dd
;減衰
v = vv * c
bvx = ix * -v
bvy = iy * -v
cv = 0.1
cvx = 0.0
cvy = 0.0
if bvx>0 {
cvx = -cv
bvx -= cv
if bvx<0 : cvx = 0.0
} else {
if bvx<0 {
cvx = cv
bvx += cv
if bvx>0 : cvx = 0.0
}
}
if bvy>0 {
cvy = -cv
bvy -= cv
if bvy<0 : cvy = 0.0
} else {
if bvy<0 {
cvy = cv
bvy += cv
if bvy>0 : cvy = 0.0
}
}
qspeed myball, cvx, cvy, 0.0
; バネ
;バネの伸び
dl = sqrt(dx*dx + dy*dy) - 10.0
vx = ix * dl / 4
vy = iy * dl / 4
qspeed myball, vx, vy
/*
pos 50,50
color 255,255,255
mes ""+dy
mes ""+vy
mes vv
mes c
mes "cvx = " + cvx
mes "cvy = " + cvy
*/
qdraw ; オブジェクトの描画
redraw 1 ; 画面の更新を終了
await 12 ; 一定時間待つ
goto *main