ユーザ用ツール

サイト用ツール


ハイハイスクールアドベンチャー_.net_maui版

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
ハイハイスクールアドベンチャー_.net_maui版 [2025/10/27 01:55] arakiハイハイスクールアドベンチャー_.net_maui版 [2025/11/04 00:33] (現在) – [リソースファイル] araki
行 36: 行 36:
  
 MacOSやiOSではどうなるのか興味はありますが、テストする環境もないので特には確かめていません。 MacOSやiOSではどうなるのか興味はありますが、テストする環境もないので特には確かめていません。
 +
 +==== 選択ダイアログ ====
 +
 +ハイハイスクールアドベンチャーでは選択肢が必要な場合、オリジナル版ではコマンドラインから入力させていましたが、Palm版を作ったときからダイアログで選択する方式に改変しています。
 +
 +なので、選択ダイアログは必須なのですが、システムがいい塩梅のを提供してくれてなければ自分でダイアログを作っています。
 +
 +.NET MAUIにはDisplayActionSheet()という選択肢から選ぶダイアログが用意されているのでこれを丸っと使うだけで済みました。
 +
 +<code csharp>
 +string gender = await DisplayActionSheet("あなたの性別を教えて下さい", null, null, "男子", "女子");
 +</code>
 +
 +のようにすれば、下のようなダイアログが表示されて、genderには選ばれた方の選択肢の文字列がそのまま返ってきます。
 +ダイアログは当然非同期なので、適宜awaitします。
 +
 +{{::hhsadvmaui:displayactionsheet.png?400 |}}
 +
 +
 +==== マルチプラットフォーム対応 ====
 +
 +.NET MAUIは、Windows/Android/MacOS/iOS のマルチプラットフォーム対応です。
 +なので単一のソースから複数のプラットフォームに対応したパッケージを得ることができます。
 +もちろん、完全にすべてが同一というわけではなく、一部は、その機種のための設定やコードなどを書く必要がありますが、最小限度です。
 +
 +フレームワークとしてマルチプラットフォームをカバーするように作られいてるので、基本的に、ほとんどの処理の機種依存を隠ぺいしてくれています。
 +
 +このあたりは AvaloniaUIのマルチプラットフォーム対応とは大きく違っている部分だと思います。
 +AvaloniaUIも Windows/Linux/Web/Android/iOSをサポートしていますが、AvaloniaUI の名前の通り、こちらは基本的にUIに関する部分を中心にマルチプラットフォーム対応をしています。
 +
 +なので、ちょっと、ファイル操作を統一的にやろうとしたら、それはUIではないので、自分でインターフェイス書いて、クラスを機種ごとに実装して、それをDI注入しろとかいう話になって案外面倒くさいです。
 +
 +.NET MAUIはこのあたりも基本的にきれいに隠ぺいしているので、リソースファイルがプラットフォームによってはSeekできないなどの制約があったとしても、比較的楽にマルチプラットフォーム対応ができるようになっています。
 +これは秀逸でした。
 +
  
  
行 89: 行 124:
  
 <code xml> <code xml>
-<PropertyGroup>+<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
  <WindowsPackageType>None</WindowsPackageType>  <WindowsPackageType>None</WindowsPackageType>
  <WindowsAppSDKSelfContained>true</WindowsAppSDKSelfContained>  <WindowsAppSDKSelfContained>true</WindowsAppSDKSelfContained>
行 97: 行 132:
 最初は真面目に、ターゲットフレームワークが Windowsの時だけこれが設定されるようにとかしようと思ったんですが、なぜかうまくきかなくて、普通に共通の設定に混ぜちゃいました。 最初は真面目に、ターゲットフレームワークが Windowsの時だけこれが設定されるようにとかしようと思ったんですが、なぜかうまくきかなくて、普通に共通の設定に混ぜちゃいました。
 よくよく考えてみれば、WindowsPackageTypeだのWindowsAppSDKSelfContainedだのはWindows以外では無視されるので、分ける必要は皆無だってことに後から気づきました。 よくよく考えてみれば、WindowsPackageTypeだのWindowsAppSDKSelfContainedだのはWindows以外では無視されるので、分ける必要は皆無だってことに後から気づきました。
 +なお、Configuration == Debugの時もNoneにしてしまうと「配置ができない」といってデバッグ自体できなくなってしまうので、あくまでもリリース用の設定として、Release|AnyCPU のときだけの設定にしてあります。
  
-とはいえ、この設定をして、ターゲットを Windows Machineにすると、「発行」メニューがグレーアウトして選べないのです。+なお、この設定をして、ターゲットを Windows Machineにすると、「発行」メニューがグレーアウトして選べなくなります。
  
 {{::hhsadvmaui:publish_disabled.png?400|}} {{::hhsadvmaui:publish_disabled.png?400|}}
  
-なので、とりあえずはコマンドラインからやるしかないのです。+なので、発行自体はコマンドラインからやるしかないのです。
  
 <code powershell> <code powershell>
