「ふにゃ」に関する日記(4)

<前 次>

ふにゃ1

今回は音楽中心なので画面写真なし。

画像が一部欠ける現象、Widthプロパティが(もちろんHeightプロパティも)DPI依存で、古いビットマップ画像のDPIがなぜか95.95とか96.01とか、ぴったり96じゃないのが原因でした。
そうはいっても、ピクセルデータを持っていないはずがないので、ピクセル関係のプロパティを調べたら、そのものずばりなPixelWidthがあったので、それを使うようにしました。

変更点追記だけ。
…だけなのに、GitHub Copilotにコミットメッセージ任せたらとんでもないこと言い出したので、結局ほとんどコミットメッセージ削りました。

秘密機能だけじゃなくてバナナ取った数とかも入れていたので、しっくりくる名前に変更しました。

今日の本命、音楽再生。
VB版ではWindowsMediaPlayerを埋め込んでいたので、それに倣ってWPF版ではMediaPlayerを使っています。
やろうと思えば動画も音源にできますよ。

これはまあ、いつかやらないといけない、内容を変えないリファクタリング。

ふにゃ1


ステージ読み込みができるようになって、昔の動きがかなり再現できてきました。

昨日作っていた画面サイズ設定機能が完成しました。
小さくしたらこれ。
大きくしたらこれ。
最初に実装したウィンドウサイズ自動調整機能と正反対の機能なので、ちょっと時間がかかってました。

これ、バージョン1.0で廃止したんですが、実は実装だけ残っていたので、これも移植しました。
この演出が出るステージは、今のところ存在しません。

VB版ではメッセージはモーダルダイアログで表示していたため、閉じるまでメニュー操作ができませんでした。
それを再現するため、同一ウィンドウでモードレスになったC#版でもメニューを使用不可にしていました。
しかし、冷静に考えて、メニューが使えないのは不便でしかなかったので、バグらないように調整して、メニュー解禁しました。

ステージ読み込みのための一番大変な機能、ファイル読み込みを移植しました。
VB6のファイル読み込みは非常に癖があり、コンマと改行を区別しなかったり、読込先の変数の型によって処理が違ったりしてたんですよね。
完全ではないですが、再現しました。
本当はテキスト内のコンマとか引用符の挙動とかがさらに厄介なんですが、そこは妥協しています。

そして、ついにファイル読み込みができました!
実は画像が一部欠けたりして微妙な部分もあるのですが、とりあえず今までに作ったステージも大部分遊べます!

あとは、セーブデータ関連と秘密機能関連と、ヘルプも時代に合わせて作り直しかな。

アンパンマンDBとTGWSAdminとふにゃ1

アンパンマンDB(記事更新)

来週の放送情報。
ガレットさんは新キャラですね。
クレープの亜種みたいな感じ?折り畳みがポイント?

TGWSAdmin

いつも記入している定型データの記入が簡単になるようにテンプレート機能を追加。
簡単に実装できる割りに効果高いんだからもっと早く作っときゃよかった。

ふにゃ1

昨今の高解像度環境対応のため、画面サイズ変更機能を実装中。
実はふにゃさんでもやろうとしたことがあったんですが、あの時は頓挫してたんですよね。
今回はWPFなんで拡大縮小処理はフレーム側にお任せで楽ちんです。
まあ、今は画面写真を出せないぐらい挙動が変なんですがね。

GitHub Copilotとふにゃ1とFamiTracker

GitHub Copilot

Announcing GitHub Copilot Free - GitHub Changelog
なんか無料枠ができてました。
以前からちょいちょいお試しで触ってはいたんだけど、本格的に使い始めてもよさそう。
まあ、あまり本格的過ぎると無料枠の限度に達してしまうかと思いますが。

ふにゃ1

今回はスクショなし。

