HSP3.5HGIMG4에서 강체를 Kinetic(강제 지정) 모드로 설정합니다.

15961 단어 HSPHSP3
HSP3.5HGIMG4에서 강체를 동력학(강제 지정) 모드로 설정
HGIMG4에서는 3차원 물리 연산 강체를 사용할 수 있지만 gppbind에서 3D 대상을 3D 물리 연산 강체로 지정하면 setpos 등에서 이동할 수 없고 3D 물리 연산에 따라 이동 회전이 발생한다.
근데 gpset에서 GPSET.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.5hgimg4를 기초로 이해하고 싶은 분들은 다음과 같은 기사를 추천합니다.
  • Hot Soup Processor Advent Calendar 2017의 17일째: HSP3.5hgimg4 재입문
  • 좋은 웹페이지 즐겨찾기