LittleBigPlanet 2の論理回路 (2)

素子と配線の色

 前述の通り、素子と配線の色はロジックの挙動には影響しません。

    // 素子と配線の色。
    // 作業しやすくするためのもので、ロジックの挙動に影響しない。
    struct Color {
        public byte Value; // 0〜60
    }

素子

 LBP2のロジックの各種ゲートなどの基本構造は、次のようなLogicクラスで表すことができます。(ロジックに着目しているので、それ以外に存在が推定される情報は省きます。)
 入力信号はInputs、出力信号はOutputsです。LBP2のロジックがどのような速さで更新されるかわかりませんが、ロジックの1サイクルごとにUpdateメソッドが呼ばれるものとします。

    // 素子
    abstract class Logic {
        public Signal[] Inputs;
        public Signal[] Outputs;
        public Color Color;
        // 出力を更新する。
        public virtual void Update() { }
        public Logic(int numberInputs, int numberOutputs) {
            Inputs = new Signal[numberInputs];
            Outputs = new Signal[numberOutputs];
        }
    }

 以上のように素子の構造を表すことにしました。それでは、簡単な素子から説明してみたいと思います。

NOTゲート

 「NOTゲート」は、「アウトプットを逆転」の前後で述べたように、Signal.InvertIfメソッドが適用されるものとして表されます。作成したばかりの「NOTゲート」(「アウトプットを逆転:はい」)のアイコンは、出力部分に論理否定を表す「◦」がついた「▸」です。

    // NOTゲート。1入力→1出力。
    // Notがtrue(「アウトプットを逆転:はい」)のとき、Aの符号は消える。そうでなければ保存される。
    // NOTゲートは「アウトプットを逆転:いいえ」も設定できる。
    class NotGate : Logic {
        public bool Inverse = true;
        public NotGate() : base(1, 1) { }
        public override void Update() {
            Outputs[0] = Inputs[0];
            Outputs[0].InvertIf(Inverse);
        }
    }

 また、「アウトプットを逆転:いいえ」に変更することで、何もしない(出力は入力と同じ)ゲートにすることもできます。素子のアイコンは、論理否定を表す「◦」がついていない「▸」だけになります。

バッテリー

 「バッテリー」は、定数値のようなものです。通常は、設定した値がそのまま出力されます。「シーケンサー」上に配置した場合には、ヒット(シーケンサーのカーソルが素子の矩形に重なっているときを指すものとします)中にのみ設定した値が出力されます。ヒットしていない間は、Signal.Zeroになります。バッテリーは、特にシーケンサー上で使うことで、有用な回路を構成できます。

 Output設定は、Output設定が出力される条件下での出力Aそのものです。出力Dは、出力Aが0以外のときにtrue(オン)です。

    // バッテリー。0(1)入力→1出力。
    // 入力端子はなく、通常はOutput設定がそのまま出力される。
    // シーケンサー上に配置した場合、ヒット中のみ出力され、ヒットしてないときはSignal.Zeroとなる。
    class Battery : Logic {
        public int Output = 100; // -100 〜 +100 [%]
        public Battery() : base(1, 1) { Inputs[0] = Signal.One; }
        public override void Update() {
            Outputs[0] = Inputs[0].D ? new Signal(Output != 0, Output) : Signal.Zero;
        }
    }

 上記コードは、シーケンサー上にある場合、Inputs[0]にシーケンサーでのヒット状態が入力されるものとします。