*使えないと困るoutの使い方 [#gd74df53]
**はじめに [#ub1502d1]
''out関数''とは、左上に文字を表示するための関数です。関数?ナニソレオイシイノ?という方もいらっしゃるかもしれませんが、この段階では書けば文字が表示できる''おまじない''だという理解で十分です。ということで、早速最も基本的な例を見てみましょう。Luaブロックを丸ごと示します。
Lua{
function main()
out(0,"Hello World !")
end
}
前節でも何度か出てきた例ですね。ちなみに、大抵のプログラミング言語の解説では、最初に画面に文字列を表示する課題が出されるのですが、その文字列にHello World !という表現を使うことが通例となっているようです。
out関数の一般的な使い方は以下の通りです。
out( 行番号, 表示したい文字列 )
行番号は0から24までの数字を利用できます。文字列は、とりあえず引用符( ''"'' )で囲んだものが利用できます。(※この辺は[[さばとたんとあそぼう_2]]でも解説されているので、適宜参照してください)
しかし、Hello World !や[[さばとたんかわいいよさばとたん>さばとたんとあそぼう_2]]といった固定文字列が表示できるだけでは、実用上あまり旨みがないことも事実です。そこで、次にout関数の実用的な使い方について述べます。
**数値を表示する [#b532f4fc]
実は、out関数にはこんな使い方もあります。例によってLuaブロックを丸ごと示します。
Lua{
function main()
out(0,127)
end
}
今度は、画面の左上に 127.00 とかいう数字が表示されるはずです。整数なのに ".00"が付加されるのは、RigidChipsの仕様らしいので、諦めてください。とりあえず、以下で一般的な使い方を示します。
out( 行番号, 表示したい数字 )
さて、この"表示したい数字"には、12とか-255といったような、誰の目から見ても明らかなもののほか、数値型の''変数(variable)''や数値を返す''関数(function)''といったシロモノを使うことができます。例えば、こんな風に記述すると簡易式の速度計を作ることが出来ます。
Lua{
function main()
--_V系が返す値の単位は m/sec なので、* 3600 / 1000 すると、 km/h にできる
out( 0, -_VZ(0)*3.6 )
end
}
これはモデルのZ軸方向、つまり、モデルの前後方向の速度を検出する速度計なので、Basicあたりに積んでみるといいかもしれません。
**もうちょっと表示をわかりやすくする [#bc8c30ea]
さて、前記の記述で一応速度計が完成したのですが、ひとつ大きな問題があります。というのも、数字しか表示してくれないので、それが一体何の値を表示しているのか、表示から判断できないのです。ということで、表示をわかりやすくする方法をいくつか紹介します。
***サンプルモデル [#h5af5e4e]
// BasicCar
Val
{
BRAKE(default=0, max=80, step=80)
ENGINE(default=0, min=-2500, max=2500, step=2500)
HANDLE(default=0, min=-20, max=20, step=5)
HBRAKE(default=0, max=100, step=100)
}
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=20)
8:HBrake(step=20)
}
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) { }
}
}
}
}
Lua
{
function main()
--速度を表示する
out(0,"Velocity = ",-_VZ(0)*3.6," km/h")
--エンジンの出力を表示する
out(1,"Engine = ",ENGINE)
--現在位置を表示する
out(3, string.format(
"position ( x = %f, y = %f, z = %f )",
_X(0),
_Y(0),
_Z(0)
)
)
--現在のハンドルの角度を表示する
out(5, string.format(
"handle = %f; ",
HANDLE
)
)
end
}
***out関数が複数の引数をとれることを利用する [#s2851f6b]
実に今更ですが、out関数にはこんな使い道もあります。
out( 行番号, 表示したいもの1, 表示したいもの2, 表示したいもの3 )
とりあえず、上記では表示したいものを3個連ねましたが、別に何個でもいいので、例えば次のようなこともできます。
out(0,"y","a","r","a","n","a","i","k","a")
実行するとyaranaikaと表示されます。特に表示したいものの間に区切り文字などは挿入されないことに注意してください。
上記サンプルモデルの速度表示とエンジン出力表示はこの手法を使って記述しています。