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 を使ってスクリーンセーバを作れたら、このあたり悩まずに済むのだろうけど。何か裏技(?)が無いものか。
[ ツッコむ ]
#2 [hsp][prog] テキストエディタ Mery のHSP用設定をカスタマイズした
今現在、HSPのスクリプトソースを書く際には、Mery (3.6.1, x64) というエディタを利用させてもらっている。Ctrl + Space で単語補完ができる点がありがたい。いやまあ、VSCode (Visual Studio Code) も単語補完ができるから、そちらを使ってもいいのだけど、VSCode に比べたら Mery は動作が軽いので…。
_「Mery」の記事一覧 - Haijin Boys Online
_MeryWiki
_「Mery」フリーの高機能テキストエディター - 窓の杜
ただ、この Mery、HSPDX の各命令については色付け表示してくれないので、そのあたりをカスタイマイズしてみた。
_「Mery」の記事一覧 - Haijin Boys Online
_MeryWiki
_「Mery」フリーの高機能テキストエディター - 窓の杜
ただ、この Mery、HSPDX の各命令については色付け表示してくれないので、そのあたりをカスタイマイズしてみた。
◎ 構文ファイルをカスタマイズ :
Mery で HSPのソースを開いた際、表示 → 編集モード、が「HSP」になる。その、表示 → 編集モード、で、一番下の「編集モードの設定」を選べば、各言語の構文ファイルの一覧が表示される。
「HSP」を選んで、「プロパティ」ボタンをクリックすれば、構文ファイルの内容を修正できる。ちなみに、構文ファイルの拡張子は、.msy らしい。

不足している単語を一つ一つ追加していってもいいのだけど…。とりあえず、hsp.msy としてエクスポートして、HSPDX関連の命令を追加してみた。
_hsp.msy
これをインポートして、「上書き」してしまえば、HSPDX の命令にも対応する。たぶん。


元に戻したい時は、「リセット」をクリックして、「既定にリセット」をチェックして「HSP」を選んで「OK」をクリックすればいい。


ちなみに、オリジナルの内容をエクスポートしたら以下の内容だった。
_hsp.orig.msy.txt
「HSP」を選んで、「プロパティ」ボタンをクリックすれば、構文ファイルの内容を修正できる。ちなみに、構文ファイルの拡張子は、.msy らしい。

不足している単語を一つ一つ追加していってもいいのだけど…。とりあえず、hsp.msy としてエクスポートして、HSPDX関連の命令を追加してみた。
_hsp.msy
これをインポートして、「上書き」してしまえば、HSPDX の命令にも対応する。たぶん。


元に戻したい時は、「リセット」をクリックして、「既定にリセット」をチェックして「HSP」を選んで「OK」をクリックすればいい。


ちなみに、オリジナルの内容をエクスポートしたら以下の内容だった。
_hsp.orig.msy.txt
◎ 補完用ファイルもカスタマイズ :
補完ファイルについてもメモしておく。Mery は、インストールフォルダ\Ext\ フォルダ内の hsp.txt を読み取って、HSPソースを開いている際の単語補完をしているようなので、hsp.txt に単語を追加しておけば、その追加した単語でも補完が効くようになるはず。たぶん。
一応、以下に修正したファイルを置いておく。最後のあたりに追加されている、es_ から始まる文字列が追加した単語群。
_hsp.txt
一応、以下に修正したファイルを置いておく。最後のあたりに追加されている、es_ から始まる文字列が追加した単語群。
_hsp.txt
◎ 余談 :
ここまでメモしておいてなんだけど。HSP 3.5 以降は HSPDX の利用が非推奨になっているので、本来なら HSPDX の各命令の色分け表示や、単語補完にまで対応させる必要は無いはずで…。
でもまあ、どうしても HSPDX を使いたい場合は、上記のようにカスタマイズできますよ、ということで…。
でもまあ、どうしても HSPDX を使いたい場合は、上記のようにカスタマイズできますよ、ということで…。
[ ツッコむ ]
以上、1 日分です。
