『RigidChips』のChipsを作成する方法

『RigidChips』のChipsとは

『RigidChips』は、剛体であるChipsの挙動をシミュレートするのが目的です。『RigidChips』は、Chipsとして読み込んだテキストファイルの内容を元に、Chipsを組み立てて機能させます。

Chipsとなるテキストファイルは、Windowsに添付しているアプリケーション『メモ帳』(notepad.exe)にて作成することが出来ます。テキスト(英数字)で構成するため一見難しそうですが、一旦理解してしまえば、テキストならではのコピーや貼り付けを簡単に行うことで、作りたいChipsをすぐに作れることに気付くでしょう。

テキストファイルは、文字コードをASCII、改行コードをCR+LFまたはLFとする必要があります。ただし文字コードは、Shift_JISやEUC-JPで構いません(ASCIIを含むため)。改行コードをCRにすると『RigidChips』が作動を停止しますので注意してください。Windowsの『メモ帳』を使用する場合、文字コードとして「ANSI」を選んで保存してください(実際にはShift_JISで保存されます)。

Chipsは何故動く?

Chipsを作成する前に、Chipsがどういう仕組みで動くのか、大まかながら理解しておきましょう。Chipsの仕組みを理解する上では、変数というものを理解することが重要です。基本的には、変数と各Chipの動きを結び付けておき、キーで変数を操作することで、結果的にChipsを動かす仕組みになっています。

  1. キーボードの「↑」キーを押す。「↑」キーは、キー番号「0」である。
  2. キー番号「0」が入力されている間、変数「Engine」の数値を増やし続ける。
  3. Wheelの動力は変数「Engine」である。従って「Engine」の数値が増えたら、Wheelは動力を得る。
  4. Wheelが路面と摩擦し、Chipsが動き始める。

Chipsの素となるテキストファイルの構成

Chipsのもととなるテキストファイルは、大きく分けて「Val」「Key」「Body」「Script」という4つのブロックから構成されます。各ブロック名の後に中括弧 { } があり、その中にそれぞれの内容を書いていきます。

ちなみに、//と記すと、そこから行末までがコメントとして認識されます。つまり、Chipsとして読み込まれるときには無視されます。作成時のメモや、配布したときの伝達事項などを書き記しておくと良いでしょう。

コメント以外は、全てASCII文字(半角英数字)で記述する必要があります。日本語入力機能(IME)を無効にしてから入力しましょう。

//MyChips
Val {
      //ここで変数を定義する
}
Key {
      //ここでキー入力を定義する
}
Body {
      //ここでChipの構造を定義する
}
Script {
      //ここで自動制御を定義する
}

Val(変数)

Valブロックでは、変数を設定します。ここでは、クルマを作ることを考えてみましょう。クルマには、進むための変数と、止まるための変数、曲がるための変数が必要になると思います。まずは、この3つの変数を設定してみましょう。

それぞれの変数に対して、属性を設定できます。設定できる属性は以下の通りです。

default
標準値です。何も操作しない状態で力をいくら出すのか設定します。普通は0にしておきます。
min
最小出力です。最小あるいは反対の力をいくら出すのか設定します。反対の方向に数値を加える場合は、マイナス(-)をつけましょう。
max
最大出力です。最高の力をいくら出すのか設定します。
step
減衰値です。力を出したあとにどれほどの力で何も操作しない状態に戻るのか設定します。0にすると戻らない設定になります。
disp
非表示設定です。『RigidChips』の画面上に数値を表示するか否かを設定します。記述しないか、値を0以外にすると表示します。値を0にすると表示しません。

まずは、変数の名前を決めます。変数の名前は、半角英数字であれば好きに付けられます。判りやすいように、進む変数を「Engine」、止まる変数を「Brake」、曲がる変数を「Handle」として扱うことにしましょう。変数の名前は、KeyブロックやBodyブロック、Scriptブロックなどで変数を扱うときに必要となります。

変数の名前に続けて、括弧の中に属性を書き記します。それぞれの属性はカンマで区切り、属性の名前にイコールをつけて属性の値を指定します。大文字と小文字は同一視されます。途中に空白やタブがあっても、動作に影響はありません。編集のしやすさを考えて、上手く使い分けましょう。

変数の名前(属性の名前=属性の値, 属性の名前=属性の値, )

以下の記述例では、「Engine」「Brake」「Handle」のほか、ハンドルブレーキの力として「HBrake」も設定しています。また、「Engine」にある「max」属性の値を「3500」としています。爆速を目指してこれを「350000」など巨大な数値にすると、大抵の場合はChipsを暴れ馬と化させるだけです。まずは低い数値を設定しておきましょう。

Val {
   Engine(default=0, min=-3500, max=3500, step=2500)
   Brake (default=0, min=0, max=80, step=80)
   Handle(default=0, min=-30, max=30, step=2)
   HBrake(default=0, min=0, max=100, step=100)
}

Key(キー入力)

Keyブロックでは、押されたキーの番号に従って、どの変数にどれくらい数値を与えるのか設定します。例えばクルマの場合、前進、後退、停止、左ハンドル、右ハンドルといった操作が必要になります。操作に必要なキーと変数を結び付けるのが、Keyブロックの役目です。

