sample\hgimg4\physics_2.hsp » Plain Format
#include "hgimg4.as"
;
; カメラ視点の先にあるオブジェクトの衝突位置を取得する(gppraytest命令テスト)
; カーソルキーかマウスで移動、衝突位置にエフェクトが出ます
; スペースキーを押すと対象に衝撃を与えます
;
randomize
title "HGIMG4 Test"
wx=ginfo_sx:wy=ginfo_sy ; 描画エリアのサイズ
setpos GPOBJ_CAMERA, 0,1,10 ; カメラ位置を設定
; 3Dモデルを生成
gpfloor id_floor, 40,40, $008080 ; 床ノードを追加
gppbind id_floor, 0
max=16
x=-8
repeat max
gpbox id_model, 1, $808080 ; 箱ノードを生成する
setscale id_model, 1,2,0.5
z=rnd(8)-4
setpos id_model, x,0.5,z
gppbind id_model
setcoli id_model, 1
x+=1
loop
; テクスチャマテリアル作成
gptexmat id_ptex, "res/efx.png" ,GPOBJ_MATOPT_BLENDADD|GPOBJ_MATOPT_NOZWRITE
; イベントリストを登録
;
newevent ev1 ; 新しいイベントIDを取得
event_setdir ev1, -0.05,-0.05,-0.05, 0.05,0.05,0.05
event_adddir ev1
event_fade ev1, -8
event_wait ev1, 32
event_delobj ev1
px=0.0:py=0.0
ddim fv,4
*main
stick key,15+256
if key&128 : end
if key&1 : px-=0.1
if key&4 : px+=0.1
if key&2 : py-=0.1
if key&8 : py+=0.1
if key&256 {
px=double(mousex)/ginfo_sx*20-10
py=double(mousey)/ginfo_sy*20-10
}
gplookat GPOBJ_CAMERA, px,-py,0 ; カメラから指定した座標を見る
gppraytest hitres, GPOBJ_CAMERA, 100, 1
if hitres>0 {
setcolor hitres, 255,0,0
getwork GPOBJ_CAMERA,dx,dy,dz
gpplate id, 1,1,-1,id_ptex ; 板ノードを追加
setobjmode id, OBJ_MOVE ; 自動移動を設定する
setpos id,dx,dy,dz
setevent id, ev1
if key&16 {
setwork hitres,dx,dy,dz ; WORKに座標を設定する
;
getang GPOBJ_CAMERA,dx,dy,dz
fvset fv,dx,dy,dz
fvdir fv,0,0,1.0 ; カメラの角度をベクトルに変換する
getwork2 GPOBJ_CAMERA,dx2,dy2,dz2 ; 衝突物の法線を取得する
fvdir fv,dx2,dy2,dz2,FVDIR_MIRROR ; 鏡面ベクトルに変換する
fvmul fv,-0.2,-0.2,-0.2 ; ベクトルの威力を弱める
gppapply hitres,GPPAPPLY_IMPULSE_POS, fv(0),fv(1),fv(2) ; 対象に衝撃を与える
}
}
redraw 0
rgbcolor $eecc:boxf
gpdraw
gmode 1:rgbcolor $ff0000
sx=wx/5:sy=wy/5
x=wx/2:y=wy/2
boxf x-sx,y-1,x+sx,y+1
boxf x-1,y-sy,x+1,y+sy
rgbcolor -1:pos 0,0
mes "HGIMG4 Sample"
redraw 1
await 16
goto *main