この辺はバグ修正。
カウントダウンのほうは、メッセージ表示にダイアログボックスを使わなくなったことで発生した初期化漏れ。
キー入力のほうは、リセットのコードが解析で出てこなかったので、原作でももしかしたら発生していたかもしれません。

これは単にコードを移植しただけ。
先ほどのGitHub Copilotに一度書かせてから、手直しして作ったものです。
コミットメッセージは、全面的にGitHub Copilotに任せました。
基本的に全面的に信用してプログラミングを任せるのはありえないですが、修正する前提で案を出してもらうとか、少し変でも害の少ないコミットメッセージあたりに使うのがよさそうかな。

ここはメニューの機能の実装だけで、実際の読み込み処理はまだ作っていません。

FamiTracker

ふにゃ1にはもともとBGMはついていなくて、プレイヤーが好きな音楽をかけられるだけでした。
せっかくの移植だしここらで標準のBGMでも作ってみようかと思って思い出したのがこれ。

FamiTracker
ファミコン音源で音楽作れるやつです。
単に音がファミコンっぽいってわけではなく、しっかり制限事項も含めてファミコンの仕様で音が鳴ります。
前回使ったのが2008年だから、16年ぶりか…。

ふにゃ1と浮き沈みランチャー

ふにゃ1


ステージクリアとゲームオーバーができた!!

食べ物取得処理…と、やられ判定も実はここ。

メッセージやらマウスカーソルやらでとかく隠れがちなふにゃの顔を何とか見せようとする修正です。

全クリの演出はVB版から仕様変更しています。
秘密機能を解放しても終了しない、複数の条件を満たしたら連続で取得可能、といったあたり。
あと、メッセージ表示が実質非同期になった関係で、内部的な処理の流れも変更しています。

これは単なる便利メソッド。

やられた時の演出。
ゲームオーバーも作っていますが、コンティニューの処理はまだテストできていません。

浮き沈みランチャー

昔立てた課題の内容を忘れてしまったので思い出そうとしているところ。

ふにゃ1


だいぶ動くようになってきました。
バナナ取得とミスを作ればとりあえずゲームとしては成立するようになります。

キー押しっぱなし暴走モードを止める、キー離す処理。

この辺は動作に係わらない微妙な修正です。

昨日の状態で床をすり抜けていたのは、移植の際に動く方向を間違えて設定していたことによるバグでした。

WPF標準のタイマーだと動きががたがただ立ったので、funyakプロジェクトからタイマー処理を移植してきました。
まさかエターナってたfunyakが役に立つ時が来るとは!

地形との当たり判定。
これでとりあえず不自由なく走り回れるようになったわけです。

事あるごとに出てくるメッセージボックスも実装しました。
もともとはダイアログボックスで表示していたのですが、タイマー処理中にダイアログボックスで処理を止めてしまうとまずかったのと、ダイアログボックスを閉じると元のウィンドウが別のウィンドウの後ろに回り込んでしまうという謎現象があったので、同じウィンドウ内に普通のボタンとして表示することにしました。
ついでに、コンティニュー演出時のキャンセル機能を独立したボタンにしたり、補足説明を右下に表示できるようにもしました。
秘密機能とか、もともとは番号しか表示されなくて、何の機能が解放されたかわかんなかったですからね。

ふにゃ1

ついに操作できるようになりました。
ボタン離したのを感知しないので走ったら走りっぱなしだし、足元の当たり判定がなんかおかしいようで、走った瞬間地面を貫通して落ち始めますが。
ここはコードのベタ移植じゃなくてちゃんと意味を把握して書き直さないといけなさそうですね。

あとは、今盛り込んでいる変更点をREADMEに追記しました。
リリース時に忘れちゃいそうだし。

ふにゃ1

ついに「動く」ようになりました。