行 192: 行 228:
 両方ないと、Pixel Launcherはモノクロアイコンを正しく扱えません。 両方ないと、Pixel Launcherはモノクロアイコンを正しく扱えません。
 ==== 画面遷移は戻れない ==== ==== 画面遷移は戻れない ====
 +
 +.NET MAUIのアプリケーションは、App → AppShell → ContentPage という階層構造を持っています。
 +
 +アプリケーション本体の画面は、普通にプロジェクトを作れば MainPageというContentPageになります。
 +ここに設定画面やこのプログラムについて(About)などの画面を追加するとき、それぞれは別のContentPageになります。
 +
 +ページ遷移のための情報は AppShellのコンストラクタで定義をします。
 +ハイハイスクールアドベンチャーはMainPageのほかに SettingsPage, AboutPageを持っているので以下のようになっています。
 +
 +<code csharp>
 +    public partial class AppShell : Shell
 +    {
 +        public AppShell()
 +        {
 +            InitializeComponent();
 +            Routing.RegisterRoute(nameof(SettingsPage), typeof(SettingsPage));
 +            Routing.RegisterRoute(nameof(AboutPage), typeof(AboutPage));
 +        }
 +    }
 +</code>
 +
 +ページを開く処理をするときは
 +
 +<code csharp>
 +await Shell.Current.GotToAsync(nameof(SettingsPage));
 +</code>
 +
 +などとして、ページ遷移を行います。
 +
 +呼び出された画面には、明示的に「閉じる」のようなボタンを付けないでも、タイトルバーに「←」ボタンが出てくるので、これを押せば元のページに戻ります。
 +
 +が、戻ったときに、MainPageは新しく作り直されてしまい、要するにゲーム途中で設定を呼んだとしても、タイトル画面に強制的に戻されてしまうのです。
 +
 +GoBackComandを GoToAsync("..")のようにすれば元の状態に戻る(かもしれない)といわれて試してみましたが、戻れませんでした。
 +((何かほかの要因があるのかもしれないので、うまくいく場合もあるかもしれませんが。))
 +
 +要は、MainPageが初期化されても、元の状態に復帰できればいいわけなので、初期化時に元に戻れるように細工をしました。
 +
 +もともと、ハイハイスクールアドベンチャーはゲームのセーブとロードに対応しているので、ゲーム中であればメモリ上にデータをセーブして、初期化時にデータがあればそれをロードするだけでゲームの状態は元通りです。
 +
 +あとは、システムの状態(Title, Playing, GameOver)がどれなのかで、どの画面に戻せばいいのかを MainPageの初期化の中で切り分けるだけです。
 +
 +ログエリアの内容は、MVVM化したときに、MainPageではなく MainPageModelに分離してあったので、MainPageModelをシングルトンにして、画面遷移で MainPage自体が初期化されても、継承されるようにしておきます。
 +
 +ゲームデータや、システム状態も、モデル側に保存するようにして、画面遷移問題は解決しました。
 +
 +この辺がうまくデザインできていないと、設定画面をContentPageではなく、オーバレイで作り直しみたいなことになったかもしれません。
 +
 +MVVMなどのデザインにはこういう面でも意味があるんだと思いました。
 +
 +
 ==== Windows版の発行は自己内包型で ==== ==== Windows版の発行は自己内包型で ====
 +
 +publishするときに --self-contained trueをつけろという話です。
 +これをつけないと、.NET のラインタイムのリビジョンに強い縛りが発生して、結果実行できないバイナリが出来上がってしまいます。
 +((実行すると、延々 .NET Runtime 9.0.0をインストールしろと言われ続けるが、ダウンロードできるのが9.0.14だったりして結果要件を満たせない。))
 +
  
 ===== 技術的なこと ===== ===== 技術的なこと =====
行 221: 行 313:
 全部メモリ展開するっていうのもありかな、とちょっと思ったんですが、このゲームの基本的な構造は 500KB程度の M5 Stackや Raspberru Pi Picoなどでも動くように、けちけち使う分だけを展開するスタイル。 全部メモリ展開するっていうのもありかな、とちょっと思ったんですが、このゲームの基本的な構造は 500KB程度の M5 Stackや Raspberru Pi Picoなどでも動くように、けちけち使う分だけを展開するスタイル。
  
-Android版は当初、全部メモリに展開してたんですが、ソースを整理するときに全面的にけちけち戦略に書き直した経緯もあって、今更全部展開っていうのもな、と思い、ファイルをユーザデータ領域にコピーして使う方針に。+[[ハイハイスクールアドベンチャー Android版]]は当初、全部メモリに展開してたんですが、ソースを整理するときに全面的にけちけち戦略に書き直した経緯もあって、.NET MAUI版とはいえ今更全部展開っていうのもな、と思い、ファイルをユーザデータ領域にコピーして使う方針に。
  
 <code csharp> <code csharp>
ハイハイスクールアドベンチャー_.net_maui版.1761530101.txt.gz · 最終更新: by araki