2023-09-28に更新

2D RPG 制作ツールを作ろうぜ(^~^)? <その2>

読了目安:53分

前の記事

📖 前回の記事: 2D RPG 制作ツールを作ろうぜ(^~^)? <その1>

📅 (2023-07-17 mon 海の日)ボタンのマウスホバーはだいたいでけた

202307__maui__17-0228--localization.gif

ramen-tabero-futsu2.png
「 👆 MAUI は タップ仕様なんで マウスに対応してない。これでも ちょっとは マシにした方」

kifuwarabe-futsu.png
「 今日は ここまでだな」

ohkina-hiyoko-futsu2.png
「 せっかく 2つ目の記事に来たのに……」

(Zzz Zzz Zzz Zzz)

ズームしろだぜ

ramen-tabero-futsu2.png
「 起きた」

kifuwarabe-futsu.png
「 枠線が太くて タイルがよく見えない。タイルをでかく表示してくれだぜ」

ramen-tabero-futsu2.png
「 ズームか。
係数を ちゃんと正しく書けば いけるはず……」

kifuwarabe-futsu.png
「 👇 行列演算するんじゃないか?」

📖 SkiaSharp + Zoom

ramen-tabero-futsu2.png
「 キャンバスがやってくれるのか、画像がやってくれるのか分からん」

ohkina-hiyoko-futsu2.png
「 キャンバスの 横幅と 縦幅を変えるだけで ズームしてくれるんじゃないの?」

ramen-tabero-futsu2.png
「 あっ! そういうことか!」

(カタ カタ カタ カタ)

ramen-tabero-futsu2.png
「 グリッドは 画像として実装しているので、 ズームされると ばかでかい画像になるんだが」

ohkina-hiyoko-futsu2.png
「 グリッドは 画像に対して かけるのではなく、
画面に かければいいんじゃないの?」

ramen-tabero-futsu2.png
「 そうか!」

ramen-tabero-futsu2.png
「 画面のスクロールと連携とれるかな?」

グリッドの実装を考えようぜ?

ramen-tabero-futsu2.png
「 グリッドは 元画像のサイズとは関係なく 画像サイズも指定することにしたい」

ohkina-hiyoko-futsu2.png
「 グリッドの線には太さがあって 元の画像から 1px はみ出るけど、
1024 x 1024 pixels の画像にかけるグリッドが 1026 x 1026 pixels なの、気持ち悪くない?」

ramen-tabero-futsu2.png
「 ゲームの実行時に合わせて最適化すると、開発環境は 割り食うが、
ゲームの実行環境より、開発環境の方が 大幅にマシン性能が良いということを期待して、
開発環境は 割り食うことにしようぜ?」

202307__maui__17-1729--GridPhase-o2o0.png

ramen-tabero-futsu2.png
「 👆 まず、 グリッド全体 と呼んでいたものを、 グリッド位相 に改名する」

ohkina-hiyoko-futsu2.png
「 上側のメニュー、 画像 の1行じゃなくて、
元画像ビュー の2段にしないと のちのち 混乱するんじゃない?」

202307__maui__17-1754--WorkingImageSize-o2o0.png

ramen-tabero-futsu2.png
「 👆 利用者としては 不要な情報だが、
これがないと 開発中の わたしが混乱するから 付けておこう」

ramen-tabero-futsu2.png
「 Width と Height を変えて画像がデカくなるの 元画像を引き延ばすだけなら そうかもしれないが、
いろいろ 加工したいので ズームは自力実装することにするぜ」

202307__maui__17-1838--Zoom.png

ramen-tabero-futsu2.png
「 👆 数字を ちょこちょこ変更できる入力欄に すぐ反応するように ズーム機能を実装するの 大変だな。
要らん処理しないようにすることが」

📅 (2023-07-18 tue) 健康診断のため休み

ramen-tabero-futsu2.png
「 寝不足で 電車移動と 炎天下の徒歩で きつい」

kifuwarabe-futsu.png
「 せっかくの年休なのに お父んが ヘロヘロだ。
寝てるぐらいなら 風呂掃除でもしてくれだぜ」

ramen-tabero-futsu2.png
「 ユニットバスの床だけ 洗い流した。
全部きっちりやろうとすると つらいので これで終わり」

グリッドの画像サイズ

202307__maui__18-1404--Grid.png

ohkina-hiyoko-futsu2.png
「 👆 グリッドがなんか切れてない?」

ramen-tabero-futsu2.png
「 グリッドも画像だからな。ズームをしたときに
グリッドの画像サイズも変えてないので 切れてるんだぜ」

kifuwarabe-futsu.png
「 分かってるんだったら 直せだぜ」

ramen-tabero-futsu2.png
「 画面上に グリッドの画像サイズを出そうかな。わたしがデバッグするために」

ramen-tabero-futsu2.png
「 グリッドは なんかトリック・コード書いていて やりづらいな……」

ohkina-hiyoko-futsu2.png
「 トリック無しで グリッドを再描画できないの?
Invalidate() メソッドとか使えば 再描画できないの?」

ramen-tabero-futsu2.png
「 なんらかのプロパティが変わってないと 再描画しないようだぜ」

202307__maui__18-1457--GridError.png

ramen-tabero-futsu2.png
「 👆 ズームに実数を入れると、ずれてしまうな。
計算式の端数の丸め方が 揃っていないのだろう」

ramen-tabero-futsu2.png
「 for文で 横幅ずつ 横に移動しているところが int 型なの、これが怪しいな double 型へ変更しよう」

ramen-tabero-futsu2.png
「 SkiaSharp のメソッドが float 型を受け取るようだから、 double 型ではなく、 float 型にしよ」

202307__maui__18-1853--TileCursorError.png

ramen-tabero-futsu2.png
「 👆 グリッドは ズームに対応したぜ」

kifuwarabe-futsu.png
「 カーソルが ずれてるぜ。直せだぜ」

202307__maui__18-2356--FloatFormat.png

ramen-tabero-futsu2.png
「 👆 テキストボックスの 小数点の桁数を何桁表示するかのフォーマットって 設定できないかだぜ?」

kifuwarabe-futsu.png
「 👇 そんなものは無いかもしれないな」

📖 Microsoft > 入力

ramen-tabero-futsu2.png
「 じゃあ 表示用に整形したプロパティを別途用意するかだぜ」

ramen-tabero-futsu2.png
「 👇 書式指定子 わかんね」

📖 Microsoft > Standard numeric format strings

202307__maui__19-0024--FloatFormat.png

ramen-tabero-futsu2.png
「 👆 "F1" にすれば 小数点以下1桁 になるみたいだぜ」

202307__maui__19-0033--WIP-Zoom-o2o0.png

ramen-tabero-futsu2.png
「 👆 カーソルや、カラー・マップを ズームに対応させるの まだまだ かかりそう。
今日はもう寝る」

📅 (2023-07-19 wed) 野球のオールスター観てた

休み

📅 (2023-07-20 thu) 野球のオールスター観てた

休み

📅 (2023-07-21 fri) カラーマップもズームに対応しろだぜ

ramen-tabero-futsu2.png
「 作業用BGMなんか ないかな?」

ohkina-hiyoko-futsu2.png
「 👇 植松伸夫の バトル1 を永遠に聞き続けなさい」

📖 バトル1

kifuwarabe-futsu.png
「 RPGだ!」

ramen-tabero-futsu2.png
「 原曲じゃないか…… アレンジがいいのに……」

202307_maui_21-2230--recordList-o2o0.png

ramen-tabero-futsu2.png
「 👆 この List<TileRecord> RecordList というのが タイル1個分のデータだが、
ズーム後の表示サイズのようなものは 記録しないぜ」

ramen-tabero-futsu2.png
「 そこで 例えば List<TileViewModelRecord> RecordViewModelList のように
ズーム後の表示サイズも記録するように 拡張するのが 基本的な考え方だぜ」

202307_maui_21-2237--tileRecord-o2o0.png

ramen-tabero-futsu2.png
「 👆 TileRecord ってこういうモデルだが、 これとは別に TileRecordViewModel というビューモデルを作ることにしよう」

202307_maui_21-2259--tileRecordViewModel-o2o0.png

ramen-tabero-futsu2.png
「 👆 主な違いは、位置とサイズを、元データとズーム後の2つに分けて持つことだぜ」

202307_maui_21-2351--tileSettingViewModel-o2o0.png

ramen-tabero-futsu2.png
「 👆 タイル設定ファイルも ビューモデル バージョンを作っておこうぜ」

202307_maui_22-0148--zoomAsFloat-o2o0.png

ramen-tabero-futsu2.png
「 👆 そして ズーム欄の数値を変更したタイミングで、
カラー・マップの 色矩形の位置とサイズを 全部更新すればいいわけだぜ」

ohkina-hiyoko-futsu2.png
「 ズームの数値を変えたときに 起こることが
タイルセット画像の伸縮と、グリッドの伸縮と、
切抜きカーソルや、画面上のオブジェクトの位置とサイズの変更と、
やることが多いのよねえ」

202307_maui_22-0211--zoomedColorMap.png

ramen-tabero-futsu2.png
「 👆 カラーマップを拡大したぜ」

kifuwarabe-futsu.png
「 お父ん、タイルセット画像を暗くしていたのが 効いてないぜ」

ramen-tabero-futsu2.png
「 あれま ほんとだぜ。なんでだろな 調べるか」

202307_maui_22-0226--zoomedColorMap.png

ramen-tabero-futsu2.png
「 👆 ズームした時も 明度を下げるようにしたぜ」

入力もズームの縮尺に合わせろだぜ

kifuwarabe-futsu.png
「 お父ん、マウスカーソルが指している位置と、切抜きカーソルが出てくる位置がずれているぜ」

ramen-tabero-futsu2.png
「 入力は ズームかかってないからな。そこも実装しないといけないか~」

202307_maui_22-0316--zoomedCursor.png

ramen-tabero-futsu2.png
「 👆 入力も ズームを考慮して 行えるようにしたぜ」

202307_maui_22-0319--zoomedCursorError-o2o0.png

kifuwarabe-futsu.png
「 👆 ズームを変えても、切抜きカーソルが 置いてけぼりをくらってるぜ」

ramen-tabero-futsu2.png
「 ズームの数字が変わったら、切抜きカーソルの矩形の位置とサイズも 再設定しないといけないな」

202307_maui_22-0422--zoomedCursor.png

ramen-tabero-futsu2.png
「 👆 カーソルも ズームに置いてけぼりされないようにしたぜ」

インターセクションが無いようにしましょう

ohkina-hiyoko-futsu2.png
「 矩形が 重なりまくって 分けわかんないんだけど」

202307_maui_22-1435--noIntersection.png

ramen-tabero-futsu2.png
「 👆 つまり こういう状態になることを 強制する方法か」

kifuwarabe-futsu.png
「 既存の登録タイルと重なっているときは タイルを追加できないようにすればいいのでは?」

ramen-tabero-futsu2.png
「 既存のタイルと重なっている と、ユーザーにどうやって 気づかせるんだぜ?」

ohkina-hiyoko-futsu2.png
「 とりあえず 追加ボタンが押せなければいいんじゃないの?」

ramen-tabero-futsu2.png
「 じゃあ 切抜きカーソルの位置を決めるために マウスを動かしている間、
インターセクション(Intersection;重なり合った領域)があるかどうか 判定すればいいんだぜ」

ramen-tabero-futsu2.png
「 👇 交差の判定方法を調べて」

📖 矩形同士の交差

202307_maui_22-1658--rectangleIntersection-o2o0.png

ramen-tabero-futsu2.png
「 👆 判定方法を実装」

202307_maui_22-1703--hasIntersection-o2o0.png

ramen-tabero-futsu2.png
「 👆 登録されているすべてのタイルと 比較すればいいわけだが、
リストではなく、 IEnumerator 型を使うのが ひと工夫だぜ」

202307_maui_22-1707--viewModelIntersection-o2o0.png

ramen-tabero-futsu2.png
「 👆 このように ストリームで渡せるようにしておくと、
ビューモデルも 同じアルゴリズムを使い回せるな」

202307_maui_22-1711--intersecting-o2o0.png

ramen-tabero-futsu2.png
「 👆 これで交差中か 判定できるようになったぜ」

202307_maui_22-1734--congruence-o2o0.png

kifuwarabe-futsu.png
「 👆 お父ん、コングルエンス(congruence ;合同)と インターセクション(Intersection;交差)は 区別してくれだぜ」

ramen-tabero-futsu2.png
「 考え出すと お互いに部分的な交差、完全に覆っている交差、完全に覆われている交差、いろいろあるな。
インターセクションから コングルエンスを除外するか、それとも インターセクションでありコングルエンスでもあることがあるか?」

ohkina-hiyoko-futsu2.png
「 インターセクションを見つけることと、コングルエンスを見つけることは 時間が異なるんじゃない?
同じアルゴリズムで一緒にやろうとしたら 実行時間が最悪のケースにならない?」

ramen-tabero-futsu2.png
「 じゃあメソッドを分けるか」

202307_maui_22-2040--congruence.png

ramen-tabero-futsu2.png
「 👆 合同のときは 上書きできるように直したが、
今度は削除ボタンが効かなくなった。調べるぜ」

ramen-tabero-futsu2.png
「 論理削除されているものを 保存から除外してたから 保存されなかったんだ。
論理削除されているものも 保存するように直そう」

