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.0qaddpoly myball, 20, 80,60,0, 3.0,3.0;qgravity 0,0qtype mybox, type_bindqinertia myball, 1.0qgetpos mybox, px,py,pr*mainredraw 0 ; 画面の更新を開始color 0,0,0:boxf ; 画面をクリアqexec ; OBAQによるオブジェクトの更新; キー入力stick key,15 ; キーの取得if key&128 : end ; [ESC]キーで終了if key&1 : px -= 0.5if key&4 : px += 0.5if key&2 : py -= 0.5if key&8 : py += 0.5; 操作用オブジェクトを移動qpos mybox, px,py,0; 振り子qgetpos mybox, hx0, hy0, hr0qgetpos myball, hx1, hy1, hr1qgetspeed myball, vx,vy,vr;ballからboxdx = hx0 - hx1dy = hy0 - hy1;cosdd = sqrt(dx*dx + dy*dy)vv = sqrt(vx*vx + vy*vy)c = DotProduct2D( vx, vy, -dx, -dy ) / vv / dd;紐正規化ix = dx / ddiy = dy / dd;減衰v = vv * cbvx = ix * -vbvy = iy * -vcv = 0.1cvx = 0.0cvy = 0.0if bvx>0 {cvx = -cvbvx -= cvif bvx<0 : cvx = 0.0} else {if bvx<0 {cvx = cvbvx += cvif bvx>0 : cvx = 0.0}}if bvy>0 {cvy = -cvbvy -= cvif bvy<0 : cvy = 0.0} else {if bvy<0 {cvy = cvbvy += cvif bvy>0 : cvy = 0.0}}qspeed myball, cvx, cvy, 0.0; バネ;バネの伸びdl = sqrt(dx*dx + dy*dy) - 10.0vx = ix * dl / 4vy = iy * dl / 4qspeed myball, vx, vy/*pos 50,50color 255,255,255mes ""+dymes ""+vymes vvmes cmes "cvx = " + cvxmes "cvy = " + cvy*/qdraw ; オブジェクトの描画redraw 1 ; 画面の更新を終了await 12 ; 一定時間待つgoto *main