mieki256's diary



2023/10/25(水) [n年前の日記]

#1 [hsp] 疑似3D道路その26。スクリーンセーバを作った

ここのところ、HSPを使って疑似3D道路のプログラムを作っていたけのだけど。

_TAG:HSP - 2023

ようやくスクリーンセーバっぽい感じで動かせたので、github にアップロードしてみた。

_mieki256/p3drdscr: pseudo 3D road screensaver on Windows.

せっかくだから、OBS Studio 29.1.3 で画面をキャプチャして、Youtube にアップロード。大体こんな感じのスクリーンセーバです。




昔から謎だった疑似3D道路の処理をそれらしく書けたので、やっとようやく宿題を終えた気分。もっとも、「今時スクリーンセーバ、しかも、疑似3d道路って、お前…」と言われそうな気も…。仕方ないじゃん…。「ゆるキャン2」のOP映像の1カットを目にして「こういう感じのスクリーンセーバがあったら面白いのでは」とつい妄想していたらなんだか作りたくなってしまったので…。でも、結果的に全然似てないソレになっちゃったな…。いや、似てたら逆にマズいか…。

処理速度について :

このプログラムは、仮想画面解像度とフレームレートを変更できるようにしてあるので、動かしているPCのスペックに合わせて、処理落ちしないイイ感じの設定値を探してくれれば、と思っているわけだけど。

手元のメインPCとサブPCで動かしてみたところ、安定して動く仮想画面解像度とフレームレートは以下のような結果になった。
  • AMD Ryzen 5 5600X (3.7 - 4.6GHz, 6C/12T, 65W) : 1280x720,30FPS or 1920x1080,20FPS, zoom=2
  • AMD Athlon 5350 (2.0GHz, 4C, 25W) : 480x270, 15FPS, zoom=2

拡大縮小描画処理をおそらくはCPUのみで処理しているせいか、CPUパワーがモロに関係してくるようで…。省電力重視のCPUでは、QVGA+α の解像度にしても15FPSしか出ないのは、ちょっと参ったなと…。まあ、非力なCPUですら今時はここまでの描画ができるのね、という驚きもあるけれど。いや。今時のCPUではないよな。Windows11にはアップグレードできないぐらい古いCPUだし…。

課題 :

一応ここまでは作ってみたものの、いくつか課題が残ってるなと…。

課題その1。遠景の上下スクロールが不自然。もっと自然な感じに見せるにはどういう処理を書いたらいいのやら。道路データ(セグメントデータ)の1つ1つが、1つ前のセグメントよりどれだけ上下にずれるか、という値を持っているので、その値を上手く使えばそれっぽくなるのではないか、とは思うのだけど…。

課題その2。車の挙動が変。カーブに差し掛かっているのに速度を上げていくのはいかがなものか。そこはゆっくり速度を落としながら走るものでは…。カーブの有無を判別して、速度を変更する処理を考えるのが面倒臭くて、こんなありえない動きに…。

課題その3。拡大描画時のプルプルが気になる。gzoom + gcopy を使って描画する時はまだマシだけど、grotate や gsquare を使って描画するとプルプルプルプルと震える…。grotate や gsquare は、処理が速い代わりに精度は粗いとの話なので、トレードオフではあるのだろうけど。でも、自分の書いた処理/計算の仕方が間違ってるのではないかという気も…。

課題その4。車のビルボード感が強過ぎ。本来なら、道路に沿って車体の向きが変わったり、カーブに入ったらスクーターの角度が変わってくれないと…。でも、画像を作るのが面倒臭い。やるとしたら3Dモデルを作ってレンダリングして角度の違う画像を何パターンか作ることになるのだろうけど、想像しただけでもシンドイ。

課題その5。何より、処理が重い。重過ぎる。CPUのみで描画処理をしないで、DirectX や OpenGL を使えれば、このくらいの描画なら軽々とこなせるのではないかと想像するのだけど、HSP でスクリーンセーバを作る際に DirectX や OpenGL が使えるのかどうかが分からなくて…。どこかにサンプルは無いものかとググってみたけど、そもそも今時スクリーンセーバを作ろうとする人なんて居ないわけで、そんなサンプルがあるはずも無く。

