Lua講座_0_0
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
*いんとろだくしょん [#n2cd725f]
**第0章の目的 [#xa707968]
第0章はLuaを使用してモデルを動かすために何をどうすればい...
本章は、「Keyブロックを使った『無制御モデル』は作れるけど...
また、本章ではRigidChipsのモデルファイル(*.rcdまたは*.txt...
以上の内容をまとめます。
-本格的な文法説明は他をあたれ
-簡単なモデルは既に作れる人が対象
-モデルファイルはメモ帳で開こう
**RigidChipsDocument(*.rcd)の書式にみるLuaブロックの位置...
以下に実際のrcdファイルの全文を示します。
長いですが、とりあえずここで見るべきものはさほど多くあり...
#codeprettify{{
//BasicCar
Val
{
Brake(default=0,min=0,max=80)
HBrake(default=0,min=0,max=100)
Handle(default=0,min=-20,max=20)
Engine(default=0,min=-2500,max=2500)
}
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){
}
}
}
}
}
Script
{
print 0,"Welcome to Rigid-Chips World."
print 1," FPS=",_FPS()," Chips=",_CHIPS()," Weight="...
print 2," Width=",_WIDTH()," Height=",_HEIGHT()
print 3," Faces=",_FACE()
print 4," Vel=",_VEL()
print 5," R=",_RED(32,32)
print 6," G=",_GREEN(32,32)
print 7," B=",_BLUE(32,32)
}
Lua
{
function main ()
out( 0,"Welcome to Rigid-Chips World." )
out( 1," FPS=",_FPS()," Chips=",_CHIPS()," Weight=",...
out( 2," Width=",_WIDTH()," Height=",_HEIGHT() )
out( 3," Faces=",_FACE() )
out( 4," Vel=",math.sqrt(_VX()^2+_VY()^2+_VZ()^2) ) --...
out( 5," R=",_RED(32,32) )
out( 6," G=",_GREEN(32,32) )
out( 7," B=",_BLUE(32,32) )
if _KEY(0)>0 then
ENGINE = ENGINE - 500
elseif _KEY(1)>0 then
ENGINE = ENGINE + 500
else
ENGINE = 0
end
if _KEY(2)>0 then
HANDLE = HANDLE - 0.5
elseif _KEY(3)>0 then
HANDLE = HANDLE + 0.5
else
if HANDLE > 0 then
HANDLE = math.max(0,HANDLE-5)
else
HANDLE = math.min(0,HANDLE+5)
end
end
if _KEY(8) then
HBRAKE = HBRAKE + 20
end
if _KEY(7)>0 then
BRAKE = BRAKE + 30
HBRAKE = HBRAKE + 20
else
BRAKE = 0
if not (_KEY(8)>0) then
HBRAKE = 0
end
end
end
}
}}
まず、最初のほうにある Val{ なんとかかんとか } という塊が...
Valブロックの役割はモデルの動作に必要な変数を定義すること...
次に目に付くのがKey{ なんとかかんとか }という塊です。これ...
上述のサンプルコードはデフォルトモデルであるBasicを改造し...
その次に目につくのが、Body{ なんとかかんとか }という塊で...
ここで注意すべき点は、Chipの名前指定の動作です。
#codeprettify{{
Body {
Core(name=CORE) { }
}
}}
このように記述すると、名前をつけたChipの番号を示す変数が...
さらに次には、Script{ なんとかかんとか }という塊が存在し...
Luaブロックと同様にモデルをプログラムによって制御するため...
最後に存在するLua{ なんとかかんとか }という塊が、これから...
以上をまとめるとこんな感じになります。
-Val変数はしっかり定義しよう
-Keyブロックは今やいらない子
-Bodyブロックはモデルエディタにでも任せとけ
-Scriptブロックもいらない子
-Lua{ この中にLuaのコードを書くんだ! }
**Luaってどう書くの? [#i51c2c86]
問い 最速のレースカーに必要なLuaを教えてください!
答え 知らねぇよ
自分の思う通りにモデルを動かすために、どんなLuaプログラム...
しかし、Luaが正常に動作するためには''守らなければならない...
そういうわけで、最初の目標は''エラーの赤文字が出ないよう...
#codeprettify{{
Lua{
function main()
end
}
}}
テキストエディタで、モデルのBodyブロックの次に以上の4行を...
そういうことで、最低限動いていることがわかるように、何か...
#codeprettify{{
Lua{
function main()
out(0,"Hello World !")
end
}
}}
Luaブロックを以上のように書き換えると、画面の左上に Hello...
さて、この''function main() 〜 end''というやつが非常に大...
その正体はRigidChipsによって毎フレーム呼び出される特別な...
以上の内容をまとめるとこんな感じです。
-難しいことを考えるのはエラーの起こらないプログラムを書け...
-御託はいいから、とりあえず、function main() endは必ず書...
**インデントとコメントの薦め [#tde52bf1]
プログラマの格言に''「プログラムは思い通りに動くんじゃない...
簡単なプログラムを書いているうちはいいのですが、段々Luaに...
さて、そんなカオス状態に陥ったコードのサンプルを見てみま...
#codeprettify{{
divide_path = function (str)
local t = {}
local count = 0
for s in string.gfind(str,"(%w+)%.?") do
count = count+1
t[count] = s
end
return t,count
end
assert_path = function (str)
local t,c = divide_path(str)
if c<=0 then return false, nil, nil end
if c==1 then return true, _G, _G[t[1]], t[c] end
local tmp
local parent = _G
for n=1, c-1 do
tmp = parent[ t[n] ]
if object_type(tmp) ~= "namespace" then return false, pa...
end
tmp = parent[ t[c] ]
return true, parent, tmp, t[c]
end
}}
実に読み辛いです。何故読み辛いかというと、コードの記述に...
そこで、''インデント''というものをつけてみます。インデン...
#codeprettify{{
divide_path = function (str)
local t = {}
local count = 0
for s in string.gfind(str,"(%w+)%.?") do
count = count+1
t[count] = s
end
return t,count
end
assert_path = function (str)
local t,c = divide_path(str)
if c<=0 then return false, nil, nil end
if c==1 then return true, _G, _G[t[1]], t[c] end
local tmp
local parent = _G
for n=1, c-1 do
tmp = parent[ t[n] ]
if object_type(tmp) ~= "namespace" then
return false, parent, nil
else
parent = tmp
end
end
tmp = parent[ t[c] ]
return true, parent, tmp, t[c]
end
}}
インデントをつけると、こんな風に左の空白の量で何となく意...
なお、インデントに使う空白文字についてはちょっとした派閥...
さて、インデントによって幾分意味付けは明瞭になりましたが...
#codeprettify{{
--与えられたパス文字列を分割する
divide_path = function (str)
local t = {}
local count = 0
for s in string.gfind(str,"(%w+)%.?") do
count = count+1
t[count] = s
end
return t,count --分割したパス文字列を含むテーブル, 分割数
end
--与えられたパス文字列を検証し、該当する名前空間を返す
assert_path = function (str)
local t,c = divide_path(str)
if c<=0 then return false, nil, nil end --分割数0なら...
if c==1 then return true, _G, _G[t[1]], t[c] end --分割...
--分割数2以上の場合、階層構造を検証する
local tmp
local parent = _G
for n=1, c-1 do
tmp = parent[ t[n] ]
--もし名前空間でないものが含まれていたら失敗
if object_type(tmp) ~= "namespace" then
return false, parent, nil
else
parent = tmp
end
end
tmp = parent[ t[c] ] --該当する名前空間が存在しない場合...
return true, parent, tmp, t[c]
end
}}
正直、あまりわかり易くなった気がしないけど気にしたら負け...
このような、コード中に書き加える説明文を''コメント''とい...
コメントはプログラムとして実行されないことを以下の例で確...
#codeprettify{{
Lua{
function main()
--out(0,"Hello World !")
out(1,"Hello alternative World !")
end
}
}}
実行すると、Hello World ! ではなく、Hello alternative Wor...
余談になりますが、このようにコードの一部をコメントにして...
以上の内容をまとめるとこんな感じです。
-プログラムは書いた通りにしか動かない
-インデントをつけて人間に優しい記述を心がけるべき
-適切なコメントを残しておくと、もっと人間に優しい
-コメントはプログラムとして実行されることはない
終了行:
*いんとろだくしょん [#n2cd725f]
**第0章の目的 [#xa707968]
第0章はLuaを使用してモデルを動かすために何をどうすればい...
本章は、「Keyブロックを使った『無制御モデル』は作れるけど...
また、本章ではRigidChipsのモデルファイル(*.rcdまたは*.txt...
以上の内容をまとめます。
-本格的な文法説明は他をあたれ
-簡単なモデルは既に作れる人が対象
-モデルファイルはメモ帳で開こう
**RigidChipsDocument(*.rcd)の書式にみるLuaブロックの位置...
以下に実際のrcdファイルの全文を示します。
長いですが、とりあえずここで見るべきものはさほど多くあり...
#codeprettify{{
//BasicCar
Val
{
Brake(default=0,min=0,max=80)
HBrake(default=0,min=0,max=100)
Handle(default=0,min=-20,max=20)
Engine(default=0,min=-2500,max=2500)
}
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){
}
}
}
}
}
Script
{
print 0,"Welcome to Rigid-Chips World."
print 1," FPS=",_FPS()," Chips=",_CHIPS()," Weight="...
print 2," Width=",_WIDTH()," Height=",_HEIGHT()
print 3," Faces=",_FACE()
print 4," Vel=",_VEL()
print 5," R=",_RED(32,32)
print 6," G=",_GREEN(32,32)
print 7," B=",_BLUE(32,32)
}
Lua
{
function main ()
out( 0,"Welcome to Rigid-Chips World." )
out( 1," FPS=",_FPS()," Chips=",_CHIPS()," Weight=",...
out( 2," Width=",_WIDTH()," Height=",_HEIGHT() )
out( 3," Faces=",_FACE() )
out( 4," Vel=",math.sqrt(_VX()^2+_VY()^2+_VZ()^2) ) --...
out( 5," R=",_RED(32,32) )
out( 6," G=",_GREEN(32,32) )
out( 7," B=",_BLUE(32,32) )
if _KEY(0)>0 then
ENGINE = ENGINE - 500
elseif _KEY(1)>0 then
ENGINE = ENGINE + 500
else
ENGINE = 0
end
if _KEY(2)>0 then
HANDLE = HANDLE - 0.5
elseif _KEY(3)>0 then
HANDLE = HANDLE + 0.5
else
if HANDLE > 0 then
HANDLE = math.max(0,HANDLE-5)
else
HANDLE = math.min(0,HANDLE+5)
end
end
if _KEY(8) then
HBRAKE = HBRAKE + 20
end
if _KEY(7)>0 then
BRAKE = BRAKE + 30
HBRAKE = HBRAKE + 20
else
BRAKE = 0
if not (_KEY(8)>0) then
HBRAKE = 0
end
end
end
}
}}
まず、最初のほうにある Val{ なんとかかんとか } という塊が...
Valブロックの役割はモデルの動作に必要な変数を定義すること...
次に目に付くのがKey{ なんとかかんとか }という塊です。これ...
上述のサンプルコードはデフォルトモデルであるBasicを改造し...
その次に目につくのが、Body{ なんとかかんとか }という塊で...
ここで注意すべき点は、Chipの名前指定の動作です。
#codeprettify{{
Body {
Core(name=CORE) { }
}
}}
このように記述すると、名前をつけたChipの番号を示す変数が...
さらに次には、Script{ なんとかかんとか }という塊が存在し...
Luaブロックと同様にモデルをプログラムによって制御するため...
最後に存在するLua{ なんとかかんとか }という塊が、これから...
以上をまとめるとこんな感じになります。
-Val変数はしっかり定義しよう
-Keyブロックは今やいらない子
-Bodyブロックはモデルエディタにでも任せとけ
-Scriptブロックもいらない子
-Lua{ この中にLuaのコードを書くんだ! }
**Luaってどう書くの? [#i51c2c86]
問い 最速のレースカーに必要なLuaを教えてください!
答え 知らねぇよ
自分の思う通りにモデルを動かすために、どんなLuaプログラム...
しかし、Luaが正常に動作するためには''守らなければならない...
そういうわけで、最初の目標は''エラーの赤文字が出ないよう...
#codeprettify{{
Lua{
function main()
end
}
}}
テキストエディタで、モデルのBodyブロックの次に以上の4行を...
そういうことで、最低限動いていることがわかるように、何か...
#codeprettify{{
Lua{
function main()
out(0,"Hello World !")
end
}
}}
Luaブロックを以上のように書き換えると、画面の左上に Hello...
さて、この''function main() 〜 end''というやつが非常に大...
その正体はRigidChipsによって毎フレーム呼び出される特別な...
以上の内容をまとめるとこんな感じです。
-難しいことを考えるのはエラーの起こらないプログラムを書け...
-御託はいいから、とりあえず、function main() endは必ず書...
**インデントとコメントの薦め [#tde52bf1]
プログラマの格言に''「プログラムは思い通りに動くんじゃない...
簡単なプログラムを書いているうちはいいのですが、段々Luaに...
さて、そんなカオス状態に陥ったコードのサンプルを見てみま...
#codeprettify{{
divide_path = function (str)
local t = {}
local count = 0
for s in string.gfind(str,"(%w+)%.?") do
count = count+1
t[count] = s
end
return t,count
end
assert_path = function (str)
local t,c = divide_path(str)
if c<=0 then return false, nil, nil end
if c==1 then return true, _G, _G[t[1]], t[c] end
local tmp
local parent = _G
for n=1, c-1 do
tmp = parent[ t[n] ]
if object_type(tmp) ~= "namespace" then return false, pa...
end
tmp = parent[ t[c] ]
return true, parent, tmp, t[c]
end
}}
実に読み辛いです。何故読み辛いかというと、コードの記述に...
そこで、''インデント''というものをつけてみます。インデン...
#codeprettify{{
divide_path = function (str)
local t = {}
local count = 0
for s in string.gfind(str,"(%w+)%.?") do
count = count+1
t[count] = s
end
return t,count
end
assert_path = function (str)
local t,c = divide_path(str)
if c<=0 then return false, nil, nil end
if c==1 then return true, _G, _G[t[1]], t[c] end
local tmp
local parent = _G
for n=1, c-1 do
tmp = parent[ t[n] ]
if object_type(tmp) ~= "namespace" then
return false, parent, nil
else
parent = tmp
end
end
tmp = parent[ t[c] ]
return true, parent, tmp, t[c]
end
}}
インデントをつけると、こんな風に左の空白の量で何となく意...
なお、インデントに使う空白文字についてはちょっとした派閥...
さて、インデントによって幾分意味付けは明瞭になりましたが...
#codeprettify{{
--与えられたパス文字列を分割する
divide_path = function (str)
local t = {}
local count = 0
for s in string.gfind(str,"(%w+)%.?") do
count = count+1
t[count] = s
end
return t,count --分割したパス文字列を含むテーブル, 分割数
end
--与えられたパス文字列を検証し、該当する名前空間を返す
assert_path = function (str)
local t,c = divide_path(str)
if c<=0 then return false, nil, nil end --分割数0なら...
if c==1 then return true, _G, _G[t[1]], t[c] end --分割...
--分割数2以上の場合、階層構造を検証する
local tmp
local parent = _G
for n=1, c-1 do
tmp = parent[ t[n] ]
--もし名前空間でないものが含まれていたら失敗
if object_type(tmp) ~= "namespace" then
return false, parent, nil
else
parent = tmp
end
end
tmp = parent[ t[c] ] --該当する名前空間が存在しない場合...
return true, parent, tmp, t[c]
end
}}
正直、あまりわかり易くなった気がしないけど気にしたら負け...
このような、コード中に書き加える説明文を''コメント''とい...
コメントはプログラムとして実行されないことを以下の例で確...
#codeprettify{{
Lua{
function main()
--out(0,"Hello World !")
out(1,"Hello alternative World !")
end
}
}}
実行すると、Hello World ! ではなく、Hello alternative Wor...
余談になりますが、このようにコードの一部をコメントにして...
以上の内容をまとめるとこんな感じです。
-プログラムは書いた通りにしか動かない
-インデントをつけて人間に優しい記述を心がけるべき
-適切なコメントを残しておくと、もっと人間に優しい
-コメントはプログラムとして実行されることはない
ページ名: