; screensaver sample for HGIMG3. fork arusave.hsp ; ; HSP + HGIMG3を使ってスクリーンセーバを作れるか実験 ; ; Windows10 x64 22H2 + HSP 3.7 beta7, 2023/11/06 by mieki256 #include "hgimg3.as" #include "d3m.hsp" ; 以下の行をコメントアウトすればexeになる ;#define SCREENSAVER_ENABLE #define TITLESTR "Screensaver for HGIMG3" #define VERSTR "0.0.1" #packopt name "sshgimg3" #ifdef SCREENSAVER_ENABLE #packopt type 2 ; generate ".scr" #else #packopt type 0 ; generate ".exe" #endif #packopt xsize 640 ; 設定画面横幅 #packopt ysize 320 ; 設定画面縦幅 #define TEXFILE "ball.png" #define PREVIEWFILE "preview.png" #define FONTFILE "font.png" #pack TEXFILE #pack PREVIEWFILE #pack FONTFILE #define KB_ESC $000080 #define NWDW_ID 2 ; paramater framerate = 60 fps_disp_enable = 1 ; ---------------------------------------- ; コマンドラインオプションを解析 s = dir_cmdline ; コマンドラインオプション文字列を取得 i = instr(s, 0, "/") ; "/" の出現位置を検索 if i == -1 { ; オプション無し #ifdef SCREENSAVER_ENABLE goto *config_mode #else goto *fullscreen_mode #endif ; goto *preview_mode } a = strmid(s, i, 2) ; 2文字だけ取り出し if a == "/p" or a == "/P" : goto *preview_mode ; プレビュー if a == "/s" or a == "/S" : goto *fullscreen_mode ; フルスクリーン if a == "/c" or a == "/C" : goto *config_mode ; コンフィグ ; コマンドラインがどれでもない時はエラー表示 dialog "Unknown switch [" + s + "]" end *config_mode ; 設定画面モード goto *display_config_dialog_only *preview_mode ; プレビュー画面モード goto *display_preview ; ---------------------------------------- *fullscreen_mode ; フルスクリーン描画処理 ; デスクトップサイズを取得 dispw = ginfo_dispx disph = ginfo_dispy ; ウインドウID=2で枠無しウインドウを新規作成 ; これができないとHSPでスクリーンセーバを作れない ; bgscr WindowID, width, height, mode, x, y, width, height bgscr NWDW_ID, dispw, disph, 0, 0, 0, dispw, disph ; HGIMG3初期化 hgini ; ビットマップフォントを設定。フォント画像を読み込み setfont 20, 20, 18, 1 ; 20x20 font texload FONTFILE ; 画像を読み込み texload2 TEXFILE texid = stat ; get texture ID texw = 128 texh = 128 gsel NWDW_ID, 1 clscolor $000000 ; set clear color ; clsblur 24 ; set blur. 0 - 255 randomize ; ワーク初期化 x = dispw / 2 y = disph / 2 dy = double(disph) / double(framerate) dx = dy time_start = d3timer() ; get time endfg = 0 ; ---------------------------------------- *mainloop while endfg == 0 tm = d3timer() - time_start fps = d3getfps() ; get FPS #ifndef SCREENSAVER_ENABLE ; ESC key to exit stick key, 0 if key & KB_ESC : endfg = 1 #endif ; move ball x += dx y += dy wh = texw / 2 hh = texh / 2 if (x - wh) < 0 or (x + wh) > dispw : dx *= -1 if (y - hh) < 0 or (y + hh) > disph : dy *= -1 ; ---------------------------------------- ; draw start hgdraw ; clear screen ; color 64, 128, 192 ; boxf ; draw ball src_w = texw src_h = texh dst_w = texw dst_h = texh rot = 0.0 gmode gmode_rgb0, texw, texh pos x, y hgrotate texid, src_w, src_h, rot, dst_w, dst_h ; draw text if fps_disp_enable { gmode gmode_rgb0 fprt strf("[%dx%d] %d/%dFPS", dispw, disph, fps, framerate), 10, 10 } ; draw end. screen refersh. wait t = (1000 / framerate) - 1 if t <= 0 : t = 1 hgsync t wend ; end main loop *jobend: end ; ---------------------------------------- ; プレビュー画面表示 ; 「スクリーンセーバの変更」ウインドウ内で表示されるプレビュー処理。 ; HSPのWindow ID0がプレビュー画面に合わせて小さくなっているので、 ; ginfo_winx, ginfo_winy で画面サイズを取得後、その中に描画する。 ; ; 経験上、単に画像を表示してstopしたほうが不具合が起きにくい。 ; ここでアニメーションさせると、プログラム終了時に、 ; Windowsイベントビューアにエラーが残る状態になったりする。 ; ; ここではHGIMG3の描画機能を使わず、 ; HSP標準の描画機能を使ってレイアウトしている。 *display_preview ; get preview window size wdw_w = ginfo_winx wdw_h = ginfo_winy ; load image imgid = 3 w = 152 h = 112 buffer imgid, w, h ; reserve image buffer picload PREVIEWFILE ; load image file iw = ginfo_winx ; get image size ih = ginfo_winy ; draw gsel 0 redraw 0 ; draw start cls 4 ; 画像をウインドウ全体に引き延ばして描画 gmode gmode_gdi, iw, ih gzoom wdw_w, wdw_h, imgid, 0, 0, iw, ih, 1 redraw 1 ; draw end. Refresh stop ; ---------------------------------------- ; 設定画面を描画 ; 本来は動作パラメータを設定できるウインドウになるはず。 ; 今回は、プログラム名、バージョン、終了のためのOKボタンを表示しかしない。 ; ; ここではHGIMG3の描画機能を使わず、 ; HSP標準の描画機能を使ってレイアウトしている。 *display_config_dialog_only screen 0, 640, 320, 0 ; Reset window ID=0 title TITLESTR + " " + VERSTR ; set window title gsel 0, 1 ; select window cls ; clear window font "Tahoma", 18, 1 ; set font kind, font size, bold redraw 0 ; draw start gmode gmode_rgb0 color 0, 0, 0 pos 20, 20 mes "Config - " + TITLESTR pos 20, 50 mes "Version : " + VERSTR pos 520, 260 button "OK", *config_end redraw 1 ; draw end. refresh await 15 stop *config_end end