mieki256's diary



2023/11/06(月) [n年前の日記]

#1 [hsp] HGIMG3を使ってスクリーンセーバを作成してみた

Windows10 x64 22H2 + HSP 3.7 beta7 + HGIMG3 を使って、スクリーンセーバが作れそうか実験中。

一応、ここまでの経緯について再度メモ。
そんなわけで、HGIMG3 を使ってもスクリーンセーバを作れた、ような気がする。たぶん。github にサンプルを ―― 「宇宙飛行」スクリーンセーバと似た感じの見た目になってるスクリーンセーバをアップロードしてみた。

_mieki256/ssstarshsp: Screensaver like ssstars.scr created by HGIMG3.


余談。かなり昔にHSPで作ったスクリーンセーバは、プレビュー画面を終了する度に、Windowsイベントビューアにエラーを残してしまう状態になってしまったので、今回はそういう不具合が発生してないか気にしながら動作確認しているのだけど、今のところWindowsイベントビューアに変な記録は残っていない。スクリーンセーバとしては正常に動作している状態なのではないかなと。たぶん。そうであってほしい…。

別サンプル :

せっかくだから、ソースをもっとシンプルにしたサンプルも載せてみる。1つのボールが画面の中を跳ね回るだけの、いつもの処理にしてみた。

_sshgimg3.hsp
    ; 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

使用画像は以下。

_ball.png
_font.png
_preview.png


動かすと以下のような感じになる。この手のソレでよく見かける処理。

#2 [tv] 「X年後の関係者たち あのムーブメントの舞台裏 #53 山崎貴と日本VFX」を視聴

BS-TBSで放送されてる番組を TVer で視聴。日本の映画/VFX監督、山崎貴監督をゲストに迎えて、日本のVFXについて語ってもらう回。

山崎監督が語っていた、ハリウッドと日本のVFXはトライアンドエラーの回数が一桁違うという話が興味深かった。ハリウッドは1カットにつき200回以上トライアンドエラーができる予算を最初から組むけれど、日本はせいぜい10〜15回できたらマシなほう、だそうで…。そりゃ最終的に出来上がる映像のクオリティが違ってくるわなと…。何故そんなに予算が違うのかと言えば市場規模の違い故だそうで、日本の映画は国内だけで元が取れれば良しと考えるから、最初からそれに見合った予算しか用意しない、と…。国内市場が中途半端(?)に成立していることは幸せなことなのか、それとも不幸なことなのか…。なかなか難しいものだなと…。

昨今出てきたAIがクリエイティブ面に与える影響についても多少語っていて、そのあたりも興味深かった。監督さん曰く、既存のアイデアの組み合わせを考えていくことがクリエイティブとされていたし、それは人間にしかできない行為と今まで思われていたけれど、実はAIのほうがそのあたりは得意なのだと分かってきて、さてどうしたものか、今はまだ仕事に使えないレベルだけど、この先どうなるか…。みたいな話で。このあたり、当初は使い物にならなかったCG技術がモリモリと力をつけて進歩して、やれる範囲を広げていった、その展開/光景をずっと目の当たりにしてきた監督さんだからこそ、AIの将来についても容易に想像できる面がありそうだなと…。

以上、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