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
使用画像は以下。
_tex_image.zip
ということは…。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 を利用するためには、以下を要求されるわけで…。
もっとも、今時スクリーンセーバを作ってみたところで、そんなものを一体誰が使うのかと考え始めると…。どうせ誰も使わないだろうから自分の環境でひとまず動いてるならそれでいいのではないか、配布やインストールの手間暇まで考えなくてもいいのでは、などと思えてきたりもして。
hsp3dish を使ってスクリーンセーバを作れたら、このあたり悩まずに済むのだろうけど。何か裏技(?)が無いものか。
- hspdx.dll を .exe (あるいは .scr) と同じ場所にコピーしてもらわないといけない。
- MSVCR71.DLL を、もしかすると Windows のシステムフォルダにコピーしてもらうことになるかもしれない。
もっとも、今時スクリーンセーバを作ってみたところで、そんなものを一体誰が使うのかと考え始めると…。どうせ誰も使わないだろうから自分の環境でひとまず動いてるならそれでいいのではないか、配布やインストールの手間暇まで考えなくてもいいのでは、などと思えてきたりもして。
hsp3dish を使ってスクリーンセーバを作れたら、このあたり悩まずに済むのだろうけど。何か裏技(?)が無いものか。
[ ツッコむ ]
以上です。