ramen-tabero-futsu2.png
「 それでも直らん」

ファイルの内容をチェックするプログラムを入れておくべきでは?

202307_maui_22-2104--congruence-o2o0.png

ramen-tabero-futsu2.png
「 👆 データの中に 合同の矩形が2つある!
片方を論理削除しても、もう片方が残ってる!」

kifuwarabe-futsu.png
「 ファイルの内容をチェックするプログラムを入れておくべきでは?」

202307_maui_22-2132--validation-o2o0.png

ramen-tabero-futsu2.png
「 👆 とりあえず デバッグモードで確認するようにした」

202307_maui_22-2140--Id-o2o0.png

ramen-tabero-futsu2.png
「 👆 あれっ! Idが重複しまくってる!」

kifuwarabe-futsu.png
「 Idの採番部を見直せだぜ」

202307_maui_22-2300--fix-id.png

ramen-tabero-futsu2.png
「 👆 Idの採番部を直したぜ」

Disable のボタンのスタイル直せないの?

ohkina-hiyoko-futsu2.png
「 不活性のボタンは 文字が黒い青いボタンになってるけど、
グレーのボタンにできないの?」

ramen-tabero-futsu2.png
「 スタイル いつの間にか おかしくなった 調べるか」

202307_maui_22-2306--buttonStyle-o2o0.png

ramen-tabero-futsu2.png
「 👆 ここに指定している通りに 表示してくれたらいいのに……」

kifuwarabe-futsu.png
「 その上で BackgroundColor を指定しているのが ダメなんだろうかだぜ?」

202307_maui_22-2311--buttonStyleNormal-o2o0.png

ramen-tabero-futsu2.png
「 👆 Normal も設定したら 直った」

グリッドの色を白にしない?

ohkina-hiyoko-futsu2.png
「 グリッドの色が赤なの主張が強いから 白にしない?」

202307_maui_22-2333--gridIsWhite.png

ramen-tabero-futsu2.png
「 👆 カラーマップの色と 衝突してしまうぜ?」

ohkina-hiyoko-futsu2.png
「 タイルセット画像と同じだけ 明度を落とした白にすんのよ」

202307_maui_22-2337--gridIsGray.png

ramen-tabero-futsu2.png
「 👆 落ち着いた 目に優しい色になったぜ」

カラーマップの枠の色の青紫の明度を上げれないか?

kifuwarabe-futsu.png
「 青紫の明度が低いなあ」

ohkina-hiyoko-futsu2.png
「 SkiaSharp には RGBじゃなくて 色相と明度で指定する方法 無いの?」

ramen-tabero-futsu2.png
「 👇 HSVか。有るかも知れないな。調べてみるか。有った」

📖 SKColor.FromHsv(Single, Single, Single, Byte) Method

202307_maui_23-0013--colorMap.png

ramen-tabero-futsu2.png
「 👆 目に優しくないな……」

ohkina-hiyoko-futsu2.png
「 ビビッドか、ストロングなの やめなさいよ」

202307_maui_23-0019--light.png

ramen-tabero-futsu2.png
「 👆 じゃあ ライトで」

ohkina-hiyoko-futsu2.png
「 ここらへんで 決めましょう」

作業中の表示が邪魔じゃないか?

kifuwarabe-futsu.png
「 ここまで画面ができあがってくると、画面上に出ている 作業中 の表示は もう要らないんじゃないか?」

ramen-tabero-futsu2.png
「 コメントアウトの切替えで復活できるようには しておきたいな」

202307_maui_23-0100--no-debug.png

ramen-tabero-futsu2.png
「 👆 デバッグ用のものを 非表示にしたぜ」

ohkina-hiyoko-futsu2.png
「 ひとまず この画面は完成としましょう」

タイルセット画像選択画面を作れだぜ

kifuwarabe-futsu.png
「 その画面に入る前に 本当は タイルセット画像を選ぶ画面が要るだろ」

ramen-tabero-futsu2.png
「 フォルダーや ファイルの概念が分からない ツクラー種族や、スマホ種族を どうしてくれよう」

202307_maui_23-0111--tileset-folder.png

ohkina-hiyoko-futsu2.png
「 👆 このフォルダーに置け、と決めて置いたら いいんじゃない?」

ramen-tabero-futsu2.png
「 タイルセット画像というものが、ファイル名ぐらいでしか管理されてないことに
前時代的なものを感じるぜ」

kifuwarabe-futsu.png
「 Author で分けたくは ある」

ramen-tabero-futsu2.png
「 全ての .png 画像に、 .toml 設定ファイルを添えるかな?」

202307_maui_23-0140--image-data.png

ramen-tabero-futsu2.png
「 👆 これぐらいじゃ 全然足りないだろうけど」

ohkina-hiyoko-futsu2.png
「 画像フォルダーに .toml 入ってたら 邪魔じゃない?」

ramen-tabero-futsu2.png
「 ファイルの説明のファイルだから、ファイルの隣に有ってほしいんだぜ。
同じファイル・パスですぐ見つかる感じで」

ファイル名のリストを表示してみろだぜ

kifuwarabe-futsu.png
「 試しにファイル名のリストを表示してみろだぜ」

ramen-tabero-futsu2.png
「 といっても テーブル・ビューを使えばいいのか、
コレクション・ビューを使えばいいのか、 リスト・ビューを使えばいいのか、
さっぱり分からないが……」

kifuwarabe-futsu.png
「 👇 サンプルがあるそうだぜ」

📖 .NET MAUIのCollectionViewを試してみる
📖 DotNet > maui-samples

ramen-tabero-futsu2.png
「 👇 これを見てみるかだぜ」

📖 https://github.com/dotnet/maui-samples/tree/main/7.0/UserInterface/ControlGallery

202307_maui_23-0512--collectionView.png

ramen-tabero-futsu2.png
「 👆 これが コレクション・ビュー らしいんだが、何がいいんだろなあ?」

202307_maui_23-0512--listView.png

ramen-tabero-futsu2.png
「 👆 これが リスト・ビュー らしいんだが、何がいいんだろなあ?」

202307_maui_23-0531--refreshView.png

ramen-tabero-futsu2.png
「 👆 これが リフレッシュ・ビュー らしいんだが、何がいいんだろなあ?」

202307_maui_23-0533--swipeView.png

ramen-tabero-futsu2.png
「 👆 これが スワイプ・ビュー らしいんだが、何がいいんだろなあ?」

202307_maui_23-0535--tableViewForAForm.png

ramen-tabero-futsu2.png
「 👆 これが フォームが乗っているテーブル・ビュー らしいんだが、何がいいんだろなあ?」

202307_maui_23-0536--tableViewForAMenu.png

ramen-tabero-futsu2.png
「 👆 これが メニューになっているテーブル・ビュー らしいんだが、クリックすると画面遷移するぜ」

ramen-tabero-futsu2.png
「 どれが いいんだろな?」

ohkina-hiyoko-futsu2.png
「 グーグルのイメージ検索結果みたいに 画像を並べるのがいいんじゃない?」

ramen-tabero-futsu2.png
「 そういうのが コレクション・ビュー なのかな」

202307_maui_23-1433--collectionViewXaml-o2o0.png

ramen-tabero-futsu2.png
「 👆 じゃあ コレクション・ビューの XAML を見てみるか」

ItemsSource="{Binding Monkeys}"

ohkina-hiyoko-futsu2.png
「 👆 Monkeys って何なの?」

ramen-tabero-futsu2.png
「 MVVM 使ったサンプルなのかと思ったら MVVM 使ってねー」

202307_maui_23-1445--monkeyList-o2o0.png

ramen-tabero-futsu2.png
「 👆 ただの Monkey 型のリストだぜ」

ramen-tabero-futsu2.png
「 Monkey 型は、 Name, Location, Details, ImageURL のプロパティを持っているぜ」

作業用BGMをかけようぜ?

ramen-tabero-futsu2.png
「 作業用BGMを掛けようぜ?
YouTube に何かないかな?」

ohkina-hiyoko-futsu2.png
「 それは 作業用BGMじゃなくて 違法アップロード動画なのよ」

ramen-tabero-futsu2.png
「 👇 この音楽データは 買ったことがあると思うぜ」

📺 Rockman Arrange Album - iwao

kifuwarabe-futsu.png
「 また ROCKMAN だ。 お父んは 音楽の聞き分けは ROCKMAN かそうでないか ぐらいしか 耳が分からないんだ」

コレクション・ビューを調べようぜ?

202307_maui_23-1516--monkeyClass-o2o0.png

ramen-tabero-futsu2.png
「 👆 Monkey クラスは ただのモデルだぜ」

                <DataTemplate>
                    <Grid Padding="10">
                        <Grid.RowDefinitions>
                            <RowDefinition Height="35" />
                            <RowDefinition Height="35" />
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="70" />
                            <ColumnDefinition Width="80" />
                        </Grid.ColumnDefinitions>
                        <Image Grid.RowSpan="2" 
                               Source="{Binding ImageUrl}" 
                               Aspect="AspectFill"
                               HeightRequest="60" 
                               WidthRequest="60" />
                        <Label Grid.Column="1" 
                               Text="{Binding Name}" 
                               FontAttributes="Bold"
                               LineBreakMode="TailTruncation" />
                        <Label Grid.Row="1"
                               Grid.Column="1" 
                               Text="{Binding Location}"
                               LineBreakMode="TailTruncation"
                               FontAttributes="Italic" 
                               VerticalOptions="End" />
                    </Grid>
                </DataTemplate>

ohkina-hiyoko-futsu2.png
「 👆 じゃあ <DataTemplate> というのは ただのグリッド・レイアウトだから
それ以外のところに コレクション・ビュー 独自のものがあるはずよ」

ItemsLayout="VerticalGrid, 2"

ramen-tabero-futsu2.png
「 👆 ここだけしか 独自のものが無いが……」

kifuwarabe-futsu.png
「 👇 ItemsLayout は ここにまとまってあるぜ」

📖 CollectionView レイアウトの指定

ramen-tabero-futsu2.png
「 コレクション・ビューの使い方は分かった。使ってみよう」

ramen-tabero-futsu2.png
「 じゃあ Monkey クラスに当たるものを作ろう。
TilesetRecord みたいな名前でいいかな」

202307_maui_23-1543--tilesetRecord-o2o0.png

ramen-tabero-futsu2.png
「 👆 とりあえず 深く考えず TilesetRecord を作った」

202307_maui_23-1610--tilesetRecords-o2o0.png

ramen-tabero-futsu2.png
「 👆 リストも 仮の内容で 作っておこうぜ」

ramen-tabero-futsu2.png
「 internal プロパティは XAMLから見えないのか。 public プロパティに変えよ」

kifuwarabe-futsu.png
「 モデルのプロパティに public を強要するのは おかしい。
本来は ビューモデル にするべきでは?」

ramen-tabero-futsu2.png
「 MVVMのサンプルじゃないしなあ。
MVVUでやるなら ビューモデルかな」

202307_maui_23-1626--collectionView.png

ramen-tabero-futsu2.png
「 👆 こういう見た目になった。 サムネイル画像が無いと 寂しい」

ohkina-hiyoko-futsu2.png
「 サムネイル画像を生成するプログラムを 先に書いたらいいんじゃない?」

テンポラリー・フォルダーをどこにするかだぜ?

202307_maui_23-1632--temporaryFolder.png

ramen-tabero-futsu2.png
「 👆 ユニティ・プロジェクトに 一時ファイルを入れたくないんで、
ローカルPCのフォルダーに 著者名、作品名で フォルダー切った方がいいかだぜ?」

kifuwarabe-futsu.png
「 Windows べったりな発想だな。MAUI に テンポラリー・フォルダーの概念 無いのかだぜ?
👇 調べろだぜ」

📖 How can I save temporary file in .NET MAUI?
📖 File system helpers

ramen-tabero-futsu2.png
「 MAUI の流儀では テンポラリー(Temporary;一時的な)と呼ばず キャッシュ(Cache;隠し場)って呼ぶんだな」

(カタ カタ カタ カタ)

ramen-tabero-futsu2.png
「 👇 C# で Windows のファイル・エクスプローラーを開く方法も調べとこう」

📖 How can I open a folder in Windows Explorer?

202307_maui_23-1843--accessDenied.png

ramen-tabero-futsu2.png
「 👆 キャッシュ・ディレクトリーを開こうとしたら アクセスを拒否されたぜ」

(カタ カタ カタ カタ)

ramen-tabero-futsu2.png
「 あれっ? 隠しフォルダーではないフォルダーからも アクセスを拒否されたぜ」

kifuwarabe-futsu.png
「 MAUI で ファイル・エクスプローラーを開けることが イレギュラーなんじゃないか?」

202307_maui_23-1922--cacheDirectory-o2o0.png

ramen-tabero-futsu2.png
「 👆 とりあえず キャッシュ・ディレクトリーの場所だけ示すことにした」

ramen-tabero-futsu2.png
「 キャッシュ・ディレクトリーの下は どのように使うかといった流儀は あるのかだぜ?」

ohkina-hiyoko-futsu2.png
「 MAUI より、 UWP を調べた方がいいんじゃない?」

ramen-tabero-futsu2.png
「 分からん。 とりあえず 勝手に使って、文句出たら 変えよう」

