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; } }