physics_2.hsp

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