202307_maui_23-1945--longDirectoryName-o2o0.png

ramen-tabero-futsu2.png
「 👆 170文字ぐらいあるが、だいたい 255文字しか入らないのに大丈夫か?」

kifuwarabe-futsu.png
「 まあ とりあえず それで」

📅 (2023-07-24 mon)フォルダーなの? ディレクトリーなの?

ohkina-hiyoko-futsu2.png
「 フォルダーなの? ディレクトリーなの?」

ramen-tabero-futsu2.png
「 どっちでもいい」

kifuwarabe-futsu.png
「 お父んのソースコードでは ディレクトリ という単語は0件で、 フォルダ で統一されているぜ。
しかし C# の入出力ライブラリーのプロパティ名は Folder ではなく Directory だぜ」

ohkina-hiyoko-futsu2.png
「 プログラマーは この表記ゆれを気にしないの?」

ramen-tabero-futsu2.png
「 ファイルで連想する対になるものは フォルダーだぜ。
ディレクトリーは 歴史的な名称だぜ」

kifuwarabe-futsu.png
「 じゃあ ネギラーメンは フォルダーで統一するかだぜ」

Tileset フォルダーなの? Tilesets フォルダーなの?

ohkina-hiyoko-futsu2.png
「 Tileset フォルダーなの? Tilesets フォルダーなの?」

ramen-tabero-futsu2.png
「 タイルセットが いくつか入っていることを期待するから Tilesets でフォルダーだぜ。
うおお。 名前の付け直しだ」

タイルセットのサムネイル画像の仕様を決めようぜ?

ramen-tabero-futsu2.png
「 そもそも タイルセット画像って 小さいんだよな」

ohkina-hiyoko-futsu2.png
「 そのまま 並べりゃどうなの?」

ramen-tabero-futsu2.png
「 とりあえず、タイルセット画像を、そのまま複製して キャッシュ・フォルダーの下に置くプログラムを考えてみようぜ?」

202307_maui_24-2142--image-copy-o2o0.png

ramen-tabero-futsu2.png
「 👆 前に似たプログラムを書いたので参考にしよう」

202307_maui_24-2203--thumbnails.png

ramen-tabero-futsu2.png
「 👆 ファイルのコピーは できたが、
サイズを調整したいぜ。 MAUI ではできないから、 SkiaSharp でやるかな」

ramen-tabero-futsu2.png
「 👇 SkiaSharp で作ったビットマップを保存する方法が分からん」

📖 Using SkiaSharp, how to save a SKBitmap ?

202307_maui_24-2247--resizeImage-o2o0.png

ramen-tabero-futsu2.png
「 👆 画像サイズの変更もでけた」

ファイル名は UUID にするか?

ohkina-hiyoko-futsu2.png
「 インターネット上の すべてのタイルセット画像のファイル名が 被らないようにする対策は してんの?」

ramen-tabero-futsu2.png
「 ガチでやるなら ファイル名は UUID にするか」

202307_maui_24-2255--rename-file.png

"adventure_field" ----> "86A25699-E391-4D61-85A5-356BA8049881"
"map-tileset-format-8x19.png" ----> "E7911DAD-15AC-44F4-A95D-74AB940A19FB"

ramen-tabero-futsu2.png
「 👆 こういう名称変更をするぜ」

kifuwarabe-futsu.png
「 名前って 何だったんだろな?」

ohkina-hiyoko-futsu2.png
「 ローカルで通じればいいのが 名前よ」

202307_maui_24-2321--uuidAndTitle.png

ramen-tabero-futsu2.png
「 👆 UUID と タイトルだけあれば いいのでは?」

202307_maui_24-2326--tileTitle-o2o0.png

ramen-tabero-futsu2.png
「 👆 タイル名も、 タイル タイトル に名前を変えたろ」

202307_maui_25-0005--collectionView.png

ramen-tabero-futsu2.png
「 👆 サムネイル画像を出すところまでは できたぜ」

kifuwarabe-futsu.png
「 やったな!」

ohkina-hiyoko-futsu2.png
「 やったわね!」

📅 (2023-07-25 tue)UUIDを勝手に付けてくれだぜ

kifuwarabe-futsu.png
「 UUID って、どうやって生成するんだぜ?」

ramen-tabero-futsu2.png
「 勝手にファイル名を UUID に置き換えてほしいよな」

ohkina-hiyoko-futsu2.png
「 👇 C# は GUID という名前になってて、UUID とは別物らしいわよ?」

📖 How can I generate UUID in C#

String UUID = Guid.NewGuid().ToString();

ramen-tabero-futsu2.png
「 👆 これで作れるらしい。試してみようぜ」

be6c25e9-2bca-40ba-84b4-b9f24bef6df3

ramen-tabero-futsu2.png
「 👆 小文字かあ。大文字にしてやるかな」

95DE5BEE-A51E-41D1-B068-C6F436603AD4

ramen-tabero-futsu2.png
「 👆 いいんじゃないか?」

kifuwarabe-futsu.png
「 📂 Tilesets フォルダーの下に 📄 {名前}.png 画像を放り込んでおけば、
名前が UUID じゃないとき UUID にしてくれだぜ」

ramen-tabero-futsu2.png
「 そんなことしていいのかな……」

ohkina-hiyoko-futsu2.png
「 対応する TOML ファイルも勝手に作ってくれたら便利じゃない?」

ramen-tabero-futsu2.png
「 画像ファイルを コピー貼り付けしたら、勝手に UUID 振られる 地獄のフォルダーになるぜ?」

ohkina-hiyoko-futsu2.png
「 地獄のフォルダーなのよ」

ramen-tabero-futsu2.png
「 ユーザーの知らない所で 元ファイルを変更すると ユーザーのストレスになるケースもあるから、
タイルセット一覧画面 で 『ファイルを変更しますか?』 か何かのメッセージを出してもいいかもしらん」

202307_maui_25-1933--test-images.png

ramen-tabero-futsu2.png
「 👆 うそ画像を 水増しして Tilesets フォルダーに放り込もう」

ohkina-hiyoko-futsu2.png
「 ひどい……」

202307_maui_25-1950--collection-view.png

ramen-tabero-futsu2.png
「 👆 こんな風に出てくるのか、嬉しくないな」

ohkina-hiyoko-futsu2.png
「 もっと 詰めて表示しなきゃ サムネイル画像を小さくした意味がなくない?」

202307_maui_25-2023--horizontal.png

ramen-tabero-futsu2.png
「 👆 ItemsLayout 属性を HorizontalList にすると 1段になってしまうんだな」

kifuwarabe-futsu.png
「 UUID が横に長い!」

ohkina-hiyoko-futsu2.png
「 ファイル名が画像に被ってない?」

ramen-tabero-futsu2.png
「 UUID は3行に折り曲げたろかな?」

ohkina-hiyoko-futsu2.png
「 UUID なんか表示しなくてよくない?」

ramen-tabero-futsu2.png
「 そういう考えもあるか」

ramen-tabero-futsu2.png
「 👇 Collection View には Flex Layout が無いらしいぜ」

📖 [Enhancement] WrapLayout support in the CollectionView #1808

kifuwarabe-futsu.png
「 じゃあ どうすんだぜ?」

📅 (2023-07-26 wed)妥協しようぜ?

ramen-tabero-futsu2.png
「 MAUI のパターンから外れると つらそうなので 妥協しようぜ?」

ramen-tabero-futsu2.png
「 と思ったが HorizontalGrid, 2 が機能しない。なぜだかは分からない」

202307_maui_26-1943--VerticalGrid10.png

ramen-tabero-futsu2.png
「 👆 VerticalGrid, 10 。 静止画だと できているように見えるが、
ウィンドウを広げても ずっと 10列」

kifuwarabe-futsu.png
「 ウィンドウを広げるという概念は、 MAUI が大好きな Android アプリには無いのでは?」

ohkina-hiyoko-futsu2.png
「 MAUI は デスクトップ・アプリ向けではないのよ」

kifuwarabe-futsu.png
「 じゃあ どうすんだぜ?」

ramen-tabero-futsu2.png
「 妥協しようと思ったが その妥協ラインでもダメだった 手詰まりだぜ」

kifuwarabe-futsu.png
「 他のビューを調べろだぜ」

202307_maui_26-2010--ListView.png

ramen-tabero-futsu2.png
「 👆 リスト・ビューは 縦長で、なんか選べそうな色が付いてるな」

ohkina-hiyoko-futsu2.png
「 画面全体を使って サムネイルを並べる フラットなレイアウトは無いの?」

ramen-tabero-futsu2.png
「 MAUIには無いぜ」

kifuwarabe-futsu.png
「 CollectionView の VerticalGrid というのは 縦長のスマホで何列にするか という意味なのでは?」

ramen-tabero-futsu2.png
「 それでも HorizontalGrid が機能しない理由が分からない」

ohkina-hiyoko-futsu2.png
「 縦でも 横でもなく ウィンドウ・サイズの面積を 最大限に使ってほしいのよ」

ramen-tabero-futsu2.png
「 MAUIは デスクトップ・アプリ向けではないんで」

コレクション・ビューで進めようぜ?

kifuwarabe-futsu.png
「 じゃあ VerticalGrid, 4 で進めようぜ?」

202307_maui_26-2026--CollectionView.png

ramen-tabero-futsu2.png
「 👆 コレクション・ビューは 初期状態では 項目の選択はできないみたいだな」

kifuwarabe-futsu.png
「 👇 これを読めだぜ」

📖 Single selection

202307_maui_26-2037--SingleSelection.png

ramen-tabero-futsu2.png
「 👆 こんなUIが良いとは思わないが これで我慢するかだぜ」

ohkina-hiyoko-futsu2.png
「 画像が切れてるわよ?」

ramen-tabero-futsu2.png
「 どうして こんなに 欠陥だらけなのか……」

kifuwarabe-futsu.png
「 左上のタイルのサイズに 引きずられているのでは?」

ramen-tabero-futsu2.png
「 そんなん困るぜ」

202307_maui_26-2047--SizeRequest.png

ramen-tabero-futsu2.png
「 👆 固定サイズにするしかないか~」

ohkina-hiyoko-futsu2.png
「 ユーザーが ウィンドウサイズを変更するたび、
列数を変えることはできないの?」

202307_maui_26-2128--BindingItemsLayout.png

ramen-tabero-futsu2.png
「 👆 コンテント・ページのサイズは取れるけど、
コレクション・ビューの ItemsLayout プロパティに Binding した文字列が効いてないぜ」

kifuwarabe-futsu.png
「 文字列ではないのでは?」

ramen-tabero-futsu2.png
「 👆 GridItemsLayout クラスを使ってみるが、効かないなあ」

ohkina-hiyoko-futsu2.png
「 👇 これを読みなさい」

📖 CollectionView does not update when changing ItemsLayout #7747
📖 [Windows] Update CollectionView changing ItemsLayout #14532

ramen-tabero-futsu2.png
「 👇 これで できたという報告なんだが、わたしには 理解できないなあ」

📖 [Windows] Update CollectionView changing ItemsLayout #14532
📖 AdaptiveCollectionView.xaml
📖 AdaptiveCollectionView.xaml.cs

kifuwarabe-futsu.png
「 そのサンプルを動かせないのかだぜ?」

ramen-tabero-futsu2.png
「 クラス・ライブラリの出力タイプらしくて、動かないぜ」

202307_maui_26-2308--Rotate.png

ramen-tabero-futsu2.png
「 👆 回転したり 半透明にしたりすることはできるのに、
11列にするとか 8列にするとか、列数を変えることは 頑としてできない」

kifuwarabe-futsu.png
「 要らんことは できるのに……」

ramen-tabero-futsu2.png
「 👇 直ってるらしいんだが、直ってないぜ」

📖 CollectionView with GridItemsLayout: Issues when changing Span #8387
📖 [Windows] Notify changes in CollectionView Layouts #13137

MAUI のバージョンは?

ramen-tabero-futsu2.png
「 MAUI のバージョンって どうやってチェックできる?」

202307_maui_26-2327--mauiVersion.png

ramen-tabero-futsu2.png
「 👆 これは 新しいのかだぜ? 古いのかだぜ?」

ohkina-hiyoko-futsu2.png
「 公式ページに何か書いてないかしら?」

202307_maui_26-2344--bug.png

ramen-tabero-futsu2.png
「 👆 マイクロソフトは 直ったと言い張り、わたしの環境では 直っていないので これは放置して次へ進むことにする」

📅 (2023-07-27 thu)ページを開くときに、ページの縦横幅を知ってることはできるの?

ohkina-hiyoko-futsu2.png
「 ページを開いたときに ページの縦横幅を知ることができるなら、
ページを開いた直後なら コレクション・ビューの列数を 調整することができるんじゃない?」

ramen-tabero-futsu2.png
「 調べるか……。プログラマーの美徳の1つは 怠惰だしな」

kifuwarabe-futsu.png
「 怠惰のくせに しつこく粘るな」

202307_maui_27-1951--viewModel-o2o0.png

ramen-tabero-futsu2.png
「 👆 XAMLの中で ビューモデルを埋め込んでいたが、
このビューモデルの中で ItemsLayout を初期化していて、その値を そのあと一切 上書きできないというのが
今回の不具合だぜ」