参考ページ :

github の README.md にも載せておいたけど、以下のページが大変参考になりました。ありがたや。

_Creating a pseudo 3D racer
_Creating a pseudo 3D racer - part 2
_Creating a pseudo 3D racer - part 3
_How to build a racing game | Code inComplete
_How to build a racing game - straight roads | Code inComplete
_How to build a racing game - curves | Code inComplete
_How to build a racing game - hills | Code inComplete
_How to build a racing game - conclusion | Code inComplete
_Javascript Racer - v4 (final)
_Lou's Pseudo 3d Page
_疑似3Dに関するメモ - サイバーグノーシス

特に、PICO-8 を使ったチュートリアル記事がめちゃくちゃ分かり易くてグッドでした。マジありがたや。最初のあたりにある、カーブしていくセグメントデータを上から見た図、を出力するサンプル(Pseudo 3D racer tutorial 1)に目ウロコ。「そういうことか! カーブの表現ってそれだけで良かったのか!」と…。更に、まずはセグメントだけを透視変換して、線のみを表示して仕組みを考えていくあたりもグッドだなと。塗り潰しは後にして、まずは骨だけにして考えてみよう。みたいな。分かりやすい…。

#2 [hsp] HSPのバージョンを間違えていた

ここ最近、 HSPでスクリーンセーバを作れないか実験していたわけだけど。

ここに来て、結構重大な勘違いをしていたことに気づいた。この日記には「HSP 3.6 で」とメモしていたけど、それは間違いだった。ずっと HSP 3.7beta で動作確認していました…。申し訳ない…。

バージョンを間違えていた :

HSPエディタ(hsed3.exe)のバージョン毎の違いを確認していたところ、自分が普段利用しているHSPエディタには、本来あるはずのメニュー項目が無いことに気づいて、そこでようやく気が付いた。

今まで使っていたのは HSP 3.6 ではなく、HSP 3.7beta のHSPエディタだった…。

あふというファイラーに、3.7beta版のHSPエディタのパスを登録したことを忘れていて、そこからずっと変更していなかったので、HSP 3.6 を使っているものとすっかり思い込んでいた…。自分、もうダメだ。

HSP3.6のエディタでファイルが開けない :

これまで書いていたソースを HSP 3.6 のHSPエディタで開こうとしたら、そもそも開けない…。開こうとすると HSPエディタが落ちる…。ナニソレ怖い。自分は一体どんな奇怪なソースを書いてしまったのか。

これが、テキストエディタ Mery と、HSP 3.7beta のHSPエディタなら、すんなり開けるのだけど…。

しかし、幸い、HSPエディタの設定が保存されている custom.ini を削除したところ、ソースが開けるようになった。おそらく何かの拍子に変な値が設定されてしまって、異常動作する状態になったのだろう…。たぶん。

今後また HSPエディタの動作がおかしくなったら、custom.ini を削除して設定を初期化してみるべし。とメモ。

生成した実行ファイルがエラーを出す :

HSP 3.6 のHSPエディタでファイルを開いてexe実行ファイルを作ってみたところ、これが動かない…。「内部エラー13が発生」と出てくる…。

ググってみたら、picload で画像を開けなかった時に「内部エラー13」が発生するらしい。

_HSPエラーと対処 - 内部エラー13「画像ファイルがありません」

何故今回画像が開けなかったかというと、生成される実行ファイルに画像ファイル等を同梱する、PACKFILE機能の制限に引っ掛かっていた。同梱するファイルのファイル名は、11文字以内(拡張子も含めたら15文字以内)でなければならない、という罠を踏んでいた。画像ファイル名を短くしたら件のエラーは出ない状態になった。

つまり、今までこのWeb日記にアップロードしていたファイルは、HSP3.6 で動かそうとしても動かない状態になっていた。いやまあ、HSPエディタで開いて、F5キーで動作確認する分には動くのだけど…。実行ファイルを作成すると、そちらは動かないという…。

それにしても、HSP 3.7beta では何故エラーが出なかったのか。そのあたりの文字数制限が緩和されたのかな。しかし、doclib/history.txt を眺めても、それらしい記述が無いのだよな…。

