HSP3.5 HGIMG4 で2Dマップを拡大したり縮小したりする

HSP3.5 HGIMG4 では、やや機能限定ではありますがオフスクリーン(レンダーターゲット)が使用できるようになりました。これを用いてやや広めのマップを窓から覗いたような表現などが可能です。
buffer をオフスクリーンとして生成するには buffer の第4引数に screen_offscreen を指定します。
サンプルコードは以下になります。
ソースコードファイルはインストールフォルダが C:\hsp35 の場合、C:\hsp35\sample\hgimg4 フォルダに保存してください。

#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)

#const WID_TV 3
#const WID_DOT 4
#const WID_WIDE 5

#module
#defcfunc sgn double x
    if x == 0.0 {
        return 0.0
    }
    if x < 0.0 {
        return -1.0
    }
    return 1.0
#global

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

    map_w = 2048
    map_h = 2048

    gpreset
    setcls CLSMODE_NONE

    celload dirinfo(5) + "\\hsptv_img.png", WID_TV
    celdiv WID_TV, 64,64

    celload dirinfo(5) + "\\tamadot.png", WID_DOT
    celdiv WID_DOT, 64,64, 32,32

// 珠音
    dim evs, 16
    c = 0

    repeat 16
        i = cnt

        newevent ev
        repeat 4
            index = cnt + i * 4
            event_prmset ev, PRMSET_SPRCELID,index
            event_wait ev, 15
        loop
        event_jump ev, 0

        evs.c = ev
        c ++
    loop

    gpspr id, WID_DOT, 0
    setevent id, evs.1
    tama = id   

// マップ配列
    xnum = map_w / 64
    ynum = map_h / 64
    num = xnum * ynum
    dim vxpos,num
    dim vypos,num
    dim vcelid,num

    c = 0
    repeat ynum
        i = cnt
        repeat xnum
            j = cnt

            index = 16 + limit(rnd(21) - 14, 0,6)
            if i == 0 | i == ynum - 1 | j == 0 | j == xnum - 1 {
                index = 16 + 7
            }

            //gpspr id, WID_TV, index
            vxpos.c = j * 64
            vypos.c = i * 64
            vcelid.c = index

            c++
        loop
    loop

    buffer WID_WIDE, map_w,map_h, screen_offscreen
    celdiv WID_WIDE, map_w,map_h, map_w/2, map_h/2

    cx = double(map_w / 2)
    cy = double(map_h / 2)
    vr = 1.0

    repeat
        getreq fps, SYSREQ_FPS
        getreq ts, SYSREQ_TIMER

        gsel 0
        mx = mousex
        my = mousey

        dx = double(mx - sx / 2)
        dy = double(my - sy / 2)
        cx += sgn(dx)
        cy += sgn(dy)
        cx = limitf(cx, 96, map_w - 96)
        cy = limitf(cy, 96, map_h - 96)

        setpos tama, cx,cy, 0


        gsel WID_WIDE
        redraw 0
        gpdraw EG_CALC

        celputm vxpos, vypos, vcelid, WID_TV, num
        gpdraw EG_DRAW2D
        redraw 1

        vr = sin(double(ts) * 0.0005) * 0.2 + 0.8

        gsel 0
        redraw 0
        color 0xff,0xcc,0x66
        boxf

        pos - (cx - map_w / 2) * vr + sx/2, - (cy - map_h / 2) * vr + sy/2
        celput WID_WIDE,0, vr,vr

        pos 16,16
        color 0,0,0
        font "",48
        mes strf("%2d [fps]", fps)
        redraw 1
        await 1000/60
    loop

マウスカーソルの位置で上下左右に移動します。

実行結果1
z06map1.png
広い範囲が表示されている状態

拡大率は時間経過で勝手に変化するようになっています。

実行結果2
z06map2.png
狭い範囲が表示されている状態

主に 3D 向けの HGIMG4 ですがスプライトなども活用して 3D と 2D のハイブリッドで様々な表現できるようにどんどん進化していくのではないかと期待されます。