キーの番号は『RigidChips』のキーコンフィグによって、パソコンのキーと関連付けられます。キーの番号と実際のキーが初期状態でどう対応しているかは、当サイトのページ「『RigidChips』の操作説明」にある項目「Chipsの操作」を参照してください。

キーの番号は、0番から16番まで設定できますが、操作が複雑にならないよう、10番以上は使わないのが一般的です。

Keyブロックにおいて、それぞれの変数に指定できる属性は「step」だけです。

step
キーを押している間、指定した数値が30ぶんの1秒ごとに変数へ加わっていきます。数値をマイナスにすれば、変数の数値を減らすことができます。数値には整数だけでなく小数点も使えます。

キーの番号に続けて、コロンを記述し、その後に変数の名前、そして括弧の中に属性を記述します。変数の名前と属性ごとにカンマで区切れば、1つのキー入力で複数の力を入力することも出来ます。

キー番号:変数の名前(属性の名前=属性の値)

以下の記述例では、0番で前進、1番で後退、2番で左ハンドル、3番で右ハンドル、7番でブレーキとハンドルブレーキ、8番でハンドルブレーキを掛けるように指定しています。「step」属性の数値を高くすれば、キーを一瞬押しただけで機敏な反応をするChipsを作れます。良い操作感覚を得られるよう、数値を調整しましょう。

Key {
   0:Engine(step=-500)
   1:Engine(step=500)
   2:Handle(step=-0.5)
   3:Handle(step=0.5)
   7:Brake (step=30), HBrake(step=30)
   8:HBrake(step=20)
}

Body(Chipの構造)

Bodyブロックでは、実際にChipsの構造を設定します。Chipsは、赤い点のついたCoreチップから次々にチップを繋いでいくことで構成します。チップには、以下の種類があります。

Chip
標準的なチップです。CoreもChipと同じ性質です。
Frame
風や水の抵抗が殆どありません。
Rudder
angle属性によって、方向を変化させることが出来ます。曲がった際に繋がっているチップと絵的に重なりますが、特に問題ありません。
RudderF
風や水の抵抗が殆ど無いRudderです。
Trim
angle属性によって、繋がっているチップからのひねりを加えられます。
TrimF
風や水の抵抗が殆ど無いTrimです。
Jet
ジェットによる推進力。
Wheel
回転。リム(小さい車輪)が付属する。
RLW
回転。Wheelと異なり、Chipsの反動を受けません。

使用するチップには、それぞれ以下の属性を設定できます。

color
チップの色を変更します。「#」に続けて2桁の16進数(00〜FF)で、光の3原色である赤、緑、青の順に数値で指定します。例えば「#ff0000」と指定すれば赤、「#ffff00」と指定すれば黄になります。色によってChipsの動作に影響が出ることはありません。
angle
チップの接続部分の角度を指定します。チップの種類によって角度の軸が違います。TrimチップやTrimFチップ以外で180に指定すると隣接するチップと重なりますが、特に問題ありません。
spring
衝撃で接続部分に角度が付いた際に、angle属性で指定した値に戻ろうとする力です。0から1までの範囲に設定すると良いでしょう(例えば 0.45 など)。属性を設定しない場合は、1となります。
damper
衝撃に対する接続部分の角度の固さを指定します。0から0.5までの範囲に設定すると良いでしょう(例えば 0.05 など)。属性を設定しない場合は0.5になります。
brake
動力部分に対するブレーキの力です。
power
WheelチップとJetチップ、RLWチップに設定できます。出力(動力)を設定します。
name
チップに名前をつけます。Scriptブロックで役に立ちます。

では、実際にChipsの組み立てを記述してみましょう。Coreチップの赤い点が付いている方向が「N」、その反対側が「S」、左側が「W」、右側が「E」となります。Coreチップ以外は全て、繋げる方向を指定する必要があります。

ちなみにチップの接続角度が何度であっても、チップを接続する方向は、常にチップに一定です。また、1つのチップの同じ方向に何枚ものチップを接続できます。

繋げる方向に続けてコロン(:)、その次にチップの種類、そしてその後の括弧に属性を記します。そのチップに繋がるチップは、中括弧 { } へ入れ子式に記述していきます。

接続方向:チップの種類(属性の名前=属性の値) {  }

以下の記述例では、Wheelチップのbrake属性に数値ではなく変数「Brake」、power属性に変数「Engine」を指定しています。これにより、キー入力などによって入力値が変化する仕組みを実現しています。つまり、キー入力が挙動に反映されるわけです。

また、E方向にあるWheelに設定したpower属性の値を、変数「Engine」にマイナスをつけた「-Engine」としていることにも注意してみましょう。マイナスをつけて回転方向を逆にしないと、Chipsが前進しないためです。

Body {
   Core(){
      N:Chip(){
         N:Rudder(angle=Handle){
            W:Frame(){
               W:Wheel(angle=90, brake=Brake){
               }
            }
            E:Frame(){
               E:Wheel(angle=90, brake=Brake){
               }
            }
         }
      }
      S:Chip(){
         W:Frame(){
            W:Wheel(angle=90, power=Engine, brake=HBrake){
            }
         }
         E:Frame(){
            E:Wheel(angle=90, power=-Engine, brake=HBrake){
            }
         }
      }
   }
}

以上の記述により、以下のChipsが組み立てられます。『RigidChips』に同梱されている「Basic.txt」と同じです。

Script(自動制御)

割愛。