kifuwarabe-futsu.png
「 XAMLの中に ビューモデルを埋め込むのを 止めろだぜ」

202307_maui_27-2018--InitializeComponent.png

ramen-tabero-futsu2.png
「 👆 InitializeComponent() の中で ItemsLayout の読込もしてるようなので、
それより前に ItemsLayout をセットしないとな」

202307_maui_27-2027--pageWidth.png

ramen-tabero-futsu2.png
「 👆 ページのコンストラクターでは、ページの横幅を取れないぜ?」

ohkina-hiyoko-futsu2.png
「 MAUI は InitializeComponent( ) の中で どうやって ページの横幅を算出するの?」

[TilesetListPage.xaml.cs TilesetListPage] this.WidthRequest: -1, this.MaximumWidthRequest: ∞, this.MinimumWidthRequest: -1, this.Width: -1

ramen-tabero-futsu2.png
「 👆 横幅は 持ってないみたいだなあ」

kifuwarabe-futsu.png
「 親ウィンドウのサイズは取れないのかだぜ?」

ramen-tabero-futsu2.png
「 this.GetParentWindow() はヌルだぜ」

ohkina-hiyoko-futsu2.png
「 このページに遷移してくる前に 横幅を渡せばいいんじゃない?」

ramen-tabero-futsu2.png
「 画面の遷移は自動化されていて、
遷移前に値を渡す方法は 分からないぜ」

ramen-tabero-futsu2.png
「 そして ページのコンストラクターは 1回呼ばれると
画面遷移して戻ってきても 2回目のコンストラクターは呼び出されないぜ」

kifuwarabe-futsu.png
「 ページは破棄されてないんだ」

ohkina-hiyoko-futsu2.png
「 グローバル変数を使えばいいんじゃない?」

202307_maui_27-2112--navigatingFrom.png

ramen-tabero-futsu2.png
「 👆 NavigatingFrom イベントハンドラで メイン・ページの横幅を取れたぜ」

202307_maui_27-2124--navigatingFrom.png

ramen-tabero-futsu2.png
「 👆 これは挫折。 マイクロソフトの仕様の前に 失望し、意志を曲げ、諦めよう」

タイルセットをクリックして、この前作った タイル切抜き画面へ 遷移してくれだぜ

kifuwarabe-futsu.png
「 じゃあ タイルセットをクリックして、この前作った タイル切抜き画面へ 遷移してくれだぜ」

ramen-tabero-futsu2.png
「 クリックして すぐ画面遷移すると タイルセットのデータを見れないんで、
タイルセットを選んだあと ボタンを押してから画面遷移するようにするぜ」

202307_maui_27-2227--tileset-data.png

ramen-tabero-futsu2.png
「 ファイル名を UUID に変えてもらいたいんだが、
ユーザーに どう説明して
ファイル名を UUID に強制的に変えさすかな?」

kifuwarabe-futsu.png
「 『ファイル名をUUIDに変更する(言うことを聞け)』ボタンを置けだぜ」

UUID かどうかを判定

ramen-tabero-futsu2.png
「 UUIDになってるか、そうでないか 判定する方法が欲しいな」

ohkina-hiyoko-futsu2.png
「 👇 これを読みなさい」

📖 UUIDをヒットさせる正規表現

202307_maui_27-2328--tileset-list.png

ramen-tabero-futsu2.png
「 👆 とりあえず 画面レイアウトは こんな感じだとしようぜ?」

タイルセット・タイトルは ローカライズすんの?

ohkina-hiyoko-futsu2.png
「 タイルセット・タイトルは ローカライズすんの?」

ramen-tabero-futsu2.png
「 1つのタイルセットに 200か国分の添付ファイルが付いてくるのとか 嫌だな……」

kifuwarabe-futsu.png
「 添付の TOML の中にロケールを詰め込んだらどうだぜ?」

ramen-tabero-futsu2.png
「 1つのファイルに 複数のロケールが入っているのは
使わないものが必ず付いてくる という 効率が最悪のケースになるかも知らん。
ロケールのフォルダーを作って そこに .toml ファイルを置いた方がマシか……?」

ohkina-hiyoko-futsu2.png
「 丁寧にいくなら それねえ」

📅 (2023-07-28 fri)タイルセットのロケールの仕組みを作れだぜ

  C:\Users\むずでょ\Documents\Unity Projects
  └── 📂 Negiramen Practice
    └── 📂 Assets
      └── 📂 Doujin Circle Negiramen
        └── 📂 Negiramen Quest
          └── 📂 Auto Generated
            └── 📂 Images
              └── 📂 Tilesets
                ├── 📄 86A25699-E391-4D61-85A5-356BA8049881.png
                └── 📄 86A25699-E391-4D61-85A5-356BA8049881.toml

kifuwarabe-futsu.png
「 👆 今 こうなっているが……」

  C:\Users\むずでょ\Documents\Unity Projects
  └── 📂 Negiramen Practice
    └── 📂 Assets
      └── 📂 Doujin Circle Negiramen
        └── 📂 Negiramen Quest
          └── 📂 Auto Generated
            └── 📂 Images
              └── 📂 Tilesets
                ├── 📂 Locales
                │  ├── 📂 ja-JP
👉               │  │  ├── 📄 86A25699-E391-4D61-85A5-356BA8049881.toml
                │  └── 📂 en-US
👉               │    └── 📄 86A25699-E391-4D61-85A5-356BA8049881.toml
                └── 📄 86A25699-E391-4D61-85A5-356BA8049881.png

kifuwarabe-futsu.png
「 👆 こうなる想定かだぜ?」

ramen-tabero-futsu2.png
「 そうだな」

ohkina-hiyoko-futsu2.png
「 どの言語にも差が無い共通の設定は ja-JP に入れるの?」

ramen-tabero-futsu2.png
「 デフォルトが ja-JP だからな」

ohkina-hiyoko-futsu2.png
「 en-US で編集したら ja-JP に保存されるみたいなことがあるの?」

kifuwarabe-futsu.png
「 編集したのなら、すべての言語ファイルに更新を掛けないと おかしくないか?」

ramen-tabero-futsu2.png
「 英語版にあって 日本語版にないと おかしな感じだしな」

  C:\Users\むずでょ\Documents\Unity Projects
  └── 📂 Negiramen Practice
    └── 📂 Assets
      └── 📂 Doujin Circle Negiramen
        └── 📂 Negiramen Quest
          └── 📂 Auto Generated
            └── 📂 Images
              └── 📂 Tilesets
                ├── 📂 Locales
                │  ├── 📂 ja-JP
                │  │  ├── 📄 86A25699-E391-4D61-85A5-356BA8049881.toml
                │  └── 📂 en-US
                │    └── 📄 86A25699-E391-4D61-85A5-356BA8049881.toml
                ├── 📄 86A25699-E391-4D61-85A5-356BA8049881.png
👉               └── 📄 86A25699-E391-4D61-85A5-356BA8049881.toml

kifuwarabe-futsu.png
「 👆 ベースとしての設定ファイルは、ロケールとは別に 要るのでは?」

ramen-tabero-futsu2.png
「 Author とか どうすんだぜ?
Michael さんは ja-JP では ミカエルさんになるのかだぜ?
ベースの設定ファイルには どっちが入ってる?」

ohkina-hiyoko-futsu2.png
「 最後に見たロケールで上書きしたらどう?」

ramen-tabero-futsu2.png
「 ja-JP から en-US に切り替えてから保存したら、
en-US の設定ファイルが 日本語で上書きされるのかだぜ?」

ohkina-hiyoko-futsu2.png
「 設定されていなければ 上書きしたらいいんじゃない?」

ramen-tabero-futsu2.png
「 要らんデータで 上書きされたくないぜ」

kifuwarabe-futsu.png
「 全ての翻訳可能なプロパティは 個別にロケールを記憶しておけばどうだぜ?」

title = "冒険の荒野"
title_locale = "ja-JP"

author = "むずでょ"
author_locale = "ja-JP"

kifuwarabe-futsu.png
「 👆 こんな感じで」

[title]
value = "冒険の荒野"
locale = "ja-JP"

[author]
value = "むずでょ"
locale = "ja-JP"

ramen-tabero-futsu2.png
「 👆 TOML なら こうするかな」

ohkina-hiyoko-futsu2.png
「 画面を 英語で表示して、日本語入力したい人は どうすんの?」

ramen-tabero-futsu2.png
「 そんなことは するなと 言いたい」

ohkina-hiyoko-futsu2.png
「 素直に 設定されてないロケールで見たら 空欄が楽かなあ?」

kifuwarabe-futsu.png
「 プレースホルダーに出すとかかな」

ベース:

[global]

uuid = "86A25699-E391-4D61-85A5-356BA8049881"
extension = ".png"
publish_date = 2023-06-26T00:00:00+09:00

[user_defined]

ロケールが ja-JP

[local]

title = "冒険の荒野"
author = "むずでょ"

[user_defined]

# 自由に使える欄

ロケールが en-US

[local]

title = "adventure field"
author = "Muzudho"

[user_defined]

# Please feel free to use here.

ramen-tabero-futsu2.png
「 👆 こんな感じで どうだぜ?」

ohkina-hiyoko-futsu2.png
「 試しにやってみないと 分かんないわねぇ」

kifuwarabe-futsu.png
「 UUID ではないファイル名は どこにセットしたらいいんだぜ?」

ramen-tabero-futsu2.png
「 じゃあ fileStem というフィールドも増やすかだぜ」

📅 (2023-07-29 sat)TOMLファイルを読めるようにしようぜ?

ramen-tabero-futsu2.png
「 打ち込むか」

(カタ カタ カタ カタ)

ramen-tabero-futsu2.png
「 あっ、循環参照した。空間が成立してない」

ramen-tabero-futsu2.png
「 サークル名と、作品名は アプリケーションが始まる最初に入力しておかないと、
構成ファイルの場所を取得するために 構成ファイルを見る、という循環参照が起こるぜ」

ohkina-hiyoko-futsu2.png
「 トップ・ページは 構成ファイルを読まなくても 表示できるようにしておかないといけないのよ」

ramen-tabero-futsu2.png
「 構成ファイルの場所 が先に在って、 構成ファイルそれ自体 は後に在るのか」

202307_maui_29-0708--config.png

ramen-tabero-futsu2.png
「 👆 今こんな感じだが、内部的に改修しよう」

ramen-tabero-futsu2.png
「 あれっ?」

ramen-tabero-futsu2.png
「 すると構成画面に入る前に 毎回、サークル名と 作品名を 入力する必要が出てくるぜ?」

kifuwarabe-futsu.png
「 ユーザー名と パスワードみたいだな」

ohkina-hiyoko-futsu2.png
「 じゃあ 構成ファイルは サークル名とパスワードのペアを 覚えておけばいいのよ」

[[entry]]
circle = "Doujin Circle Grayscale"
work = "Negiramen Quest"

[[entry]]
circle = "Apple Banana Cherry"
work = "Dragon Fruits"

[[entry]]
circle = "Shogi Club"
work = "Furi Bisha"

ramen-tabero-futsu2.png
「 👆 こんな感じか」

kifuwarabe-futsu.png
「 現在の configuration.toml ファイルは、 Doujin Circle Grayscale/Negiramen Quest/project.toml みたいな名前に変えるべきでは?」

ramen-tabero-futsu2.png
「 じゃあ まず ログイン画面から作るか」

ログイン画面を作ろうぜ?

202307_maui_29-0729--loginPageIdea.png

ramen-tabero-futsu2.png
「 👆 こんな感じかだぜ?」

ohkina-hiyoko-futsu2.png
「 同じのを何度も入力したくは ないんじゃない?」

202307_maui_29-0735--loginPageIdea2.png

ramen-tabero-futsu2.png
「 👆 リストから選べるように工夫だぜ」

kifuwarabe-futsu.png
「 試しに作ってみてくれだぜ」

ramen-tabero-futsu2.png
「 あっ! だったら Unity の Assets フォルダーの場所も 入力しておいてほしいぜ!」

ohkina-hiyoko-futsu2.png
「 今の構成ページを、ログイン・ページに変えたらいいんじゃない?」

メインページより先にログインページを出すには?

ramen-tabero-futsu2.png
「 メインページより先にログインページを出すには どうやったらいいんだぜ?」

202307_maui_29-0750--AppShellXaml-o2o0.png

kifuwarabe-futsu.png
「 👆 試しに AppShell.xaml を いじったったらどうだぜ?」

202307_maui_29-0753--Startup-o2o0.png

ramen-tabero-futsu2.png
「 👆 Ok! これでいける!」

Workspace フォルダーの名前を変えたい

202307_maui_29-0810--Workspace.png

ramen-tabero-futsu2.png
「 👆 この Workspace フォルダーへのパスを入力させるの、難しいな」

ohkina-hiyoko-futsu2.png
「 インストール時に勝手に設定してくれないの?」

kifuwarabe-futsu.png
「 ユーザーを想定して 開発者がパスの設定をするのは大変だから ユーザーが設定してほしい」

ramen-tabero-futsu2.png
「 このフォルダーの中で作業するのではなく、開始時にデプロイする初期ファイルが入ってるだけだから
フォルダーの名前も Starter Kit とかに変えたいぜ」

ohkina-hiyoko-futsu2.png
「 ログイン後は 2度と使わないんじゃないの? このディレクトリー・パス」

