HSP3.5 HGIMG4 ではオフスクリーンを応用して複数カメラ視点描画ができます。
通常のまま gpdraw を実行してしまうとイベントなどの自動移動がその回数分反映されてしまうため、gpdraw に引数を指定して自動移動反映と描画を分けるところがポイントです。
サンプルコードは以下のようになります。

#include "hgimg4.as"

#const EG_CALC GPDRAW_OPT_OBJUPDATE
#const EG_DRAW2D (GPDRAW_OPT_DRAW2D | GPDRAW_OPT_DRAW2D_LATE)
#const EG_DRAW3D (GPDRAW_OPT_DRAWSCENE | GPDRAW_OPT_DRAWSCENE_LATE)


    sx = ginfo(26)
    sy = ginfo(27)

    gpreset
    setcls CLSMODE_SOLID, 0x000033

// 上下往復運動
    newevent ev
    event_addpos ev, 0, -0.002, 0
    event_wait ev, 120
    event_addpos ev, 0, 0.002, 0
    event_wait ev, 120
    event_jump ev, 0

    gpload id, "res/duck"
    setangr id, 0, -64, 0
    setevent id, ev
    duck_id = id

// ちらつき防止用
    buffer 1, 32,32, 0

    ow = sx / 4
    oh = sy / 4

    dist = 4

// メインカメラ
    gpnull id
    gpcamera id, 45, double(sx) / double(sy), 0.5, 768
    setpos id, 2, 2, 3
    gplookat id, 0, 0, 0
    cam_id = id
// サブカメラ
    dim cams,4
    foreach cams
        gpnull id
        gpcamera id, 45, double(ow) / double(oh), 0.5, 768
        if cnt == 0 {
            setpos id, 0,0, dist
            gplookat id, 0,0,0
        }
        if cnt == 1 {
            setpos id, 0,dist,0
            setangr id, -64, 0, 0
        }
        if cnt == 2 {
            setpos id, -dist,0,0
            gplookat id, 0,0,0
        }
        if cnt == 3 {
            setpos id, dist,0,0
            gplookat id, 0,0,0
        }
        cams.cnt = id

        buffer cnt + 2, ow,oh, screen_offscreen
        celdiv cnt + 2, ow, oh, ow/2, oh/2
    loop

    repeat
        getreq ts, SYSREQ_TIMER
        getreq fps, SYSREQ_FPS
// 移動の反映
        gsel 1
        gpdraw EG_CALC
// サブカメラでのオフスクリーン描画
        foreach cams
            gsel cnt + 2
            redraw 0

            gpusecamera cams.cnt
            gpdraw EG_DRAW2D | EG_DRAW3D
            redraw 1
        loop
// メインカメラ
        gsel 0
        gpusecamera cam_id
        gpdraw EG_DRAW2D | EG_DRAW3D
// サブカメラのオフスクリーンを可視描画
        color 224,224,224
        foreach cams
            x = ((cnt & 1) * 10 + 3) * ow / 4
            y = ((cnt / 2) * 10 + 3) * oh / 4
            grect x, y, 0, ow+8, oh+8

            pos x, y
            celput cnt + 2
        loop

        pos 16, oh * 2
        color 224,224,224
        font "",36
        mes strf("%2d [fps]", fps)

        redraw 1
        await 1000/60
    loop
実行結果
z09four1.png
通常のメインカメラと正面、上、左右のサブカメラ

描画の回数だけ1フレームあたりの処理負荷は上がりますが、自キャラ位置視点や第三者視点と俯瞰視点との同時描画などが実現できます。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.