HSP3.5 HGIMG4 で剛体をキネマティック(強制指定)モードにする
HGIMG4 では三次元の物理演算剛体が使えますが、gppbind で3Dオブジェクトを3D物理演算剛体として指定すると基本的には setpos などでは移動できなくなり、3D物理演算に従った移動回転が発生します。
しかし gppset で GPPSET_KINEMATIC で x成分 に 1.0 を指定することでその物理演算剛体を強制指定モードに変更することができます。
注意する必要があるのはこの方法で移動させる場合は質量を 0.0 にしてはならないということです。
このキネマティックモードを利用してコインプッシャーもどきを作ってみました。
以下サンプルコードです。
#include "hgimg4.as"
randomize
gpreset
setcls CLSMODE_SOLID, 0x000000
whole_size = 32
whole_half = whole_size / 2
height_size = 2
height_half = height_size / 2
div_num = 4
box_size = whole_size / div_num
box_half = box_size / 2
setborder whole_size * 2.0, whole_size * 2.0, whole_size * 2.0
// 前後移動イベント
dim evs, 2
foreach evs
frs = 157, 163
vel = double(box_size) / double(frs.cnt)
newevent ev
event_addpos ev, 0,0, - vel
event_wait ev, frs.cnt
event_addpos ev, 0,0, vel
event_wait ev, frs.cnt
event_jump ev, 0
evs.cnt = ev
loop
// プッシャー
repeat 2
i = cnt
cols = 0x00ccff, 0x006699
col = cols.i
repeat div_num
j = cnt
repeat 3
k = cnt
gpbox id, box_size, col
x = (j * 2 - div_num / 2 - 1) * box_size / 2
y = box_half * (1 - i)
z = box_half * (-1 + i*2 - k*2)
setpos id, x, y, z
gppbind id, 1,2
gppset id, GPPSET_KINEMATIC, 1
setevent id, evs.i
loop
loop
loop
// 黄色い箱
repeat 200
gpbox id, 2, 0xcccc00
setpos id, rnd(7) - 3, whole_size / 2, rnd(7) - 3
setobjmode id, OBJ_BORDER, 0
gppbind id, 1, 2
gppset id, GPPSET_DAMPING, 0,0
loop
// 床壁
gpfloor id, whole_size, whole_size, 0x006699
gppbind id, 0
repeat 3
xs = -whole_half, 0, whole_half
y = whole_half / 2
zs = 0, -whole_half, 0
ws = whole_size/2, whole_size, whole_size/2
hs = whole_size, whole_size/2, whole_size
rx = 0
ry = 0
rz = 0
if cnt == 0 {
rz = -64
}
if cnt == 1 {
rx = 64
}
if cnt == 2 {
rz = 64
}
gpfloor id, ws.cnt, hs.cnt, 0x339966
setpos id, xs.cnt, y, zs.cnt
setangr id, rx,ry,rz
gppbind id, 0
loop
// ライトとカメラ
setangr GPOBJ_LIGHT, -16, -32,0
setpos GPOBJ_CAMERA, 10, 20, 50
gplookat GPOBJ_CAMERA, 0, 5, 0
repeat
getreq fps, SYSREQ_FPS
stick key
if key & 256 {
gpbox id, 2, 0xcccc00
setpos id, rnd(25)-12, whole_half, -whole_half
setobjmode id, OBJ_BORDER, 0
gppbind id, 1, 2
gppset id, GPPSET_DAMPING, 0,0
}
redraw 0
gpdraw
pos 16,16
color 224,224,224
font "",48
mes strf("%2d [fps]", fps)
redraw 1
await 1000/60
loop
実行結果1 |
---|
黄色い箱がコインがわりのコインプッシャーです |
実行結果2 |
---|
左クリックで黄色い箱を補充できます |
プッシャーをキネマティックモードにしてイベントで前後移動させ、コイン代わりの箱は通常の3D物理演算で動作が決まるようになっています。
現状では gpbox ですべての辺の長さが等しい立方体しか生成できないため、立方体を複数並べてそれぞれの段の滝を実現しています。直方体とその形状の剛体も作れるようになると、もっと便利かなぁと思います。次期バージョンアップ時の追加に期待したいと思います。
参考
HSP3.5 hgimg4 を基礎から理解したい方は以下の記事がとてもおすすめです。