ramen-tabero-futsu2.png
「 Starter Kit という名前にリネームしていくぜ」

(カタ カタ カタ カタ)

ramen-tabero-futsu2.png
「 じゃあ、 user_configuration.toml というファイルは 現状、 configuration.toml で置き場所を設定できるようにしていたが、
大変なので Starter Kit フォルダーの直下に置くように 固定していい?」

kifuwarabe-futsu.png
「 設定できることは少ない方が ユーザー・サポートが楽になるぜ」

configuration.toml を改造したい

202307_maui_29-0949--ConfigurationToml.png

ramen-tabero-futsu2.png
「 👆 今 こんな感じだが、 [profile] テーブルを、 [[entry]] テーブル配列に変えるぜ」

(カタ カタ カタ カタ)

ramen-tabero-futsu2.png
「 あっ、 次回 どの設定で 再開するか 覚えておく必要があるぜ!」

[remember]

# あたなのサークル名
your_circle_name = "Doujin Circle Negiramen"

# あなたの作品名
your_work_name = "Negiramen Quest"

ramen-tabero-futsu2.png
「 👆 こんな感じのデータは やっぱり要るか?」

kifuwarabe-futsu.png
「 変えたり 戻したり だな」

ramen-tabero-futsu2.png
「 エントリーは ドロップ・ダウン・リストでいいかな。 50 件も 100 件もあるようなデータじゃないだろ」

やっぱりログイン画面は作ろうぜ?

202307_maui_29-1108--starterKit.png

ramen-tabero-futsu2.png
「 👆 構成ページではなく、 別途 ログイン・ページが要ると思う。それも2ページ構成で」

ohkina-hiyoko-futsu2.png
「 変更じゃなくて 機能追加だったのね」

ramen-tabero-futsu2.png
「 LoginPage1 にすると LoginPage1ViewModel になるのが カッコ悪いから、
Login1Page にして Login1PageViewModel になるようにする」

202307_maui_29-1255--login1page.png

ramen-tabero-futsu2.png
「 👆 これを整形したり 動きを付けたりしないといけない 大変だ……」

『君たちはどう生きるか?』

ramen-tabero-futsu2.png
「 観てきた~」

kifuwarabe-futsu.png
「 じゃあ 続きをしろだぜ」

ログイン画面の作成の続き

ramen-tabero-futsu2.png
「 つら……」

📅 (2023-07-30 sun)ログイン画面 はよ作れだぜ

kifuwarabe-futsu.png
「 ログイン画面 はよ作れだぜ」

ramen-tabero-futsu2.png
「 画面制作は つらい」

(カタ カタ カタ カタ)

202307_maui_30-1204--login1page.png

ramen-tabero-futsu2.png
「 👆👇 まず レイアウトから。 MAUI はバグ放置があって 思ったように レイアウトできない」

📖 Picker width on Windows not filling container #6391

ohkina-hiyoko-futsu2.png
「 大企業でも 進捗は こんなものなのね」

202307_maui_30-1228--login2page.png

ramen-tabero-futsu2.png
「 👆 2ページ目のレイアウトは こんな感じで」

文字数のカウント

kifuwarabe-futsu.png
「 動きを付けろだぜ」

202307_maui_30-1408--numberOfCharacters.png

ramen-tabero-futsu2.png
「 👆 文字数のカウントは付けたが、すでに登録されているかどうかで
新規作成か 続きからかを分けるところ 作るの めんどくさいな」

エントリー・リストを出す

ohkina-hiyoko-futsu2.png
「 1つ1つ解消していきなさい。まず リストを出してみなさい」

                <Picker Grid.Row="1" Grid.Column="2"
                        VerticalOptions="Center"
                        HorizontalOptions="StartAndExpand"
                        WidthRequest="300"
                        ItemsSource="{Binding EntryList}"
                        SelectedItem="{Binding SelectedEntry}"
                        ItemDisplayBinding="{Binding PresentableTextAsStr}"/>

ramen-tabero-futsu2.png
「 👆 ItemDisplayBinding 属性に リストの要素のメソッド名を入れれば 表示文字列になってくれるのか」

202307_maui_30-1544--entryList.png

ramen-tabero-futsu2.png
「 👆 サークル名と 作品名を 構成ファイルから取ってくるようにしたぜ」

リストから選んで、テキストボックスへ入れる

kifuwarabe-futsu.png
「 それを選んだたら 隣のテキストボックスへ入れろだぜ」

202307_maui_30-1641--choicePicker.png

ramen-tabero-futsu2.png
「 👆 隣のテキストボックスに入るようにしたぜ」

レイアウトを調整

ohkina-hiyoko-futsu2.png
「 文字数がサークル名を、 使える文字が作品名を指しているように 誤解を与えるんじゃない?」

ramen-tabero-futsu2.png
「 レイアウトの設計は 本当に大変」

202307_maui_30-1712--table.png
202307_maui_30-1713--table-en.png

ramen-tabero-futsu2.png
「 👆 翻訳時に 伸縮変わるんで」

続きから始めるボタン

kifuwarabe-futsu.png
「 入力したサークル名と 作品名が 既存のときは 次へボタンではなく、
続きから始めるボタンが出ろだぜ」

202307_maui_30-1827--continue.png

ramen-tabero-futsu2.png
「 👆 続きから ボタンは 出るようにしたぜ」

次へボタン

kifuwarabe-futsu.png
「 次は 次へ ボタンを作れだぜ」

202307_maui_30-1836--nextButton.png

ramen-tabero-futsu2.png
「 👆 作ったぜ」

サークル名、作品名に使える文字

ohkina-hiyoko-futsu2.png
「 サークル名、作品名は フォルダ―名に使うのに、
このままだと 長い名前を入力されるんじゃない?」

ramen-tabero-futsu2.png
「 フォルダー名に使うサークル名 という日本語で2回 名 が出てくるのが煩わしいぜ」

kifuwarabe-futsu.png
「 じゃあ サークル名 じゃなくて サークル・フォルダー だろ」

202307_maui_30-1904--folderName.png

ramen-tabero-futsu2.png
「 👆 フォルダー名を入れろ、という主張を強めたぜ」

ohkina-hiyoko-futsu2.png
「 推奨する使える文字じゃなくて、アスキー・コードで縛った方がいいんじゃないの?」

ramen-tabero-futsu2.png
「 別に うまく使ってくれりゃ いいんだぜ」

kifuwarabe-futsu.png
「 あとで困る使い方を 自由にする人が ほとんどなのに」

ramen-tabero-futsu2.png
「 バリデーション・チェックは無しで」

テキストボックスへ、前回使った値を入れましょう

ohkina-hiyoko-futsu2.png
「 何度も サークル・フォルダ名、作品フォルダ名を入力するのが 手間だから
前回使った値を 最初から入れておくようにしましょう」

202307_maui_30-2013--remember.png

ramen-tabero-futsu2.png
「 👆 構成ファイルから 初期値を読み取るのは作ったぜ。
構成ファイルに保存する方は まだだけど」

新規作成のケースを作ってくれだぜ

kifuwarabe-futsu.png
「 新規作成のケースを作ってくれだぜ」

ramen-tabero-futsu2.png
「 ページの Loaded イベント・ハンドラーって 1回実行されたら ページは破棄されていないのか、
2回来訪しても 呼び出されないんだな」

📅 (2023-07-31 mon)ログイン画面 はよ作れだぜ(2日目)

202307_maui_31-1734--setup-o2o0.png

ramen-tabero-futsu2.png
「 👆 ページを最初に読みこんだときと、ページに再び訪れたタイミングで
ピッカーの中身を入れ替えればいいんだぜ」

ピッカーの項目に削除ボタンを置けないの?

202307_maui_31-1740--picker-o2o0.png

ohkina-hiyoko-futsu2.png
「 項目多くなったら ウザいわよね。
リストの項目に 削除ボタンを付けれないの?」

ramen-tabero-futsu2.png
「 その削除ボタンは、リストから項目を削除するボタンなのか、
それとも プロジェクトを丸ごと消すボタンなのか?」

ohkina-hiyoko-futsu2.png
「 リスト上から消すボタンよ」

kifuwarabe-futsu.png
「 じゃあ 非表示の意味で 眼玉マークの方がいいのでは?」

ramen-tabero-futsu2.png
「 一度 非表示にしたものは、どこから 再表示できるんだぜ?」

ohkina-hiyoko-futsu2.png
「 昔のRPGの皮袋みたいに 要らない道具は 皮袋に詰め込めば
預かりもの屋に テレポーテーションすればいいのよ」

ramen-tabero-futsu2.png
「 その意図を アイコン1つで説明するのは 難しいな……」

ramen-tabero-futsu2.png
「 預かりもの屋も 作らないといけないしな。 いったん保留かな」

ConfigurationEntry を ProjectIdentifier へ名称変更

ramen-tabero-futsu2.png
「 あのピッカーの項目は、構成のエントリーというより、プロジェクトの識別子だよな」

[[project]]

# あなたのサークル・フォルダ名
id.your_circle_folder_name = ""

# あなたの作品フォルダ名
id.your_work_folder_name = ""

# Unity の 📂 `Assets` フォルダ―へのパス
unity_assets_folder = ""

ramen-tabero-futsu2.png
「 👆 意味を強調するなら こうしたいところ」

kifuwarabe-futsu.png
「 構造的にネストしなくても、コメントで十分では?」

[[project]]

# (Id)あなたのサークル・フォルダ名
your_circle_folder_name = ""

# (Id)あなたの作品フォルダ名
your_work_folder_name = ""

# Unity の 📂 `Assets` フォルダ―へのパス
unity_assets_folder = ""

ramen-tabero-futsu2.png
「 👆 じゃあ こう」

ohkina-hiyoko-futsu2.png
「 unity_assets_folder は プロジェクトの構成ファイルが 持つべきで、
ネギラーメンの構成ファイルが持っては いけないのでは?」

ramen-tabero-futsu2.png
「 それもそう。じゃあ プロジェクト構成ファイルを作るか~」

remember を current に変えたい

ramen-tabero-futsu2.png
「 変数の整合性を きつくしたいので、
テキスト・ボックスに入れた値が 現在の設定だ、という風にするぜ」

📅 (2023-08-01 tue)まだログイン画面 できてないのかだぜ?(3日目)

kifuwarabe-futsu.png
「 まだログイン画面 できてないのかだぜ?」

ramen-tabero-futsu2.png
「 もう つらい」

202308_maui_01-1839--projectIdList.png

ramen-tabero-futsu2.png
「 👆 このリストは 構成ファイルに記憶するのではなく、
ディレクトリ階層を 探索するだけで良かったのでは?」

kifuwarabe-futsu.png
「 ディレクトリを探索できない権限のケースもあるから、
構成ファイルに記録するプログラムは 有るっちゃ有るぜ」

ohkina-hiyoko-futsu2.png
「 画面作りの何に時間がかかんの?」

ramen-tabero-futsu2.png
「 作ってみたあとに気づく設計が成立してない矛盾と、
押されたくないボタンが押せてしまう状態の管理漏れ、
そしてバリデーション・チェックが通らなかったときの表示だぜ」

kifuwarabe-futsu.png
「 ほっとくと 都合の悪い入力を通してしまうしな」

202308_maui_01-2026--login1page.png

202308_maui_01-2027--login2page.png

ramen-tabero-futsu2.png
「 👆 とりあえず こんなもんで勘弁しろだぜ。
入力チェックは パス」

ohkina-hiyoko-futsu2.png
「 入力欄は 縦に並んでいる方が ふつうじゃない?」

ramen-tabero-futsu2.png
「 もっともだぜ」

202308_maui_01-2104--login1page.png

ramen-tabero-futsu2.png
「 👆 これでどうだぜ?」

ohkina-hiyoko-futsu2.png
「 良くなったわね」

kifuwarabe-futsu.png
「 しかし、 あなたのサークル・フォルダ名って何だろな? と、ユーザーは思わないかだぜ?」

ramen-tabero-futsu2.png
「 思うぜ」

202308_maui_01-2116--login1page.png

ramen-tabero-futsu2.png
「 👆 あなたのサークル・フォルダ名のテキストボックスの右端に ×ボタンが付いているんだが、
わたしが付けたわけじゃないし、取り除く方法も分からないぜ」

kifuwarabe-futsu.png
「 仕方ない。ほっといて 次へ進めだぜ」

ログインページから始まるように、 MainPage をログインページにしようぜ?

kifuwarabe-futsu.png
「 ログインページから始まるように、 MainPage をログインページにしようぜ?」

ramen-tabero-futsu2.png
「 なんで 最初のページの名前が MainPage なんだぜ やめてくれだぜ」

ramen-tabero-futsu2.png
「 まあ プログラムは昔から main から始まるけど」

(カタ カタ カタ カタ)

ramen-tabero-futsu2.png
「 差替えたぜ。これで ひとまず ログイン・ページは終わりだぜ」

📅 (2023-08-02 wed)初回ログイン時にスターターキットをユニティのAssetsフォルダーへコピーするようにしよう

ramen-tabero-futsu2.png
「 まだ終わってなかった」

ramen-tabero-futsu2.png
「 サークル・フォルダ名、作品フォルダ名を作ったあとは、初回ログイン時に
スターターキットをユニティのAssetsフォルダーへコピーするようにしよう」

