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

#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 で HSPのソースを開いた際、表示 → 編集モード、が「HSP」になる。その、表示 → 編集モード、で、一番下の「編集モードの設定」を選べば、各言語の構文ファイルの一覧が表示される。

mery_hsp_msy_ss01.png


「HSP」を選んで、「プロパティ」ボタンをクリックすれば、構文ファイルの内容を修正できる。ちなみに、構文ファイルの拡張子は、.msy らしい。

mery_hsp_msy_ss02.png


不足している単語を一つ一つ追加していってもいいのだけど…。とりあえず、hsp.msy としてエクスポートして、HSPDX関連の命令を追加してみた。

_hsp.msy

これをインポートして、「上書き」してしまえば、HSPDX の命令にも対応する。たぶん。

mery_hsp_msy_ss03.png

mery_hsp_msy_ss04.png


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

mery_hsp_msy_ss06.png

mery_hsp_msy_ss05.png


ちなみに、オリジナルの内容をエクスポートしたら以下の内容だった。

_hsp.orig.msy.txt

補完用ファイルもカスタマイズ :

補完ファイルについてもメモしておく。Mery は、インストールフォルダ\Ext\ フォルダ内の hsp.txt を読み取って、HSPソースを開いている際の単語補完をしているようなので、hsp.txt に単語を追加しておけば、その追加した単語でも補完が効くようになるはず。たぶん。

一応、以下に修正したファイルを置いておく。最後のあたりに追加されている、es_ から始まる文字列が追加した単語群。

_hsp.txt

余談 :

ここまでメモしておいてなんだけど。HSP 3.5 以降は HSPDX の利用が非推奨になっているので、本来なら HSPDX の各命令の色分け表示や、単語補完にまで対応させる必要は無いはずで…。

でもまあ、どうしても HSPDX を使いたい場合は、上記のようにカスタマイズできますよ、ということで…。

以上、1 日分です。

過去ログ表示

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