mieki256's diary



2023/11/29(水) [n年前の日記]

#1 [hsp] HSPDXのウインドウモードで大きいサイズが指定できた

HSP で DirectX を利用して描画できる拡張プラグイン、HSPDX (HSPDXFIX) について、まだ色々調べている。

HSPDXのウインドウモードのサイズ指定について :

昨日実験していた際は、HSPDX で、es_screen を使ってウインドウモードのサイズ指定をしようとしても、初期ウインドウより大きくできなかったのだけど。大きいサイズの別ウインドウを screen 命令で新規作成してから es_screen を呼んだところ、その新規作成された大きいウインドウを描画ウインドウとして利用できることが分かった。

ということは…。screen 命令で、初期ウインドウID=0 を目的のサイズに変更してから、es_screen で設定しても、狙ったサイズにできそうな気もする…。試してないけど。

また、HSP は bgscr 命令を使えば枠無しウインドウを新規作成することができるので…。デスクトップサイズと同じサイズの「枠無し」ウインドウを新規作成しつつ、(0, 0) の位置に表示するようにしてやれば、フルスクリーンモードに切り替えなくても、ウインドウモードのままで、フルスクリーン表示をしているように見せかけることができると分かった。

そんなわけで、そのあたりを反映させたソースは以下のようになった。

_01_hspdx_es_excopy2.hsp
    ; HSPDX es_excopy sample 2
    ; ウインドウモードをフルスクリーンモードのように見せかける
    ; Window ID=2 を描画対象にしている
    ;
    ; 2023/11/29, use HSP 3.7 beta 7, Windows10 x64 22H2
    
    #include "hspdx.as"
    
    #packopt name   "01_hspdx_es_excopy2"   ; file name
    #packopt type   0       ; generate ".exe"
    
    #define TEXFILE     "tex.bmp"
    #pack   TEXFILE
    
    #define KB_ESC      $00080
    
    ; 以下の行をコメントアウトするとウインドウモードになる
    #define FULLSCR
    
    ; hspdx.dllが存在するか確認
    exist "hspdx.dll"
    if strsize < 0 {
        dialog "Not found hspdx.dll"
        end
    }
    
#ifdef FULLSCR
    ; get desktop size
    wdw_w = ginfo_dispx
    wdw_h = ginfo_dispy
    ; scmode = 0              ; set fullscreen
    scmode = 1              ; set window mode
    use_d3d = 1
#else
    ; wdw_w = 512
    ; wdw_h = 288
    wdw_w = 1600
    wdw_h = 900
    scmode = 1              ; set window mode
    use_d3d = 1
#endif

    ; 最初に作られる Window ID=0 を非表示にする
    gsel 0, -1
    
    actid = 2   ; Window ID=2 を表示ウインドウにする
    
#ifdef FULLSCR
    ; フルスクリーン相当。枠無しウインドウを作成
    bgscr actid, wdw_w, wdw_h, 0, 0, 0, wdw_w, wdw_h
#else
    ; ウインドウモード。通常のウインドウを作成
    screen actid, wdw_w, wdw_h, 0, 20, 20, wdw_w, wdw_h
#endif
    
    es_ini              ; initialize HSPDX
    onexit *job_end
    
    es_screen wdw_w, wdw_h, 32, 0, scmode, use_d3d
    if stat == 1 {
        dialog "Error : DirectX initialization failed."
        end
    }
    if stat == 2 {
        dialog "Error : Screen initialization failed."
        end
    }
    
*start
    ; load texture image file
    buffer 5, 256, 256
    picload TEXFILE
    
    texid = 0
    es_buffer texid, 0  ; copy buffer to VRAM
    if stat {
        es_bye
        wait 100
        dialog "Error : Not enough VRAM."
        end
    }
    
    gsel actid, 1           ; Activate window
    es_cls                  ; screen clear
    es_sync (1000/60), 1    ; wait
    wait 100
    
    font "Tahoma", 16, 1
    
    tt = 0
    k = 0
    x = double(wdw_w / 2)
    dx = double(wdw_w) / double(60 * 3)
    now_fps = 0
    
*mainloop
    ; get fps
    es_getfps now_fps
    ; title strf("%d/50 FPS", now_fps)
    
    stick k, 0                      ; chekc keyboard
    if k & KB_ESC : goto *job_end   ; ESC key to exit
    
    x += dx
    if x <= 0.0 or (x + 16.0) >= wdw_w {
        ; flip direction
        dx *= -1
    }
    
    ; draw start
    gsel actid
    es_cls $40, $80, $c0        ; screen clear
    
    ; draw image
    gmode gmode_rgb0, 16, 16
    pos int(x), 10
    es_copy texid, 0, 0, 16, 16
    ; es_excopy texid, 0, 0, 16, 16, 64, 64
    
    repeat 8
        ; draw image
        px = 0
        py = 40 + (16 + 2) * cnt
        sx = 0      ; source x, y
        sy = 0
        sw = 16     ; source width, height
        sh = 16
        dw = 14 + cnt   ; dest width, height
        dh = 16
        gmode gmode_rgb0, sw, sh
        objsize dw, dh
        pos px, py
        
        ; es_zoom texid, sx, sy, sw, sh, dw, dh
        es_excopy texid, sx, sy, sw, sh, dw, dh
        
        ; box fill
        px = px + dw + 2
        gmode 0, sw, sh
        color 32, 32, 32
        pos px, py
        es_boxf px, py, px + dw - 1, py + dh - 1
    loop
    
    pos (wdw_w / 2) - (16 * 4), 0
    color 255, 255, 255
    es_fmes strf("%d/60FPS", now_fps)
    
    es_sync (1000/60), 1    ; draw and wait
    tt = stat
    await 1
    goto *mainloop

*job_end
    es_bye
    end

使用画像は以下。

_tex_image.zip

余談 :

ここまで調べてみたものの。HSPDX を利用するためには、以下を要求されるわけで…。
  • hspdx.dll を .exe (あるいは .scr) と同じ場所にコピーしてもらわないといけない。
  • MSVCR71.DLL を、もしかすると Windows のシステムフォルダにコピーしてもらうことになるかもしれない。
この2点を鑑みつつ、最終的にはスクリーンセーバにしたいことを考えると…。描画結果に難はあるけれど HGIMG3 を利用したほうがまだマシだろうかと思えてきた。スクリーンセーバをインストールする際の手間暇は極力少ないほうがいいだろう…。HGIMG3 で作れば、scrファイル1つをコピーするだけでインストールが済むだろうし…。

もっとも、今時スクリーンセーバを作ってみたところで、そんなものを一体誰が使うのかと考え始めると…。どうせ誰も使わないだろうから自分の環境でひとまず動いてるならそれでいいのではないか、配布やインストールの手間暇まで考えなくてもいいのでは、などと思えてきたりもして。

hsp3dish を使ってスクリーンセーバを作れたら、このあたり悩まずに済むのだろうけど。何か裏技(?)が無いものか。

以上です。

過去ログ表示

Prev - 2023/11 - Next
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project