(カタ カタ カタ カタ)

ramen-tabero-futsu2.png
「 とりあえず 実装した。不具合があるかどうかは知らん」

タイルセット一覧画面にインポート・ボタンを付けようぜ?

kifuwarabe-futsu.png
「 タイルセット一覧画面にインポート・ボタンを付けようぜ??」

ramen-tabero-futsu2.png
「 ドラッグ&ドロップの方がいいかも知れないが、
とりあえず インポートボタンは要るかだぜ」

202308_maui_02-2007--importBtn-o2o0.png

ramen-tabero-futsu2.png
「 👆 インポート・ボタンは こんなんでいいかだぜ?」

kifuwarabe-futsu.png
「 こんなでかいボタン、噴飯ものだが MAUI だから仕方ない。良いんじゃないか?」

ramen-tabero-futsu2.png
「 👇 ファイル・ピッカーの説明が 何言ってるか分からないな」

📖 Microsoft > ファイル ピッカー

ramen-tabero-futsu2.png
「 👇 サンプル・プログラムに ファイル・ピッカーがないか 調べてみるか」

📖 jfversluis > MauiFilePickerSample

📅 (2023-08-03 thu)疲れたので寝た

Zzz

📅 (2023-08-04 fri)インポート画面の練習をしよう

202308_maui_04-1917--filePickerSample.png

ramen-tabero-futsu2.png
「 👆 前述のサンプルは 動くぜ」

202308_maui_04-1920--filePickerCode-o2o0.png

ramen-tabero-futsu2.png
「 👆 コードはこれを真似すれば 良さそうだぜ」

ramen-tabero-futsu2.png
「 ファイル・ピッカーは コントロールではなく、ただの関数なんだな」

ドラッグ&ドロップ

ramen-tabero-futsu2.png
「 ファイル・ピッカーに取り掛かる前に コントロールの色々なことが分からないので 本番に組み込む前に 練習したいぜ」

kifuwarabe-futsu.png
「 👇 リポジトリ―を作っておいたぜ」

📖 Muzudho > MAUI-Control-Practice

ramen-tabero-futsu2.png
「 👇 画像ファイルを ネギラーメンに ドラッグ アンド ドロップ できるかな?」

📖 Microsoft > ドラッグ アンド ドロップ ジェスチャを認識する

ramen-tabero-futsu2.png
「 👇 Square クラスなんか どこにあるのか?」

📖 Microsoft > Microsoft.Maui.Controls.Shapes Namespace

kifuwarabe-futsu.png
「 Rectangle で十分じゃないか?」

ramen-tabero-futsu2.png
「 MAUI の Rectangle は、 XAML の Rectangle 要素なんだぜ」

202308_maui_04-1955--DragAndDrop.png

ramen-tabero-futsu2.png
「 👆 矩形を ドラッグ&ドロップ しようとしたら こんな見た目になるのか」

202308_maui_04-2010--Drag.png

ramen-tabero-futsu2.png
「 👆 ドラッグ・イベントの仕事は、 禁止マークとか コピー・マークとか 表示するところにありそうだぜ」

202308_maui_04-2015--Xaml-o2o0.png

ramen-tabero-futsu2.png
「 👆 XAML は こう書いて」

202308_maui_04-2017--CodeBehind-o2o0.png

ramen-tabero-futsu2.png
「 👆 コード・ビハインドは こう書けば良さそうだぜ」

ohkina-hiyoko-futsu2.png
「 Windowsのファイル・エクスプローラー上の画像ファイルを MAUIへドラッグ&ドロップできるの?」

202308_maui_04-2024--DragImageFile.png

ramen-tabero-futsu2.png
「 👆 できそうな見た目をしているが、ドロップすると 強制終了するぜ」

202308_maui_04-2027--error.png

ramen-tabero-futsu2.png
「 👆 エラーの理由は ヌルにできないパラメーターに ヌルを入れたかららしいが、
分けわからん」

ramen-tabero-futsu2.png
「 👇 MAUI にデスクトップ・アプリケーションの機能が無いのは 鉄板の話題らしい」

📖 Does MAUI support file drag and drop to other application (Windows, Linux, macOS)? #7508

kifuwarabe-futsu.png
「 じゃあ MAUI は WPF より先に廃止するかもしれないな」

ohkina-hiyoko-futsu2.png
「 ファイル・ピッカーで しのぎましょう」

アラート

202308_maui_04-2157--choice-file.png

ramen-tabero-futsu2.png
「 👆 うーん、ファイルのフル・パスは取れるのか。
この ダイアログボックスみたいなの 現代では アラートと呼ぶらしいが、
キャンセル・ボタンも出せるだろうか?」

ramen-tabero-futsu2.png
「 👇 ポップアップはなぜ XAML じゃないのか……」

📖 ポップアップの表示

ramen-tabero-futsu2.png
「 👆 いろいろ あるっちゃ あるのか」

202308_maui_04-2306--alert.png

ramen-tabero-futsu2.png
「 👆 とりあえず こんなんでいいか……」

ファイルのコピー

202308_maui_04-2316--copyFile-o2o0.png

ramen-tabero-futsu2.png
「 👆 ひとまず 上図のような ファイル・コピーをやってみるかだぜ」

                    System.IO.File.Copy(
                        sourceFileName: result.FullPath,
                        destFileName: tilesetPngLocation.Path.AsStr);

ramen-tabero-futsu2.png
「 👆 ファイルのコピーだけなら これでいけるはず」

kifuwarabe-futsu.png
「 Windows の API 使ってるの、いいのか知らんけど」

202308_maui_04-2326--copyFile-o2o0.png

ramen-tabero-futsu2.png
「 👆 ファイルのコピーはでけたけど、コレクション・ビューにも追加しないと 画面に出てこないな」

kifuwarabe-futsu.png
「 コレクション・ビューに入れるのではなく、
アイテム・ソースに入れるんじゃないか?」

ramen-tabero-futsu2.png
「 そうか」

202308_maui_05-0051--import-o2o0.png

ramen-tabero-futsu2.png
「 👆 インポートで 画像を放り込んだった」

ファイルの削除

ohkina-hiyoko-futsu2.png
「 要らんもの 放り込まれたら 削除したいんだけど」

ramen-tabero-futsu2.png
「 削除ボタンを どこに置くかという レイアウトも困るよな」

202308_maui_05-0110--removeBtn.png

ramen-tabero-futsu2.png
「 👆 左下に赤いボタンを置くというのは どうだぜ?」

ohkina-hiyoko-futsu2.png
「 危ないから間違って押したくないボタンなのに、主張が激しくて むしろ目が そっちに行くんじゃない?」

kifuwarabe-futsu.png
「 頻繁に マウスカーソルが近づくとこに 削除ボタンを置いては いけないのでは?」

202308_maui_05-0127--paleViolotRed.png

ramen-tabero-futsu2.png
「 👆 右上に ペール・バイオレット・レッド のボタンを置くというのは どうだぜ?」

ohkina-hiyoko-futsu2.png
「 ロケールのピッカーの真下なのが気になるけど、ちょっと ずらしたら どう?」

202308_maui_05-0132--deleteBtn.png

ramen-tabero-futsu2.png
「 👆 おかしくないか?」

ohkina-hiyoko-futsu2.png
「 誤クリック防止よ」

ボタンのスタイル

ramen-tabero-futsu2.png
「 あっ、この ペール・バイオレット・レッド のボタン、
不活性にしても グレーにならねーっ!」

kifuwarabe-futsu.png
「 背景色を指定しているからな」

202308_maui_05-0147--buttonStyle-o2o0.png

ramen-tabero-futsu2.png
「 👆 このボタンのスタイル、 削除ボタンだけ 別のを使うようにできないのかだぜ?」

ohkina-hiyoko-futsu2.png
「 x:Name 属性を使って なんとかならないかしらねえ?」

kifuwarabe-futsu.png
「 👇 x:Key というのが あるそうだぜ」

📖 XAML を使用してアプリのスタイルを設定する

ramen-tabero-futsu2.png
「 でけた」

キュー構造だから、任意の場所の要素を削除できねー

ramen-tabero-futsu2.png
「 キュー構造だから、任意の場所の要素を削除できねー」

kifuwarabe-futsu.png
「 前から入れて、後ろから出すしか できないぜ」

ohkina-hiyoko-futsu2.png
「 なんで キューなんかにしたのよ?」

ramen-tabero-futsu2.png
「 コンカレント処理に強ければ なんでもいいと思ったんだぜ」

ramen-tabero-futsu2.png
「 ConcurrentBag にしよかな」

ramen-tabero-futsu2.png
「 👇 ConcurrentBag も要素を削除できないのか」

📖 How to remove a single, specific object from a ConcurrentBag?

kifuwarabe-futsu.png
「 非同期処理をしているときには どんなコレクションが使えるんだぜ?」

202308_maui_05-0302--importAndDelete.png

ramen-tabero-futsu2.png
「 👆 連続読込は ConcurrentBag、 UI は同期のコレクションに変えた。
インポートと タイルセット削除は でけたぜ」

ramen-tabero-futsu2.png
「 疲れたので 今日は ここまで」

📅 (2023-08-05 sat)たいとる1

ohkina-hiyoko-futsu2.png
「 たいとる1 って何なの?」

ramen-tabero-futsu2.png
「 タイルセットのタイトルを入れたいところだぜ」

ohkina-hiyoko-futsu2.png
「 入れなさいよ」

ramen-tabero-futsu2.png
「 PNG画像があって、TOMLファイルが無いといったペアがあるとき、
TOMLファイルを自動生成する機能が要るぜ」

ohkina-hiyoko-futsu2.png
「 その機能を付けなさいよ」

ramen-tabero-futsu2.png
「 タイミングとしては、インポート、タイルセット削除、ファイルのリネームの3か所だな」

(カタ カタ カタ カタ)

202308_maui_05-1428--tilesetGlobalConfig.png

ramen-tabero-futsu2.png
「 👆 万国共通の構成ファイルの方は 自動生成するようにしたが、
画像のタイトルは ロケール別の構成ファイルの方に入れる仕様だぜ」

kifuwarabe-futsu.png
「 ロケール別の構成ファイルも 早よ作れだぜ」

ロケール用のフォルダーを作ろうぜ?

cultureInfo:
    DisplayName: 日本語 (日本),
    EnglishName: Japanese (Japan),
    Name: ja-JP,
    NativeName: 日本語 (日本),
    IetfLanguageTag: ja-JP,
    TwoLetterISOLanguageName: ja,
    ToString(): ja-JP

cultureInfo:
    DisplayName: 英語 (アメリカ合衆国),
    EnglishName: English (United States),
    Name: en-US,
    NativeName: English (United States),
    IetfLanguageTag: en-US,
    TwoLetterISOLanguageName: en,
    ToString(): en-US

cultureInfo:
    DisplayName: 中国語 (簡体字),
    EnglishName: Chinese (Simplified),
    Name: zh-Hans,
    NativeName: 中文(简体),
    IetfLanguageTag: zh-Hans,
    TwoLetterISOLanguageName: zh,
    ToString(): zh-Hans

ramen-tabero-futsu2.png
「 👆 画面のピッカーには NativeName で表示した方がいいのかな……?」

202308_maui_05-1558--NativeName.png

ramen-tabero-futsu2.png
「 👆 NativeName の方が かっこいいな こっちにしよ」

202308_maui_05-1705--TilesetLocalConfig.png

ramen-tabero-futsu2.png
「 👆 ひとまず ロケール用のフォルダーと、空のファイルを作成……」

コレクション・ビューの選択中の色

ramen-tabero-futsu2.png
「 コレクション・ビューの選択中の色、グレーで見にくいな!」

ramen-tabero-futsu2.png
「 スタイル 見たけど さっぱり分からん。後回し。ダークモード消したった」

タイルセット削除ボタンの位置

202308_maui_05-1739--TilesetDeleteBtn.png

ramen-tabero-futsu2.png
「 👆 タイルセット削除ボタンの位置を 左下に戻したった」

プレースホルダ―のロケール設定を分けたいぜ

[global]

uuid = "6FBD83F1-D2A3-45EE-AFC5-411CD6E50144"
extension = ".toml"

[local_placeholder]

title = "適当に作った画像"
author = "むずでょ"

[user_defined]

ramen-tabero-futsu2.png
「 👆 タイルセット・グローバル構成ファイルに local_placeholder という項目が欲しいぜ」

kifuwarabe-futsu.png
「 最初に思っていなかった いろんなものを 盛り込むなあ」

ramen-tabero-futsu2.png
「 英語で設定されていて、日本語で設定されていないとき、
英語の設定を プレースホルダーで表示してくれてもいいじゃないか、というものだぜ」

ohkina-hiyoko-futsu2.png
「 第1言語、第2言語を選べるようにすりゃいいんじゃない?」

ramen-tabero-futsu2.png
「 フーム、大改造は嫌なんで 後回しにするか」

タイルセットのタイトル

202308_maui_05-1859--TilesetTitle.png

ramen-tabero-futsu2.png
「 👆 まず 日本語で対応を進めていこう」

kifuwarabe-futsu.png
「 じゃあ 画面から タイトルを変更できるようにしてくれだぜ」

エントリー(テキストボックス)で1文字入力するたびにビュー・モデルが更新されるのつらい