何にせよ、同梱ファイルのファイル名は、昔の MS-DOS並の 8.3形式にしておいたほうが良さそう。数日後には忘れてしまいそうな予感もあるけれど…。

_8.3形式 - Wikipedia

余談。サポートしている画像について :

画像を読み込む picload について解説してるページを眺めていたら、「pngは対応してないよ」と書いてあって…。ありゃ。自分、png を読み込ませちゃってるよ…。でも開けてるよ…。なんで?

HSP 3.6の doclib/history.txt を確認したところ、HSP 3.31β1 の時点で機能追加されてたらしい。
2012/06/14 3.31β1
...
読み込み可能な画像フォーマットにPNG、TGA、PSD形式を追加

HSP 3.6 の Docs Library にも対応形式が書いてあった。

_OHDL - picload

良かった。PNGだけではなく、TGA や PSD にも対応してたのだな。安心して png を読み込ませることができそう。

#3 [hsp] HSPで生成したプログラムのアイコンを変えてみたかった

せっかくだから、HSPで生成した .exe や .scr のアイコンを変更してみたいと思い立った。環境は Windows10 x64 22H2。

HSP 3.6 や HSP 3.7beta では、ソース内で以下の記述をしておくことでアイコンを変更できるらしい。
#packopt icon "icon.ico"

しかし、上手く行かない…。

アイコンファイル作成 :

とりあえず、アイコンファイル(.ico)を作成。今回は、ToYcon 0.9 を使って、256x256、32bitカラーの1枚の画像からアイコンを作ってみた。

_ToYcon のダウンロードと使い方 - k本的に無料ソフト・フリーソフト

アイコンの種類は WindowsXPタイプにしてみた。32bit, 8bit, 4bitカラー で、48x48, 32x32, 16x16 のサイズを内包。全部で9個のアイコン画像が入ってるマルチアイコンファイル。

生成された .ico を、IcoFX Portable 1.6.4 Rev 3 で開いて確認してみたけれど、それらしいファイルになっているように見えた。

_IcoFX Portable (icon editor) | PortableApps.com

アイコンの変更ができない :

HSP 3.7beta、及び、HSP 3.6 のHSPエディタで目的のファイルを開いて、以下を記述してから Ctrl + F9 で実行ファイルを生成してみたのだけど、ダメだった…。

#packopt icon "icon.ico"

HSPバージョン生成ファイル結果
HSP 3.7beta7.exe生成Failure. ファイルは生成されるがアイコンは変わってない
HSP 3.7beta7.scr生成Failure. ファイルは生成されるがアイコンは変わってない
HSP 3.6.exe生成Success. ファイルも生成できて、アイコンも変わった
HSP 3.6.scr生成Failure. 途中でエラーが出る

アイコンが変更できた場合も、エクスプローラ上で見るとアイコンが変わってるようには見えない。ただ、Resource Hacker 5.1.8 を使って .exe の状態を確認すると、たしかに Icon Group が変わっていることが確認できた。

エラーが出る時は、DOS窓が開いて以下が表示された。
iconins.exe v1.00
Basic program has been created by Kpan.
Modified by inovia.

[ERROR] No.10
実行ファイルが見つかりません
Enterキーを押してください

iconinsについて :

HSP が #packopt の指定でアイコンを変更する場合、HSP に同梱されている iconins.exe というツールを使ってアイコンを変更しているらしい。

ただ、この iconins.exe を呼び出す別のプログラムが、実行ファイル名を "〜.exe" に決め打ちして iconins.exe を呼んでいるそうで…。故に、.exe を生成した場合はアイコン変更ができるけど、.scr を生成した場合はアイコン変更できない、という話を見かけた。

_HSP3.7bata でスクリーンセーバー作成 - HSPTV!掲示板

別途 iconins.exe を呼び出すことでアイコン変更できる時もあるらしい。何のオプションもつけずに iconins を実行すると以下のヘルプが表示される。
> iconins
iconins.exe v1.00
Basic program has been created by Kpan.
Modified by inovia.

使用法:
iconins -e"実行ファイルパス" -i"アイコンファイルパス" -v"バージョンファイルパス" -l"言語ID(オプション)" -u"UPX(オプション)" -m
"manifest(オプション)"

