#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