ramen-tabero-futsu2.png
「 エントリー(テキストボックス)で1文字入力するたびにビュー・モデルが更新されるのつらい」

ohkina-hiyoko-futsu2.png
「 それが MVVM なんじゃない?」

ramen-tabero-futsu2.png
「 👇 このサイトは 細かく書いてるが 知りたい情報はあるかな?」

📖 TextEditBase.Text Property

kifuwarabe-futsu.png
「 👇 Completed というイベントハンドラがあるのでは?」

📖 Microsoft > 入力

ramen-tabero-futsu2.png
「 それを使うように変えていくか~」

ramen-tabero-futsu2.png
「 なんだこれ エンター・キー 押さないと Completed しないじゃないか。
エンター・キー押さなかったら どうする?」

ramen-tabero-futsu2.png
「 エントリーで タブ・キー押したら タブが入るし」

ohkina-hiyoko-futsu2.png
「 MAUI の不具合なんだから、エンター・キーを押せ という運用でやるしかなくない?」

画面を移動するボタンと、それ以外の機能があるボタン

ramen-tabero-futsu2.png
「 画面の移動も、 データの編集も 同じボタンの形状なの 分かりづらいんだが」

kifuwarabe-futsu.png
「 そんなもんだろ」

ramen-tabero-futsu2.png
「 画面遷移も スライドするトランジションが入るやつと、
トランジションが無いやつもあるし」

        //
        await contentPage.Navigation.PushAsync(new ConfigurationPage());

        //
        var shellNavigationState = new ShellNavigationState("//MapExplorerPage");
        await Shell.Current.GoToAsync(shellNavigationState);

ohkina-hiyoko-futsu2.png
「 👆 やり方が2つあるのも 分けわかんないわねえ」

kifuwarabe-futsu.png
「 Navigation を使うやつは、戻るボタンが勝手に付くのでは?」

ramen-tabero-futsu2.png
「 わざわざ ShellNavigationState を使うやり方って メリット無いの?」

日本語と 英語で 別々にタイトルを付けれる機能

ramen-tabero-futsu2.png
「 日本語と 英語で 別々にタイトルを付けれる機能の実装を進めるぜ」

202308__maui__06-0034--localization-downsize2.gif

ramen-tabero-futsu2.png
「 👆 付けた」

アンドゥとリドゥ

ramen-tabero-futsu2.png
「 そろそろ アンドゥと リドゥができないことに 突っ込まれそうだぜ」

kifuwarabe-futsu.png
「 Command Pattern を自力実装するのか、それとも MAUI に何か便利なフレームワークがあるのかだぜ?」

ramen-tabero-futsu2.png
「 👇 他人が作ってくれてるけど、自力実装すりゃ いーんじゃねーの?」

📖 C#でUndo/Redoを実装した

ohkina-hiyoko-futsu2.png
「 MVVMは アンドゥに従ってくれんの?」

ramen-tabero-futsu2.png
「 全ての操作には、逆向きの操作も用意しておく必要があるな」

ohkina-hiyoko-futsu2.png
「 テキストボックスの文字を1つ消したのも戻せるレベルで ヒストリーを作んの?」

ramen-tabero-futsu2.png
「 エントリー(テキストボックス)には アンドゥ・リドゥ機能がもう付いていたぜ」

kifuwarabe-futsu.png
「 じゃあ MAUI に元から付いている アンドゥ・リドゥ機能と、
お父んが作る アンドゥ・リドゥ機能は ぶつからないか?」

ramen-tabero-futsu2.png
「 そこらへん どうすんだろな?」

ramen-tabero-futsu2.png
「 いきなり バイナリで作ると バグ取りが難しいだろうから、
ヒストリーは TOMLファイルで書き出すかな」

kifuwarabe-futsu.png
「 削除したリソースや、 上書きで加工してしまったリソースとか 出てくると思うが
復元する方法は?」

ramen-tabero-futsu2.png
「 ネギラーメンは リソースは編集しないぜ。
リソースを組み立てるだけだぜ」

ohkina-hiyoko-futsu2.png
「 インポートした素材は 削除も 上書きもされないという前提に立っているのね」

ramen-tabero-futsu2.png
「 ネギラーメンから 素材を削除するときは、アンドゥもできません、ということにするんだぜ」

📅 (2023-08-06 sun)アンドゥ・リドゥ機能を作れだぜ

kifuwarabe-futsu.png
「 アンドゥ・リドゥ機能を作れだぜ」

202308_maui_06-1152--Done-o2o0.png

ramen-tabero-futsu2.png
「 👆 コンピューター将棋と同じだぜ。 全ての操作には、進むと 戻るが あるんだぜ」

202308_maui_06-1201--History-o2o0.png

ramen-tabero-futsu2.png
「 👆 履歴管理機能も 便利機能を付けなければ 芯は これだけだぜ」

202308_maui_06-1216--EventHandler-o2o0.png

ramen-tabero-futsu2.png
「 👆 イベントハンドラの内、自動ではなく、ユーザーの操作によって呼び出されるものが
ヒストリーの記録対象になるぜ」

ohkina-hiyoko-futsu2.png
「 じゃあ 試しに ズームを ヒストリカルにしなさいよ」

202308_maui_06-1221--Redo-o2o0.png

ramen-tabero-futsu2.png
「 👆 ヒストリカルにしていないということは、
リドゥの方向のプログラムしか 書かれていないということだぜ」

ohkina-hiyoko-futsu2.png
「 画面の更新しか 書いてなくない? ズームの数字が いくつから いくつへ変更したか書いてないわよ?」

ramen-tabero-futsu2.png
「 コード・ビハインドだからな」

202308_maui_06-1315--Zoom.png

ramen-tabero-futsu2.png
「 👆 ズームして何が起こるかは ビュー・モデルの方に書いてある」

202308_maui_06-1318--ZoomChange-o2o0.png

ramen-tabero-futsu2.png
「 👆 ズームすると、画像を作り直したり、グリッドを作り直したり、
切抜きカーソルを描き直したり、カラーマップを描き直したり、
広範囲に影響があるようだぜ」

kifuwarabe-futsu.png
「 ズームの変更と、ズームの変更によって起こる事象を切り分けてくれだぜ」

202308_maui_06-1415--ZoomProcessing-o2o0.png

ramen-tabero-futsu2.png
「 👆 IDone インターフェースは IProcessing インターフェースに名称変更、
Redo メソッドも Do に名称変更。そして実装」

202308_maui_06-1422--ZoomRecursive-o2o0.png

ramen-tabero-futsu2.png
「 👆 History クラスも Done メソッドを止め、 Do メソッドに変更、中で Processing クラスの Do メソッドを呼び出している」

ramen-tabero-futsu2.png
「 あと、コードの書き方が下手で 無駄に再帰してるから 書き直したい」

ramen-tabero-futsu2.png
「 👇 MAUI には キーボード操作のイベントハンドラが無いじゃないか」

📖 .NET MAUIでのCtrl+Enterなどのキーイベントハンドリングの難しさ

ohkina-hiyoko-futsu2.png
「 スマホに キーボードは付いていませんからね」

kifuwarabe-futsu.png
「 [Ctrl] + [Z] の操作をカスタマイズできないのかだぜ、クソじゃないか」

ramen-tabero-futsu2.png
「 MAUI は 意固地にも 画面上のボタンを押せ、ということかだぜ」

ohkina-hiyoko-futsu2.png
「 それが クロスプラットフォームの真実 なのでしょう」

ramen-tabero-futsu2.png
「 ♪
真理は 避けられず
真実は 踏み込んだ者にしか知られず
真相は 勝手なものである」

kifuwarabe-futsu.png
「 お父んの前で 真実に触れるなだぜ」

アンドゥ・リドゥ ボタンを置こうぜ?

kifuwarabe-futsu.png
「 アンドゥ・リドゥ ボタンを置こうぜ?」

ramen-tabero-futsu2.png
「 Unicode には アンドゥ・リドゥに適した絵文字は無いようだぜ」

ohkina-hiyoko-futsu2.png
「 アンドゥリドゥ と書かれたボタンが 画面上に置いてあるのも 邪魔ねえ」

ramen-tabero-futsu2.png
「 日本語なのに UndoRedo というボタンを画面に配置するのも 負けた気になるしな」

kifuwarabe-futsu.png
「 画像ボタンは作れないのか?」

ramen-tabero-futsu2.png
「 👇 機能はあるみたいなんで、頑張って 絵 を描くか……」

📖 ImageButton

202308_maui_06-1508--Buttons-o2o0.png

ramen-tabero-futsu2.png
「 👆 置くとこないし、右上でどうだぜ?」

kifuwarabe-futsu.png
「 やっつけ わらう」

202308_maui_06-1521--UndoRedo-o2o0.png

ramen-tabero-futsu2.png
「 👆 機能を実装するには、これだけだぜ」

ohkina-hiyoko-futsu2.png
「 バグが起きたわよ」

ramen-tabero-futsu2.png
「 えっ!?」

ohkina-hiyoko-futsu2.png
「 アンドゥ したら、その操作が ドゥ されてるわよ」

ramen-tabero-futsu2.png
「 アンドゥ中は ヒストリーのドゥを通っても そのドゥは 無視する必要があるのか」

(カタ カタ カタ カタ)

ramen-tabero-futsu2.png
「 状態遷移を管理して 修正したぜ」

ohkina-hiyoko-futsu2.png
「 リドゥが 1回しかできないんだけど?」

(カタ カタ カタ カタ)

ramen-tabero-futsu2.png
「 将来リストの中身を全部捨ててるところも 状態管理の内側に入れて直した」

kifuwarabe-futsu.png
「 完了リストが0件のときは アンドゥ・ボタンを押せないようにしてくれだぜ。
将来リストが0件のときは リドゥ・ボタンを押せないようにしてくれだぜ」

ramen-tabero-futsu2.png
(カタ カタ カタ カタ)

ramen-tabero-futsu2.png
「 アンドゥ、リドゥは 完了リスト、将来リスト間の移動が終わってから実行しないと
画面更新時に 反映が後手後手になるのか。直して 実装した」

202308__maui__06-1554--undoRedo.gif

ramen-tabero-futsu2.png
「 👆 ズームだけ アンドゥ・リドゥに対応したぜ」

マップ切抜き画面、前に開いたときの内容が残ってる

kifuwarabe-futsu.png
「 お父ん、バグがあるぜ。
マップ切抜き画面、前に開いたときの内容が残ってる」

ramen-tabero-futsu2.png
「 キャッシュされてるよな。
破棄して 新規作成してほしいんだが」

ramen-tabero-futsu2.png
「 👇 キャッシュを止めてもらう方法がないか 調べるか」

📖 .NET MAUI シェル ページ

ramen-tabero-futsu2.png
「 👇 MAUI が更新されてないという情報が よく見つかるな」

📖 Call Dispose() on Page and ViewModel when the page is popped if they implement IDisposable #7354

ohkina-hiyoko-futsu2.png
「 画面遷移が 進んでいるのか、 戻っているのか フレームワークに情報を与える方法が無いのだから
キャッシュを削除していいのか、 キャッシュを残すべきか、判別できないんじゃないの?」

ramen-tabero-futsu2.png
「 C# で メモリ管理を自力実装することになるとは……」

グラフィック・ビューを、ビュー・モデルから Invalidate する方法が無い

ramen-tabero-futsu2.png
「 グラフィック・ビューを、ビュー・モデルから Invalidate する方法が無いぜ」

202308_maui_06-1647--Invalidate-o2o0.png

ramen-tabero-futsu2.png
「 👆 そら、ビュー・モデルは ビューに指図しないしな」

kifuwarabe-futsu.png
「 横幅を振動させるトリック・コードを書くかだぜ?」

ohkina-hiyoko-futsu2.png
「 そのトリック、偶数回 振動させると 元に戻って使えないという弱点があるのよね」

ramen-tabero-futsu2.png
「 縦に振動すれば 回避できるが……」

202308_maui_06-1704--Dirty-o2o0.png

ramen-tabero-futsu2.png
「 👆 試しに Dirty フラグを付けてみるか。このフラグが立ったら再描画されるといいんだが」

ramen-tabero-futsu2.png
「 あっ、 Drawing の方でフラグを下ろしても、 ビューモデルの方のフラグは下ろされてないから
1度フラグを立てると 立ちっぱなしで プロパティ・チェンジしないぜ」

kifuwarabe-futsu.png
「 Byte 型値にして 永遠に足し続ければどうか?」

ramen-tabero-futsu2.png
(カタ カタ カタ カタ)

202308_maui_06-1741--Drawable-o2o0.png

ramen-tabero-futsu2.png
「 束縛変数に 変更通知をバンバン送っても 再描画は走らないぜ」

kifuwarabe-futsu.png
「 Drawable ではなく、 GraphicsView に変更通知を送る必要があるのでは?」

ohkina-hiyoko-futsu2.png
「 👇 他の人は 苦労してないんじゃないの?」

📖 Binding from view to GraphicsView property in .NET MAUI

ramen-tabero-futsu2.png
「 👆 そのようなコードは動かない。 仕方ないので トリックコードを使う」

kifuwarabe-futsu.png
「 フレームワークに不具合があると、トリックコードが増えていくの わらう」

全部の操作に Do と Undo を用意しろだぜ