実行ファイルのパスや、アイコンファイルのパスは、絶対パス(C:\hoge\fuga\piyo.exe)じゃないとダメらしい。ファイル名のみ(piyo.exe)だけを指定してもエラーが出て動かなかった。

HSP 3.6 で生成した .exe や .scr は、後から別途 iconins.exe を呼び出すことでアイコン変更ができたけど。HSP 3.7beta で生成した .exe, .scr には反映されなかった。何故。

Let's HSPIC! を試してみた :

iconins.exe を使うことで上手く行かないなら、別のツールを使ったら上手くいくのだろうか? ググったところ、Let's HSPIC! なるツールがあるらしい。試用してみた。

_HSP補助ツール - Let's HSP!

lhspic10.zip を入手。バージョンは 1.0。解凍して任意のフォルダに置いた。

動作には Resource Hacker 3.4.0 日本語版 (rh_japanese.zip) が必要らしい。Internet Archive を探して入手。

_Resource Hacker (WebArchive)

zip を解凍して、これも任意の場所に置いた。

Let's HSPIC! (lhspic.exe) を起動して、ウインドウを右クリック。リソースエディタのパス、を選んで、ResHacker.exe を指定。

.exe と .ico をそれぞれウインドウの入力欄にドラッグアンドドロップすれば、入力ファイルとして指定できる。その状態で「Change!」ボタンをクリックすれば反映されるはず。

だったのだけど。「無効なファイルです。(1)」とエラーダイアログが表示されて、処理されなかった。

更に、Let's HSPIC! を閉じようとすると、Microsoft Visual C++ Runtime Library がエラーを出す。2009年頃のソフトのせいか、現状では動作に問題があるということだろうか…。

_Let's HSPIC! 追加インフォメーション

上記ページによると、hsp3mt.hrt を使用しているファイルに対してはエラーが出るそうで。hsp3mt.hrt はHSPをマルチスレッド対応にするためのファイルらしいけど、たしか HSP 3.6 や HSP 3.7beta では標準でマルチスレッドが有効になっている、という話を見かけた気がする…。

_HSP3.6 新機能ハイライト
また、これに伴って、HSP3.51まで用意されていたマルチスレッド版ランタイム(hsp3mt)の同梱を終了しました。 hsp3mtを使用していたユーザーは、引き続き標準のHSP3ランタイムをご使用ください。

HSP3.6 新機能ハイライト より


HSPの現行バージョンはランタイムが以前と変わってしまったので、Let's HSPIC! は使えない、ということかもしれないなと…。

2023/10/26追記 :

その後も実験していたら、HDP 3.7beta7 の場合も、後から iconins.exe を呼ぶことでアイコン変更できていることが分かった。

エクスプローラ上で見るとアイコンが変わってないので反映されていないものと思い込んでしまったけれど、Resource Hacker で exe や scr を開いてみると、Icon Group の項目内で、ちゃんとマルチアイコンが登録されていた。

また、作業ディレクトリ内の exe や scr をデスクトップにコピーしてみたところ、デスクトップ上ではちゃんとアイコンが変わった状態で表示された。

しかし、ソース内に #packopt icon "icon.ico" と書いてしまうと、HSP 3.6利用時に、スクリーンセーバとして scr を生成した際にエラーが出てしまう。そこで、iconin.exe を呼び出すbatファイルを書いて、exe や scr ができた後、手動でbatファイルを実行してアイコン変更するようにしてみた。

changeicon.bat
@rem @set ICONINSPATH=C:\Prog\hsp36\iconins.exe
@set ICONINSPATH=C:\Prog\hsp37beta\iconins.exe
@set CURDIR=%~dp0
%ICONINSPATH% -e"%CURDIR%p3drdscr.exe" -i"%CURDIR%icon.ico"
%ICONINSPATH% -e"%CURDIR%p3drdscr.scr" -i"%CURDIR%icon.ico"

現状では、このやり方が一番問題が少なそうな気もする。いやまあ、batファイル内の iconins.exe のパスを環境毎に変更しないといけない面倒臭さはあるのだけど…。

以上、1 日分です。

過去ログ表示

Prev - 2023/10 - 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 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project