[[さばとたんと遊ぼうIndex]]
5.さばととモデル
#clear
#ref(さばとたんと遊ぼうIndex/so_icon.png,around,left)
今日の分は打ち込むのが少し長くなっとるから取り敢えず先に一気に示しとくで
#clear
#codeprettify{{
Val
{
Brake(default=0,min=-999999999)
HBrake(default=0,min=-999999999)
Handle(default=0,min=-999999999)
Engine(default=0,min=-999999999)
}
Key{}
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 OnFrame()
if _KEY(0) > 0 then
ENGINE = ENGINE - 500;
elseif _KEY(1) > 0 then
ENGINE = ENGINE + 500
else
ENGINE = 0;
end
if ENGINE > 2500 then
ENGINE = 2500;
elseif ENGINE < -2500 then
ENGINE = 2500;
end
HANDLE = HANDLE + (_KEY(2)-_KEY(3)) * -0.5;
if _KEY(2) == 0 and _KEY(3) == 0 then
if HANDLE >= 5 then
HANDLE = HANDLE - 5;
elseif 5 > HANDLE and HANDLE > 0 then
HANDLE = 0;
elseif 0 > HANDLE and HANDLE > -5 then
HANDLE = 0;
elseif -5 >= HANDLE then
HANDLE = HANDLE + 5;
end
end
if HANDLE > 20 then
HANDLE = 20;
elseif HANDLE < -20 then
HANDLE = -20;
end
BRAKE = _KEY(7) * 30;
HBRAKE = _KEY(7)*20 + _KEY(8)*20;
if HBRAKE > 20 then
HBRAKE = 20;
end
end
}
}}
#clear
#ref(さばとたんと遊ぼうIndex/sabato_icon_1.png,around,left)
今日はまたずいぶんと長いの。
#clear
#ref(さばとたんと遊ぼうIndex/so_icon.png,around,left)
これくらいで驚いてたらあかんで。海におった頃聞いた話やけどマトモな企業の製品やとLuaだけで1000行くらい普通に行くらしいわ。しかもそれにライブラリが加わるとかなんとか。
#clear
#ref(さばとたんと遊ぼうIndex/sabato_icon_2.png,around,left)
・・・。で、それだけ長く書いていったいなにをしておるのじゃ?
#clear
#ref(さばとたんと遊ぼうIndex/so_icon.png,around,left)
某もあまり詳しくないんやけど、なんでもこのパソコンみたいにクリックで操作できるとか世界の法則に挑むんだとか。
#clear
#ref(さばとたんと遊ぼうIndex/sabato_icon_11.png,around,left)
パソコンみたいじゃと?ちうことはたまにアップデートとかしないといけなくなるのかの。
#clear
#ref(さばとたんと遊ぼうIndex/so_icon.png,around,left)
そこらへんもなんか頑張っとるようやったけどな。それで、入力はできたんか?
#clear
#ref(さばとたんと遊ぼうIndex/sabato_icon_6.png,around,left)
うむ、練習の成果あって3本指タイピングに進化したのじゃ。この分なら来月には12本くらいになっておろう。
#clear
#ref(さばとたんと遊ぼうIndex/so_icon.png,around,left)
あの・・・どこに12本も指あるんや?
#clear
#ref(さばとたんと遊ぼうIndex/sabato_icon_5.png,around,left)
あ、足も使うんじゃ
#clear
#ref(さばとたんと遊ぼうIndex/so_icon.png,around,left)
神さんのボケはおいておくとして、これ上半分はBasic.txtとほとんど一緒なんはええか?
#clear
#ref(さばとたんと遊ぼうIndex/sabato_icon_1.png,around,left)
うむ、ただ、Keyブロックの中身が全部消えておるぞ?これでどうやって動くんじゃ?
#clear
#ref(さばとたんと遊ぼうIndex/so_icon.png,around,left)
それを何とかするがLuaの仕事や。
#clear
#ref(さばとたんと遊ぼうIndex/sabato_icon_8.png,around,left)
ふむふむ、確かに今までに比べるとずいぶんと長くなっとるの。とりあえず、一番最初のif文でWheelの出力をかえとるのじゃな。
#clear
#ref(さばとたんと遊ぼうIndex/so_icon.png,around,left)
うむ、良い勘しとるわ。ここでルールを1つ説明しておくな。『VALブロックの変数をLuaから参照・代入するときは全部大文字で書く』。これを忘れるといっこうに動かへん。
#clear
#ref(さばとたんと遊ぼうIndex/sabato_icon_4.png,around,left)
む、VALブロックの方では『Engine』と書いておるのにLuaでは全部大文字にせんといかんのじゃな?ミョーなルールだがしかたないの。ところで、これでどうして上下キーでパワーが変わるんじゃ?
#clear
#ref(さばとたんと遊ぼうIndex/so_icon.png,around,left)
とりあえず、条件に使うとる_KEY(0)と_KEY(1)はええか?
#clear
#ref(さばとたんと遊ぼうIndex/sabato_icon_7.png,around,left)
確か、確かそれぞれ上キーが押されていると1,下キーが押されていると1じゃったな。
#clear
#ref(さばとたんと遊ぼうIndex/so_icon.png,around,left)
ちうことは、上キーが押されてると1つめの条件を満たすんはOKやな?このif _KEY(ほげほげ) > 0 thenは定型文としてよくでてくるから覚えといた方がええで。ほげほげキーが押されているときって意味や。
#clear
#ref(さばとたんと遊ぼうIndex/sabato_icon_6.png,around,left)
定型文というと季節の手紙とかファンレターの返事とかに使うあれじゃの。ともかく条件のことはOKじゃ。それで下を押しとると2つめ、どちらも押していないと3つ目じゃな。
#clear
#ref(さばとたんと遊ぼうIndex/so_icon.png,around,left)
ほんで、これがKeyブロックと同じ働きしとるのはええやろか?
#clear
#ref(さばとたんと遊ぼうIndex/sabato_icon_1.png,around,left)
上キーを押すと前進して、下キーを押すとバックする。確かに同じことじゃな。確か元の『Basic.txt』は2500までしかパワーが上がらんかったはずじゃがそっちはどうなっとるのかの
#clear
#ref(さばとたんと遊ぼうIndex/so_icon.png,around,left)
それやっとるのは次のif文やな。こっちはだいぶすっきりしとる。
#clear
#ref(さばとたんと遊ぼうIndex/sabato_icon_8.png,around,left)
2500より大きかったら2500に、-2500より小さかったら-2500に、するのじゃな。ここ、変えてみてもよいかの?いつもぱわーが足りんと思っておるのじゃが。
#clear
#ref(さばとたんと遊ぼうIndex/so_icon.png,around,left)
某はかまわへんけど命の保証はできんで?所詮小型車は小型車や(鯖獲島に軽自動車規格はないと思われる)。そんなにトバしたいんやったらそれなりの車買うた方がええで。
#clear
#ref(さばとたんと遊ぼうIndex/sabato_icon_9.png,around,left)
主がそこまで言うのならばこのままにしておこうかの。だがテストドライブは主に任せるぞ?
#clear
#ref(さばとたんと遊ぼうIndex/so_icon.png,around,left)
まぁ悪うても動かんだけやろ、大丈夫、大丈夫・・・。次はハンドルやな。
#clear
#ref(さばとたんと遊ぼうIndex/sabato_icon_1.png,around,left)
取り敢えずハンドルを動かしとるのは『HANDLE = HANDLE + (_KEY(2)-_KEY(3)) * -0.5;』のようじゃが、これはいったいどういう仕組みになっとるのかの?
#clear
#ref(さばとたんと遊ぼうIndex/so_icon.png,around,left)
取り敢えず『(_KEY(2)-_KEY(3)) * -0.5;』をみていこか。_KEY(2)と_KEY(3)はええよな?
#clear
#ref(さばとたんと遊ぼうIndex/sabato_icon_7.png,around,left)
OKじゃ。それぞれ左キーが押されていると1,右キーが押されていると1じゃったな。
#clear
#ref(さばとたんと遊ぼうIndex/so_icon.png,around,left)
その通りやな。だとしたら、これ左右とも押してないときはどないなる?
#clear
#ref(さばとたんと遊ぼうIndex/sabato_icon_1.png,around,left)
(0-0)*-0.5じゃから結局0じゃな。で、ハンドルが動かんのか。
#clear
#ref(さばとたんと遊ぼうIndex/so_icon.png,around,left)
そや。で、左だけ押しとったらどないなる?
#clear
#ref(さばとたんと遊ぼうIndex/sabato_icon_4.png,around,left)
(1-0)*-0.5じゃから-0.5でHANDLE=HANDLE-0.5になるの。それで左にハンドルが切れるわけか。
#clear
#ref(さばとたんと遊ぼうIndex/so_icon.png,around,left)
右の場合もおなじやな。で、その次のif文が左右とも押しとらんときにハンドル戻す処理や。
#clear
#ref(さばとたんと遊ぼうIndex/sabato_icon_1.png,around,left)
『if _KEY(2) == 0 and _KEY(3) == 0 then』とな。if _KEY(2) == 0 thenならわかるのじゃが、このandはなんじゃ?
#clear
#ref(さばとたんと遊ぼうIndex/so_icon.png,around,left)
神さん英語覚えはったんやろ?「かつ」や。前と後ろの条件が両方ともみたされたときだけ全体として条件がみたされたとなるんやな。
#clear
#ref(さばとたんと遊ぼうIndex/sabato_icon_1.png,around,left)
ということは、じゃ。これは左を押していないかつ右を押していない場合じゃな。で、その後またifが出てきておるがこれはどーなっとるんじゃ?1つ上のifの条件を満たしたときに、また判断しておるのかの?
#clear
#ref(さばとたんと遊ぼうIndex/so_icon.png,around,left)
そやな。_KEY(2)==1 and _KEY(3)==1 が満たされへんかった場合はそもそも内側のif文はチェックもされん。
#clear
#ref(さばとたんと遊ぼうIndex/sabato_icon_4.png,around,left)
それじゃったらこう書いてはどうかの?同じじゃなかろうか。
#clear
#codeprettify{{
if _KEY(2)==1 and _KEY(3)==1 and HANDLE >= 5 then
HANDLE = HANDLE - 5;
elseif _KEY(2)==1 and _KEY(3)==1 and 5 > HANDLE and HANDLE > 0 then
HANDLE = 0;
elseif _KEY(2)==1 and _KEY(3)==1 and 0 > HANDLE and HANDLE > -5 then
HANDLE = 0;
elseif _KEY(2)==1 and _KEY(3)==1 and -5 >= HANDLE then
HANDLE = HANDLE + 5;
end
}}
#clear
#ref(さばとたんと遊ぼうIndex/so_icon.png,around,left)
か、神さんの発想はユニークやな。確かにそれでも取り敢えず動作は同じなるけどな。ただ、これやといくつか、というかかなりまずいことがあるんや。
#clear
#ref(さばとたんと遊ぼうIndex/sabato_icon_3.png,around,left)
なんじゃ、妾の発案に不満かの?
#clear
#ref(さばとたんと遊ぼうIndex/so_icon.png,around,left)
とりあえずこの方式やと書くの面倒やろ?同じこと4回繰り返しとるから
#clear
#ref(さばとたんと遊ぼうIndex/sabato_icon_6.png,around,left)
大丈夫じゃ!妾はコピペを覚えておる。3回コピーしてやればいいことよ
#clear
#ref(さばとたんと遊ぼうIndex/so_icon.png,around,left)
まぁ手間はそれでもええかもしれんけどそれ以外にもあるんや。神さんやったらこの条件変えたいときどないする?
#clear
#ref(さばとたんと遊ぼうIndex/sabato_icon_5.png,around,left)
とりあえず一番うえのifのやつを書き換えてからまたコピペじゃな。
#clear
#ref(さばとたんと遊ぼうIndex/so_icon.png,around,left)
それも面倒やと思うけど、問題はそれだけやないんや。一度で済む処理を何度も書くとLuaが不必要に重くなるやろ?
#clear
#ref(さばとたんと遊ぼうIndex/sabato_icon_7.png,around,left)
Luaが重くなる・・というとFPSがさがるのかの?それならCPUを換えればいい話じゃろう。
#clear
#ref(さばとたんと遊ぼうIndex/so_icon.png,around,left)
それゆうたらアカン><。神さんはスク水販売とか企業からの上納金とかあるからええけど。普通の人はそんなに買い換えられんのや。
#clear
#ref(さばとたんと遊ぼうIndex/sabato_icon_3.png,around,left)
上納金とは聞こえが悪い。奉納金じゃ。
#clear
#ref(さばとたんと遊ぼうIndex/so_icon.png,around,left)
違いがわからへんけど、とりあえず一度で済むことを何度も書くと重くなって良くないんや。というわけで最初の書き方をおすすめしとくな
#clear
#ref(さばとたんと遊ぼうIndex/sabato_icon_1.png,around,left)
で、最初のというとこれじゃな
#clear
#codeprettify{{
if _KEY(2) == 0 and _KEY(3) == 0 then
if HANDLE >= 5 then
HANDLE = HANDLE - 5;
elseif 5 > HANDLE and HANDLE > 0 then
HANDLE = 0;
elseif 0 > HANDLE and HANDLE > -5 then
HANDLE = 0;
elseif -5 >= HANDLE then
HANDLE = HANDLE + 5;
end
end
}}
#clear
#ref(さばとたんと遊ぼうIndex/so_icon.png,around,left)
そや。こうやって何段もif文を重ねることを『ネスト』言うんや。ついでやから覚えとき
#clear
#ref(さばとたんと遊ぼうIndex/sabato_icon_7.png,around,left)
次のこれはエンジンのところと一緒じゃな。
#clear
#codeprettify{{
if HANDLE > 20 then
HANDLE = 20;
elseif HANDLE < -20 then
HANDLE = -20;
end
}}
#clear
#ref(さばとたんと遊ぼうIndex/so_icon.png,around,left)
そやな。限界超えんようにしとるだけやな。
#clear
#ref(さばとたんと遊ぼうIndex/sabato_icon_6.png,around,left)
して、次のこれじゃが。Aキーを押しておると_KEY(7)が1になって、BRAKE = 1 * 30になるが、押しておらんとBRAKE=0*30で0になるという仕組みじゃな。
#clear
#codeprettify{{
BRAKE = _KEY(7) * 30;
}}
#clear
#ref(さばとたんと遊ぼうIndex/so_icon.png,around,left)
相変わらず神さんの理解はええのお。
#clear
#ref(さばとたんと遊ぼうIndex/sabato_icon_10.png,around,left)
この調子で次もブレーキ・・っとこれはもしかしてまとめられんかの?
#clear
HBRAKE = _KEY(7)*20 + _KEY(8)*20;
↓
#clear
HBRAKE = (_KEY(7) + _KEY(8))*20;
#clear
#ref(さばとたんと遊ぼうIndex/sabato_icon_4.png,around,left)
いらぬ計算を減らすと軽くなるんじゃろう?これは特に問題ないように思えるがどうかの。
#clear
#ref(さばとたんと遊ぼうIndex/so_icon.png,around,left)
あちゃーこれは某のミスやな。神さんの修正したバージョンの方がええわ。ただし、かけ算は減らしてもそない軽くならん。
#clear
#ref(さばとたんと遊ぼうIndex/sabato_icon_1.png,around,left)
むぅ、さっきは減らせ減らせとやかましかったではないか。
#clear
#ref(さばとたんと遊ぼうIndex/so_icon.png,around,left)
どの処理が重いかはそのうち説明する予定やけど、とりあえず四則演算はいくらしてもOKや。その代わり関数呼び出しはめっちゃ重いで。
#clear
#ref(さばとたんと遊ぼうIndex/sabato_icon_11.png,around,left)
関数呼び出し?
#clear
#ref(さばとたんと遊ぼうIndex/so_icon.png,around,left)
正確な説明は次回やな。それよりもこれの解読をつづけよか。
#clear
#ref(さばとたんと遊ぼうIndex/sabato_icon_1.png,around,left)
続けるも何もこれで終わりじゃろう?最後のはHBRAKEが限界を超えないようにしとるだけだしの。
#clear
#ref(さばとたんと遊ぼうIndex/so_icon.png,around,left)
BRAKEについてはなんでいらんのか分かりはるかな?
#clear
#ref(さばとたんと遊ぼうIndex/sabato_icon_2.png,around,left)
確かに言われてみればなぜかないの。
#clear
#ref(さばとたんと遊ぼうIndex/so_icon.png,around,left)
BRAKEはAキー押して30になるのが精一杯やけど、AとS両方押したらHBRAKEはどないなる?
#clear
#ref(さばとたんと遊ぼうIndex/sabato_icon_1.png,around,left)
なるほど、そういう理由じゃったか。確かに制限しないと40になってしまうの。
#clear
#ref(さばとたんと遊ぼうIndex/so_icon.png,around,left)
さて、永いことおつかれさんでした。今日の分はこれで終わりや。
#clear
#ref(さばとたんと遊ぼうIndex/sabato_icon_10.png,around,left)
終わっておらんぞ?主はこれからテストドライブじゃ。
#clear
#ref(さばとたんと遊ぼうIndex/so_icon.png,around,left)
神さんは丈夫やからええけど某はただの鯖やで?ぶつかったら死んでまうがな
#clear
#ref(さばとたんと遊ぼうIndex/sabato_icon_6.png,around,left)
そのときは鯖のタタキじゃ。大事に食してやろう。
#clear
#ref(さばとたんと遊ぼうIndex/so_icon.png,around,left)
アカンこの人には何言うてもむだや。
#clear
[[前:さばとともしかしたら>さばとたんとあそぼう_4]]:[[次:さばとと関数>さばとたんとあそぼう_6]]