kifuwarabe-futsu.png
「 全部の操作に Do と Undo を用意しろだぜ」

ramen-tabero-futsu2.png
「 アンドゥによる削除は 完全削除で、
手動操作による削除は 論理削除なのな。
これは 非対称でいいのかだぜ?」

kifuwarabe-futsu.png
「 論理削除フラグを 下げるだけで 元データが復活するのだから、
削除のアンドゥには 向いてるのに」

ohkina-hiyoko-futsu2.png
「 追加のアンドゥには向いてるの?」

ramen-tabero-futsu2.png
「 追加のアンドゥで 論理削除されたデータを残すとして、
リドゥするのは 論理削除の解除ではなくて 上書きなんで、
追加のリドゥの役には立たないぜ」

論理削除してるのにデータが見えるバグ

202308_maui_06-2319--LogicalDelete.png

ramen-tabero-futsu2.png
「 👆 論理削除してるのにデータが見える」

kifuwarabe-futsu.png
「 直せだぜ」

ramen-tabero-futsu2.png
「 そこに無いとき、選択アイテムを無しで上書きしないといけないんだが、
それをやってない気がするぜ」

ramen-tabero-futsu2.png
「 切抜きカーソル選択タイル は別の概念なのに プロパティを使い回している気がするな。
これを直すのは 大がかりなので、また今度だぜ」

ramen-tabero-futsu2.png
「 上書きボタンをクリックして保存する という操作も止めたい。
テキストボックスに入力したら そのまま保存してほしい」

kifuwarabe-futsu.png
「 アンドゥ・リドゥを考え出すと 設計に変更が生じるな」

📅 (2023-08-07 mon)アンドゥ・リドゥ機能を早よ作れだぜ

kifuwarabe-futsu.png
「 アンドゥ・リドゥ機能を早よ作れだぜ」

ramen-tabero-futsu2.png
「 アンドゥ・リドゥ機能は もう付いていて、
既存のプログラムを すべて それに対応していくという作業なんだぜ」

kifuwarabe-futsu.png
「 それを早よしろだぜ」

ramen-tabero-futsu2.png
「 既存のプログラムの不出来なところを直さないと そこへ進めないぜ」

📅 (2023-08-08 tue)アンドゥ・リドゥ機能を早よ作れだぜ(3日目)

kifuwarabe-futsu.png
「 アンドゥ・リドゥ機能を早よ作れだぜ。3日目だぜ」

ramen-tabero-futsu2.png
「 既存のコードを アンドゥ・リドゥ に対応するために、事前のコードの整理整頓中だぜ」

ohkina-hiyoko-futsu2.png
「 プログラムがヘタクソで すぐに アンドゥ・リドゥ に置き換えられないのねえ」

1つのボタンで 追加/上書き の2つの機能を切り替えて使うの、やめたい

202308_maui_08-1830--OverwriteButton-o2o0.png

ramen-tabero-futsu2.png
「 👆 1つのボタンで 追加/上書き の2つの機能を切り替えて使うの、やめたい」

ohkina-hiyoko-futsu2.png
「 アンドゥするには 追加をアンドゥするのか 上書きをアンドゥするのか はっきりしたいわねえ」
kifuwarabe-futsu.png
「 リドゥは同じ処理なのに、アンドゥは別の処理になるから 分けたいのか」

ramen-tabero-futsu2.png
(カタ カタ カタ カタ)

ohkina-hiyoko-futsu2.png
「 作りながら 方針転換していくのねえ」

TilesetSettings を TilesetDatatable へ名称変更

ramen-tabero-futsu2.png
「 タイルセットに 設定ファイル3つもあって 名前が似ていてややこしいので、
CSV ファイルに対応するクラスは TilesetDatatable に名称変更するぜ」

kifuwarabe-futsu.png
「 調整ばっかりだな」

ramen-tabero-futsu2.png
(カタ カタ カタ カタ)

上書きボタンやっぱ要る

ramen-tabero-futsu2.png
「 あっ、 やっぱ 上書きボタン 要るぜ 戻す」

ramen-tabero-futsu2.png
(カタ カタ カタ カタ)

ohkina-hiyoko-futsu2.png
「 迷走してるわねえ」

ramen-tabero-futsu2.png
「 上書きボタンは 名前を変えて 復元ボタンにするぜ。
論理削除フラグを解除するのに使うんだぜ」

kifuwarabe-futsu.png
「 本当に必要な最小限の機能を 洗い出したか?」

202308_maui_08-2331--Restore.png

ramen-tabero-futsu2.png
「 👆 例えば 復元は こんなケースで使う」

ohkina-hiyoko-futsu2.png
「 マーカーが無い所で タイル・タイトル入力できるの おかしくない?」

ramen-tabero-futsu2.png
「 状況を調べて テキストボックスを不活性にするの わりと大変な作業」

論理削除フラグが False になってる

ramen-tabero-futsu2.png
「 見えないマーカーがあるんだが、論理削除フラグが False になってるぜ」

kifuwarabe-futsu.png
「 IsNone フラグと、 LogicalDelete フラグの2つがあるのが ダメなのでは?
どちらか片方にしたら どうだぜ?」

ramen-tabero-futsu2.png
「 やってみるかだぜ」

(カタ カタ カタ カタ)

ramen-tabero-futsu2.png
「 論理削除済みの跡地を クリックしても 選択できなくなったぜ。
だから 復元ボタンも 活性化しなくなったぜ」

ramen-tabero-futsu2.png
「 論理削除されてない 何もないところなら 選択できるぜ」

ohkina-hiyoko-futsu2.png
「 カーソルが無いということと、カーソルが論理削除されているということは 何が違うの?」

ramen-tabero-futsu2.png
「 論理削除されているカーソルは 有る はずだぜ」

kifuwarabe-futsu.png
「 そこは 分けるのか……」

📅 (2023-08-09 wed)寝てた

Zzz

📅 (2023-08-10 thu)アンドゥ・リドゥ機能を早よ作れだぜ(5日目)

kifuwarabe-futsu.png
「 アンドゥ・リドゥ機能を早よ作れだぜ。5日目だぜ」

ramen-tabero-futsu2.png
「 論理削除フラグのできが悪くてな。見直しだぜ」

202308_maui_10-1841--LogicalDelete-o2o0.png

ramen-tabero-futsu2.png
「 👆 ファイルでは論理削除フラグが立ってるのに、
デバッグ出力では下りてるから、それがなぜなのかを調査するぜ」

202308_maui_10-1856--LogicalDelete-o2o0.png

ramen-tabero-futsu2.png
「 ファイルから読み込んだときは 論理削除フラグは立ってるぜ」

kifuwarabe-futsu.png
「 じゃあ 途中で下ろしたのかだぜ?」

202308_maui_10-1900--LogicalDelete-o2o0.png

ramen-tabero-futsu2.png
「 途中で タイトルも消えて、論理削除フラグも下ろしてるな」

kifuwarabe-futsu.png
「 そんなことは やめろだぜ」

202308_maui_10-1929--LogicalDelete-o2o0.png

ramen-tabero-futsu2.png
「 ログにコードの場所を付けてみた。
タイルを選んだときに タイトルと、論理削除を読み取ってないのかな?]

ramen-tabero-futsu2.png
(カタ カタ カタ カタ)

壊れた

202308_maui_10-2159--Broken.png

ramen-tabero-futsu2.png
「 👆 なんだか分からないが 壊れたぜ」

202308_maui_10-2234--BrokenXName.png

ramen-tabero-futsu2.png
「 👆 x:Name を認識しなくなったぜ」

ramen-tabero-futsu2.png
「 PCを再起動したら直った。何だったんだ……?」

ramen-tabero-futsu2.png
「 なんか エラー出るけど 無視して実行したら 動くな、不気味だな」

8月下旬の予定

ramen-tabero-futsu2.png
「 横幅を 奇数、偶数 振動させてるトリックコードを止めて、
オフセット 0, 1 を切り替える変数を別途用意したい。これは8月下旬にしよう」

ramen-tabero-futsu2.png
「 また 範囲指定するとき Working の方を使っているが、
全部 Source の方を使うように変更したい。
Working は変数にしないようにしたい。これも8月下旬にしよう」

📅 (2023-08-21 mon)ドーナツUI にしようぜ?

ramen-tabero-futsu2.png
「 四方をぐるっと 青い領域で囲みたい」

202308_maui_21-0600--Current.png

ramen-tabero-futsu2.png
「 👆 現状こうなわけだが」

202308_maui_21-0624--Donut.png

ramen-tabero-futsu2.png
「 👆 3重グリッドにするわけだぜ」

kifuwarabe-futsu.png
「 作業領域が狭いなあ」

ohkina-hiyoko-futsu2.png
「 MAUI のテキストボックスが でかすぎんのよ」

ramen-tabero-futsu2.png
「 👇 なんで フォントがこんなに大きいのか分からん」

📖 .NET MAUI のフォント

202308_maui_21-0642--MenuSize.png

ramen-tabero-futsu2.png
「 👆 ルビ振る領域も考えると ドーナツは これだけ広くなる。
4K ディスプレイ推奨だぜ」

kifuwarabe-futsu.png
「 じゃあ それで進めてくれだぜ」

ホーム画面もドーナツUI にしようぜ?

202308_maui_21-0656--Home.png

ramen-tabero-futsu2.png
「 👆 ホーム画面も 四方をぐるっと 青い領域で囲みたいぜ」

202308_maui_21-0705--DonutUI.png

ramen-tabero-futsu2.png
「 👆 ドーナツUI にするとこう」

タイルセット一覧画面もドーナツUI にしようぜ?

202308_maui_21-0708--TilesetList.png

ramen-tabero-futsu2.png
「 👆 タイルセット一覧画面も 四方をぐるっと 青い領域で囲みたいぜ」

202308_maui_21-0724--TilesetListDonutUI.png

ramen-tabero-futsu2.png
「 👆 こうなるぜ」

タイル切抜き画面もドーナツUI にしようぜ?

202308_maui_21-0725--TileCrop.png

ramen-tabero-futsu2.png
「 👆 タイル切抜き画面も 四方をぐるっと 青い領域で囲みたいぜ」

202308_maui_21-0803--Donut.png

ramen-tabero-futsu2.png
「 👆 ひとまず こう。朝はここまで」

📅 (2023-08-22 tue)アンドゥ・リドゥをやってたのよ

ohkina-hiyoko-futsu2.png
「 アンドゥ・リドゥを 形にしないと 次に進まなくない?」

ramen-tabero-futsu2.png
「 その前に タイル切抜き画面の トリック・コードが足引っ張ってるので
それの改修だぜ」

View Model がでかくなりすぎる

ramen-tabero-futsu2.png
「 ビューモデルがでかくなりすぎる。
View Inner Models というフォルダーを作って中身を分けることにするぜ」

ramen-tabero-futsu2.png
「 View History というフォルダーも作る」

📅 (2023-08-23 wed)寝てただけ

Zzz

📅 (2023-08-24 thu)コード掃除

ramen-tabero-futsu2.png
「 コード掃除」

ramen-tabero-futsu2.png
「 ビュー・モデルは 透過メソッドばっかりでも 良い気がしてきたな……」

📅 (2023-08-25 fri)コード掃除

ramen-tabero-futsu2.png
「 コード掃除」

📅 この間 サボり

……。

📅 (2023-09-20 wed)ナビゲーションの作り直し

202309_negiramen_20-0342--Donut.png

ramen-tabero-futsu2.png
「 👆 パンくずリストは大変なので廃止した」

kifuwarabe-futsu.png
「 1か月近くサボっていたな」

ohkina-hiyoko-futsu2.png
「 その間に阪神タイガースが優勝したわよ」

202309_negiramen_20-0345--DeleteDeleteLogical.png

ramen-tabero-futsu2.png
「 👆 また、スクリーンショットからは見えないが、論理削除といった機能を 廃止した。
論理削除はデバッグを助けるが、論理削除自体のメンテナンスが大変だから嫌になった」

kifuwarabe-futsu.png
「 そういえば Unity が料金体系変更で ひと騒動やってるらしいぜ」

ohkina-hiyoko-futsu2.png
「 Godot への乗り換えも考えないと いけなくなるのかしらねえ?」

アンドゥ、リドゥのバグをマシにした

ramen-tabero-futsu2.png
「 論理削除をやめたから、壊れていたアンドゥ、リドゥの動きが、マシになったぜ」

kifuwarabe-futsu.png
「 タイル切抜き画面は、そんなもんでいいだろ」

📅 (2023-09-21 thu)~(2023-09-27 wed)この間サボり

📅(2023-09-27 thu)Godot へ改宗する

ramen-tabero-futsu2.png
「 わたしは Unity からイチ抜けた をし、 Godot へ改宗するぜ」

kifuwarabe-futsu.png
「 そうか」

ohkina-hiyoko-futsu2.png
「 次の記事はもう始まってるわよ」

次の記事へ

📖 Godot って何だぜ(^~^)?

.

ツイッターでシェア
みんなに共有、忘れないようにメモ

むずでょ

光速のアカウント凍結されちゃったんで……。ゲームプログラムを独習中なんだぜ☆電王戦IIに出た棋士もコンピューターもみんな好きだぜ☆▲(パソコン将棋)WCSC29一次予選36位、SDT5予選42位▲(パソコン囲碁)AI竜星戦予選16位

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント