ユーザ用ツール

サイト用ツール


ハイハイスクールアドベンチャー_sdl版

差分

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

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
ハイハイスクールアドベンチャー_sdl版 [2025/09/11 21:36] – [ビルドと実行] arakiハイハイスクールアドベンチャー_sdl版 [2025/09/12 01:18] (現在) – [データ欠損] araki
行 101: 行 101:
 ===== 実装についてのあれこれ ===== ===== 実装についてのあれこれ =====
  
 +==== きっかけ ====
  
 +そもそも、SDL2で行こうと思ったのは、Copilot に、「320x240のビットマップの下に、一行のコマンド入力、その下にスクロール可能なログエリアがあるアプリのサンプルを作って」といったら、ほぼほぼ、完成形に近い画面レイアウトのアプリが出来上がりました。
 +
 +もちろん、レイアウトだけで、ゲームができたわけではないのですが、上にも書いたように、キモは、バッファに書いたデータが画像として表示できるか否かなので、ここまでできればほとんど勝ったも同然なのです。
 +
 +あと、めんどくさくなりそうなダイアログも「タブキーを押したら、三つボタンがあるモーダルダイアログを作って。」といってひな型を作ってもらいました。
 +
 +ここまでできれば、あとは、手を動かすだけ。
 +AIがあることで、面倒な部分をかなり軽減してくれるのはありがたいです。
 +
 +==== ビットフィールド型 ====
 +
 +シナリオデータは4バイト一組のビットフィールドでルールが記述されています。
 +なので、ビットフィールド処理は必須なのですが、C#ではビットフィールドは実装出来ないので、しょうがないからシフトと論理積を使ってマスキングすることで逃げてます。
 +
 +まあ、ビットフィールド型にしても、コンパイラが裏で同じようなことをしているだけなので、別にいいですし、クラスで隠蔽してしまえばいい話なので、一度クラスを書いてしまえばどうでもいい話ではあるのですが。
 +
 +<code c#>
 +    public class ZRuleBlock
 +    {
 +        private byte[] rules;
 +        public ZRuleBlock(byte[] r) { rules = r; }
 +        public byte Action { get { return (byte)((rules[0] >> 7) & 1); } }
 +        public byte Op { get { return (byte)((rules[0] >> 4) & 7); } }
 +        public byte Type { get { return (byte)((rules[1] >> 5) & 7); } }
 +        public byte Id { get { return (byte)(rules[1] & 0x1F); } }
 +        public byte Offset { get { return rules[2]; } }
 +        public byte BodyType { get { return (byte)((rules[2] >> 5) & 7); } }
 +        public byte BodyId { get { return (byte)(rules[2] & 0x1F); } }
 +        public byte Value { get { return rules[3]; } }
 +        ...
 +</code>
 +
 +==== 結局 unsafe ====
 +
 +==== データ欠損 ====
 +
 +デバッグプレイ中に、突然例外をはいて落ちた。
 +3階の西廊下を北に進んだら落ちた。
 +
 +なんで?
 +
 +ハイハイスクールアドベンチャーのゲームシステムは、地図情報の中に、その場所で行った動作に対するメッセージが仕込まれている。
 +まあ、多くは、その場所で何かを見たときとかに対するリアクションだ。
 +
 +メッセージは、メッセージ本体と、そのメッセージへのリンク情報からなる。
 +
 +このリンク情報がポイントしているメッセージ本体が存在していないのだ。
 +
 +このデータは、もともとShift JISで作られていたが、Android版を作るときに、扱いにくいからUTF-8に変換したのだ。
 +なので、その際に取りこぼしたのかと、オリジナルのデータファイルをがさがさあさったところ、オリジナルでもそもそも欠落していた。
 +
 +データファイルの作成時の問題か、或いは、そもそもうっかりデータを作り忘れていたのか、その辺はもはや定かではないが、とにかくないものはない。
 +
 +他にそういうところがないか、不安になって、地図データのダンプをするスクリプトを作って走らせたところ、欠落はここ1か所だけだった。
 +
 +JavaやC++はこのあたりの境界越えに比較的寛容でいままでたまたま発覚しなかったが、C#は思ったより厳格だったということ。
ハイハイスクールアドベンチャー_sdl版.1757626577.txt.gz · 最終更新: by araki