画像読み込みに関しては、今日になってからStream経由で読み込む方法が分かったので、リソース→Stream→BitmapSource→Imageコントロールの経路で読み込むようにしました。
んで、いい感じに方法が確立できたので、マップ背景だけでなく、その他もろもろの画像も読み込むようにしました。
参考にしたのは以下のサイトなど。
アプリケーションのリソース ファイル、コンテンツ ファイル、およびデータ ファイル - WPF .NET Framework | Microsoft Learn
c# - IO.Stream to Image in WPF - Stack Overflow

MoveCharaとMainLoopがこの作品のゲームとしての中枢です。
もともとMainLoop関数はなくて、タイマーコントロールのイベント内に直接書いていたのですが、移植に当たって、ゲームのロジックの大部分が書いてあるCleater内に移しました。
ちなみにCleaterってモジュール名は、何かを生成することを意図してCreatorと書こうとして誤字ったんだと思われます。
もはや生成どころではない何でも屋になっているので、スペル修正はしていません。

ゲームの中枢はできたって言ったけど、操作受付はまだないので、落ちるだけです。
当たり判定もないので、床の下まで落ちていきます。
今後はそのあたりを重点的にですね。

ふにゃ1

コミット数多くなったけど、元のコードをだいたいサブプロシージャごとに移植してます。

バナナの絵は、もともとVB6に添付されていた矢印画像を使っていましたが、今回の移植を機に自分で描きなおしました。
元の画像よりちょっとスリムになっています。
いわゆる「おいしくなって新登場」ってやつです。

で、なんとかステージ画像が表示できるところまでこぎつけたんですが、WPFって画像処理まどろっこしいですね。
すぐに解決できない部分は、妥協して無理やりな方法使ってます。

とげの中でふにゃが笑っていることからもわかるように、まだまだゲームとして動く段階までは来ていません。

ふにゃ1とアンパンマンDB

ふにゃ1

まだゲームらしい部分は何一つ実装できてないけど、ゲームの動きに入るための入り口はできてきた感じ。

アンパンマンDB(記事更新)

コラムから転記。

「命の星がない」「顔がない」「女の子になった」の3つは、項目名が説明的過ぎたので、個別記事化するのは見送りました。
「顔が欠けて力が出ない」みたいに他の記事の一部に組み込むことも考えましたが、それだとコラムの一部だった元のままと同じなので、それもなしにしました。
一応、アンパンマン日替わり紹介botには反映しています。

ふにゃ1

とりあえず枠組みだけ作りました。
いざコードを写そうとしたら、定義のない変数がいきなり使われていたりして、思ったより解析進んでなかったなという印象。
少なくとも単なるVB6→C#への翻訳ではいかなそうです。

ちなみに、元のソースコードを失った真相というのは、Cleater.basの白紙化です。
あの頃はバージョン管理なんて個人で使うものじゃなかったし、そもそもまだ知らなかったし、こまめなバックアップもしてなかったんですよねぇ。

今はGitで一挙手一投足は記録するし、GitHubにコピーは作るし、自動バックアップの仕組みも構築しています。
何より、今はソースコードがいきなり消えない!!

ふにゃ1とドラゴンクエスト10

ふにゃ1

mifumi323/funya1_wpf: ふにゃ1のベタ移植プロジェクト
ゲームエンジンを使ってのいい感じのフルリメイクというのも考えたんですが、その前にまずは再公開に向けた、単なる移植をしておこうということで。
オリジナルのソースコードは紛失していますが、解析は進んでいるので、まあどうにかなるでしょう。

ドラゴンクエスト10

毎月10日はDQXで遊ぼう! ~みんな一緒に福の神まつり~ (2024/12/3)|目覚めし冒険者の広場
テンの日。
今回は福の神まつりだったそうなので、いつもより多めに迷宮回っときました。

ふにゃ1


