ハイハイスクールアドベンチャー_windows版
差分
このページの2つのバージョン間の差分を表示します。
| 両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
| ハイハイスクールアドベンチャー_windows版 [2025/09/22 00:31] – [テーマ] araki | ハイハイスクールアドベンチャー_windows版 [2025/09/27 03:30] (現在) – [リソースファイルのコピー] araki | ||
|---|---|---|---|
| 行 30: | 行 30: | ||
| そのうち気が向いたらインストーラを作るかもしれません。</ | そのうち気が向いたらインストーラを作るかもしれません。</ | ||
| - | [[https:// | + | [[https:// |
| + | |||
| + | もし古いバージョンがインストールされていましたら、**お手数ですが、必ず、まず古いバージョンをアンインストールしてください**。 | ||
| + | 勝手インストーラで無署名のため、どうもアップデートがうまくいかず、古いものが残ったままのように見えてしまいます。((実際には新しいもので上書きされているのに。)) | ||
| + | インストール情報だけだと思っていますが、副作用があっても困るので、よろしくお願いします。 | ||
| + | ユーザーデータは削除されませんのでセーブデータなどは失われません。 | ||
| 初回実行時に、データフォルダを勝手に作って勝手にデータを放り込みます。 | 初回実行時に、データフォルダを勝手に作って勝手にデータを放り込みます。 | ||
| 行 48: | 行 53: | ||
| そう思ったので、Windowsのビットマップイメージに対して、ダブルバッファでの読み書きが可能かどうか AIに尋ねたら、できるよ、というので、実験コードを作って、思ったように動くことを確認し、一気に移植しました。 | そう思ったので、Windowsのビットマップイメージに対して、ダブルバッファでの読み書きが可能かどうか AIに尋ねたら、できるよ、というので、実験コードを作って、思ったように動くことを確認し、一気に移植しました。 | ||
| - | そもそも、SDL1番も C# | + | そもそも、SDL2版も C# |
| SDL2に依存していた描画、サウンド機能、そしてイベントループはすべてWPFのそれで置き換わっています。 | SDL2に依存していた描画、サウンド機能、そしてイベントループはすべてWPFのそれで置き換わっています。 | ||
| 行 159: | 行 164: | ||
| === そもそも一撃でキレイにテーマ対応させられない === | === そもそも一撃でキレイにテーマ対応させられない === | ||
| + | |||
| + | マイクロソフトは「テーマ」というものをどう考えているんでしょうか? | ||
| + | Androidはテーマは、そもそも雑にシステムの用意してるものを継承したとしても、そこそこの見栄えのものになるのに、基本的にWPFであるならば、自前で頑張らなあかん、ということらしいのです。 | ||
| + | |||
| + | 雑に「テーマ」を適用するだけなら、App.xaml にテーマファイルを用意しておいて、読み込ませるだけです。 | ||
| + | |||
| + | <file XML App.xaml> | ||
| + | < | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | <!-- デフォルトはライトテーマ --> | ||
| + | < | ||
| + | </ | ||
| + | < | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | </ | ||
| + | </ | ||
| + | |||
| + | 基本的に、テーマとしては「ライト」「ダーク」の大枠があります。 | ||
| + | 今後増えないことを祈りますが。 | ||
| + | |||
| + | Windowsのシステムがユーザごとにシステムテーマとして、ダークなのかライトなのかを保持しています。 | ||
| + | これはWPFの場合はAPIみたいに気の利いたのじゃなくてレジストリをじかに覗くことで取得できます。 | ||
| + | |||
| + | つまり、アプリ動いてる最中にシステムの設定変えられたら、自分でもう一回見に行かない限り変わったことを知るすべはないってことです。 | ||
| + | |||
| + | 完璧にやりたいならタイマーとかで定期的にチェックしろとAIはいいましたが、めんどくさすぎてそこまでやる気にはなれません。 | ||
| + | 動作中に切り替えられたら、それはもう放置です。 | ||
| + | |||
| + | この辺がめんどくさすぎたからなんでしょうか? | ||
| + | 多くのアプリが、テーマをシステム追随するか、あるいはもう、システムは関係なく、ダークまたはライトを強制する設定を持っているのは。 | ||
| + | |||
| + | ハイハイスクールアドベンチャーもこの先人たちの知恵に倣って、同じような設定を入れることにしました。 | ||
| + | |||
| + | 設定に従って、用意しておいた themes/ | ||
| + | |||
| + | <code c#> | ||
| + | string themePath = mode ? " | ||
| + | var uri = new URI(themePath, | ||
| + | ResourceDictionary themeDict = new ResourceDictionary { Source = uri }; | ||
| + | |||
| + | Application.Current.Resources.MergeDictionaries.Clear(); | ||
| + | Application.Current.Resources.MergeDictionaries.Add(themeDict); | ||
| + | </ | ||
| + | |||
| + | テーマファイルの中身は、「色」の指定と、それを使って、ウィジェットごとに「色」を割り当てていく作業になります。 | ||
| + | Androidだと、ライトテーマだけ全部書いておいて、ダークは色情報だけを上書きする、というような感じで作れますが、Windowsはよくわかりません。 | ||
| + | とりあえず、ウィジェットまわりは同じ内容を書いておいて、頭の方に集めた色情報の変更でライトとダークを分ける感じでテーマファイルを作っています。 | ||
| + | |||
| + | <file XML LightTheme.xaml> | ||
| + | < | ||
| + | xmlns: | ||
| + | |||
| + | <!-- 色定義 --> | ||
| + | <Color x: | ||
| + | <Color x: | ||
| + | <!-- コントロールスタイル例 --> | ||
| + | <Style TargetType=" | ||
| + | <Setter Property=" | ||
| + | <Setter Property=" | ||
| + | </ | ||
| + | |||
| + | <Style TargetType=" | ||
| + | <Setter Property=" | ||
| + | </ | ||
| + | |||
| + | <!-- TextBox --> | ||
| + | <Style TargetType=" | ||
| + | <Setter Property=" | ||
| + | <Setter Property=" | ||
| + | <Setter Property=" | ||
| + | <Setter Property=" | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <file XML DarkTheme.xaml> | ||
| + | < | ||
| + | xmlns: | ||
| + | |||
| + | <!-- 色定義 --> | ||
| + | <Color x: | ||
| + | <Color x: | ||
| + | <!-- コントロールスタイル例 --> | ||
| + | <Style TargetType=" | ||
| + | <Setter Property=" | ||
| + | <Setter Property=" | ||
| + | </ | ||
| + | |||
| + | <Style TargetType=" | ||
| + | <Setter Property=" | ||
| + | </ | ||
| + | |||
| + | <!-- TextBox --> | ||
| + | <Style TargetType=" | ||
| + | <Setter Property=" | ||
| + | <Setter Property=" | ||
| + | <Setter Property=" | ||
| + | <Setter Property=" | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ダークとライトの違いは最初の色の定義だけなのがわかると思います。((もちろんもっと複雑にライトだけの処理、ダークだけの処理を入れていくこともできますが。)) | ||
| + | |||
| + | こんな感じで、メニューがアクティブの時の色とか、必要なだけ色を作って、必要なウィジェットに色を割り当てていきます。 | ||
| + | |||
| + | 静的なウィジェットはまあ問題ないんですが、メニューのドロップダウンとか、スクロールビューにおけるスクロールバーなど、フローティングなウィジェットはテーマの割り当て方が何通りかあるようで、理解しきれません。 | ||
| + | AIの言うとおりにしておきました。 | ||
| + | うまくいかないときだけ頑張って調整しました。 | ||
| + | |||
| + | Androidはほとんど色をいじればあとは放置しておいてもウィジェットがいい感じに色を拾ってくれたのとは大違いです。 | ||
| + | 柔軟性が高いといえるのかもしれませんが、Androidだって、別に細かくやろうと思えばできるので、たぶんそういう話でもないです。 | ||
| + | 要は、あんまりテーマ使ってもらいたくないんじゃないかっていうのが正直な感想です。 | ||
| + | |||
| + | そういったことは、この後の「タイトルバー」などの扱いにも表れているように感じます。 | ||
| + | |||
| + | とにかく、テーマは WPFに関しては、とてもめんどくさい存在です。 | ||
| === タイトルバーは自前でつくれ === | === タイトルバーは自前でつくれ === | ||
| 行 492: | 行 622: | ||
| </ | </ | ||
| + | ==== スライドスイッチ風にしたい ==== | ||
| + | |||
| + | チェックボックスはいまどきつまらないよね。 | ||
| + | 見栄えを考えたらスライドスイッチ。 | ||
| + | |||
| + | AIに聞いたらスタイルでできるというのでやってみました。 | ||
| + | |||
| + | {{:: | ||
| + | |||
| + | まず、XAMLファイルで、スタイルを定義します。 | ||
| + | |||
| + | <code xml> | ||
| + | <!-- スライドスイッチ風 ToggleButton スタイル --> | ||
| + | <Style x: | ||
| + | <Setter Property=" | ||
| + | <Setter Property=" | ||
| + | <Setter Property=" | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | <!-- 背景 --> | ||
| + | <Border x: | ||
| + | CornerRadius=" | ||
| + | Background=" | ||
| + | Height=" | ||
| + | <!-- ノブ --> | ||
| + | <Ellipse x: | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | </ | ||
| + | < | ||
| + | <Trigger Property=" | ||
| + | <Setter TargetName=" | ||
| + | <Setter TargetName=" | ||
| + | </ | ||
| + | <Trigger Property=" | ||
| + | <Setter TargetName=" | ||
| + | <Setter TargetName=" | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | そして、レイアウト用のXAMLファイルでこのスタイルを持つ ToggleButtonを作ります。 | ||
| + | |||
| + | <code xml> | ||
| + | <Grid Margin=" | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | </ | ||
| + | < | ||
| + | < | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | スタイルだけでできるので簡単といえば簡単ですが、この程度のウィジェットは今どきデフォルトで用意してほしいですよね? | ||
| + | |||
| + | ==== リソースファイルのコピー ==== | ||
| + | |||
| + | リソースファイルのコピーをするには、ソリューションエクスプローラから、リソースファイルを一個一個選んで、ビルド時にコピーする設定をいれるといいのですが、実はこの方法だと、リソースディレクトリに階層がある場合にはうまくいきません。 | ||
| + | 勝手に一階層に改変されてしまうのです。 | ||
| + | |||
| + | ハイハイスクールアドベンチャーの場合は、data/ | ||
| + | |||
| + | これを避けようと思ったら、プロジェクトファイル((.csproj))を直接いじって、下のような設定を入れることでディレクトリ構造丸ごとコピーしてくれるようになります。 | ||
| + | |||
| + | <code xml> | ||
| + | < | ||
| + | <!-- data 以下のすべてのファイルを対象にする --> | ||
| + | < | ||
| + | <!-- 出力先にコピーするルール --> | ||
| + | < | ||
| + | <!-- フォルダ構造を保持する --> | ||
| + | < | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
ハイハイスクールアドベンチャー_windows版.1758501115.txt.gz · 最終更新: by araki
