HSP3.5HGIMG4에 2D 뷰 포트 표시

3481 단어 HSPHSP3
HSP3.5HGIMG4는 2D 지도를 확대 또는 축소할 수 있다
HSP3.5HGIMG4에서는 기능이 다소 제한적이지만 크로스컨트리(렌더링 대상)를 사용할 수 있습니다.이 약간 확대된 지도로 창문으로 보는 것과 같은 표현 등이 가능하다.
버퍼의 네 번째 매개 변수에서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

넓은 범위의 상태 표시
확대율은 시간의 변화에 따라 변화한다.
실행 결과2

좁은 범위의 상태 표시
주로 3D 방향의 HGIMG4이지만, 사이다 등 기술을 활용해 3D와 2D의 하이브리드로 다양하게 표현해 진화를 기대하고 있다.

좋은 웹페이지 즐겨찾기