VB6本体入れたら動きました。
ということはVB6ランタイムの何かが足りなかったということ?
他のVB6製ソフトがVB6本体入れる前から動いている以上、足りないのはVB6ランタイムそのものじゃないはず。
かといって、個別のコンポーネントかというと、それを個別にインストールしても何も進展がなかったのです。
ということは、足りなかったのは、素のVB6ランタイムになくてVB6本体に入っている何か、ということに。
メディアプレイヤーを埋め込んでいるのでそれ関係の可能性はあるけど、うーん…。

ふにゃ1

ふにゃ1、こっそりひっそりダウンロードコーナーからファイル消しました。
動作対応環境でも動かない問題とは別の問題も発生したのです。
問題のあったファイルを削除して再掲するか、フルリメイクするかは未定。
本当はフルリメイク相当のことはfunyakのプロジェクトでやりたかったんだけどね。

アンパンマンDBとふにゃ1

アンパンマンDB(記事更新)

「アンパンマン放送36周年おめでとう」を追加しました。
アンパンマンの日ですね。

ふにゃ1

おおむねソースコード解析完了。
軌道に乗ってからは早かったです。

ただ、ソースコード見るより実際に動かしたほうが一目でわかるだろうと思って、実行ファイル開いたら、エラーで起動できませんでした。
他のVB6製プログラムは動くのに、なぜ…。

こうなったら、夢じゃないとか夢みたいなこと言ってないで、本当に移植する必要があるかも。

ふにゃ1

久々に思い出してソースコードの解読作業中。
いや、やりたいなと時々思ってはいたんですよ。
ただ、別々のアプローチで進めていた二つのプロジェクトがあって、最終的に欲しい成果物は一つで、どっち使えばいいのよって状態だったのです。
その二つというのが、細かいところから順次解析していたボトムアップ式のプロジェクトと、全体像から段階的に掘り進めていくトップダウン式のプロジェクトです。
ボトムアップ式は具体的な計算内容がよくわかる代わりに何のための計算なのかなかなか判明せず、トップダウン式は全体的な流れは追いやすい代わりに計算の具体的な内容は複雑で手に負えない状態でした。
今回、情報量の多かったトップダウン式をベースに、ボトムアップ式の成果をマージするという形で作業を進めました。
すると、計算内容そのものも、そこに至る流れもわかるようになり、理解が飛躍的に進みました。
これなら、最新環境向けに移植するというのも夢ではなくなるかも。

外部リンクアイコンとふにゃ

外部リンクアイコン


うちで付けている外部リンクアイコン、実はアイコンじゃなくて絵文字なので、環境依存でただの矢印になることもあるんですよね。
だから、極力重くならないように、様々な環境で同じように表示できるように、SVGで極限までファイルサイズを小さく作ろうとしたのですが、なかなか難しいですね。

ふにゃ

mifumi323/funya_svg
ふにゃのSVG画像を取り扱うリポジトリ作りました。
funyakでは画面サイズやズーム率が可変になることを想定していて、ドット絵のままだとぼやけた印象になるかなと思って、スケーラブルなベクターグラフィックスにしてみました。
ゲームで使えるようにするには、結構な数用意しないといけませんが、レイヤーごとに使いまわせばまあまあ作りやすいかなとも思います。

FlyingJump

ゲーム記にふらじゃん追加しました。
私にとってとても思い出深い作品で、私が自作ゲーム『ふにゃ』を作るきっかけとなったゲームです。
せっかくなので、自作ステージも公開してみました。

ふにゃ

ソースコードの解読も進んできたことだし、いっちょベタ移植でもやってみていいかなーとか考え中。
変数のつながりが読み切れていないので、ささっと作れるわけではないですが…。

ふにゃ

funyakの動きのスピードがおかしい気がしたので、ふにゃの動きを第一作から見直してみることにしました。
まだP-Codeの解読が進んでいなくて空中の動きは調べられていないんですけどね。
地上の動きは一応把握できました。
空中挙動の修正はもう少しかかりそうですが、しゃがみ歩きなどは遠からずfunyakに搭載できそうです。

<前 次>