さばとたんと遊ぼうIndex

5.さばととモデル

so_icon.png

今日の分は打ち込むのが少し長くなっとるから取り敢えず先に一気に示しとくで

 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
 }
sabato_icon_1.png

今日はまたずいぶんと長いの。

so_icon.png

これくらいで驚いてたらあかんで。海におった頃聞いた話やけどマトモな企業の製品やとLuaだけで1000行くらい普通に行くらしいわ。しかもそれにライブラリが加わるとかなんとか。

sabato_icon_2.png

・・・。で、それだけ長く書いていったいなにをしておるのじゃ?

so_icon.png

某もあまり詳しくないんやけど、なんでもこのパソコンみたいにクリックで操作できるとか世界の法則に挑むんだとか。

sabato_icon_11.png

パソコンみたいじゃと?ちうことはたまにアップデートとかしないといけなくなるのかの。

so_icon.png

そこらへんもなんか頑張っとるようやったけどな。それで、入力はできたんか?

sabato_icon_6.png

うむ、練習の成果あって3本指タイピングに進化したのじゃ。この分なら来月には12本くらいになっておろう。

so_icon.png

あの・・・どこに12本も指あるんや?

sabato_icon_5.png

あ、足も使うんじゃ

so_icon.png

神さんのボケはおいておくとして、これ上半分はBasic.txtとほとんど一緒なんはええか?

sabato_icon_1.png

うむ、ただ、Keyブロックの中身が全部消えておるぞ?これでどうやって動くんじゃ?

so_icon.png

それを何とかするがLuaの仕事や。

sabato_icon_8.png

ふむふむ、確かに今までに比べるとずいぶんと長くなっとるの。とりあえず、一番最初のif文でWheelの出力をかえとるのじゃな。

so_icon.png

うむ、良い勘しとるわ。ここでルールを1つ説明しておくな。『VALブロックの変数をLuaから参照・代入するときは全部大文字で書く』。これを忘れるといっこうに動かへん。

sabato_icon_4.png

む、VALブロックの方では『Engine』と書いておるのにLuaでは全部大文字にせんといかんのじゃな?ミョーなルールだがしかたないの。ところで、これでどうして上下キーでパワーが変わるんじゃ?

so_icon.png

とりあえず、条件に使うとる_KEY(0)と_KEY(1)はええか?

sabato_icon_7.png

確か、確かそれぞれ上キーが押されていると1,下キーが押されていると1じゃったな。

so_icon.png

ちうことは、上キーが押されてると1つめの条件を満たすんはOKやな?このif _KEY(ほげほげ) > 0 thenは定型文としてよくでてくるから覚えといた方がええで。ほげほげキーが押されているときって意味や。

sabato_icon_6.png

定型文というと季節の手紙とかファンレターの返事とかに使うあれじゃの。ともかく条件のことはOKじゃ。それで下を押しとると2つめ、どちらも押していないと3つ目じゃな。

so_icon.png

ほんで、これがKeyブロックと同じ働きしとるのはええやろか?

sabato_icon_1.png

上キーを押すと前進して、下キーを押すとバックする。確かに同じことじゃな。確か元の『Basic.txt』は2500までしかパワーが上がらんかったはずじゃがそっちはどうなっとるのかの

so_icon.png

それやっとるのは次のif文やな。こっちはだいぶすっきりしとる。

sabato_icon_8.png

2500より大きかったら2500に、-2500より小さかったら-2500に、するのじゃな。ここ、変えてみてもよいかの?いつもぱわーが足りんと思っておるのじゃが。

so_icon.png

某はかまわへんけど命の保証はできんで?所詮小型車は小型車や(鯖獲島に軽自動車規格はないと思われる)。そんなにトバしたいんやったらそれなりの車買うた方がええで。

sabato_icon_9.png

主がそこまで言うのならばこのままにしておこうかの。だがテストドライブは主に任せるぞ?

so_icon.png

まぁ悪うても動かんだけやろ、大丈夫、大丈夫・・・。次はハンドルやな。

sabato_icon_1.png

取り敢えずハンドルを動かしとるのは『HANDLE = HANDLE + (_KEY(2)-_KEY(3)) * -0.5;』のようじゃが、これはいったいどういう仕組みになっとるのかの?

so_icon.png

取り敢えず『(_KEY(2)-_KEY(3)) * -0.5;』をみていこか。_KEY(2)と_KEY(3)はええよな?

sabato_icon_7.png

OKじゃ。それぞれ左キーが押されていると1,右キーが押されていると1じゃったな。

so_icon.png

その通りやな。だとしたら、これ左右とも押してないときはどないなる?

sabato_icon_1.png

(0-0)*-0.5じゃから結局0じゃな。で、ハンドルが動かんのか。

so_icon.png

そや。で、左だけ押しとったらどないなる?

sabato_icon_4.png

(1-0)*-0.5じゃから-0.5でHANDLE=HANDLE-0.5になるの。それで左にハンドルが切れるわけか。

so_icon.png

右の場合もおなじやな。で、その次のif文が左右とも押しとらんときにハンドル戻す処理や。

sabato_icon_1.png

『if _KEY(2) == 0 and _KEY(3) == 0 then』とな。if _KEY(2) == 0 thenならわかるのじゃが、このandはなんじゃ?

so_icon.png

神さん英語覚えはったんやろ?「かつ」や。前と後ろの条件が両方ともみたされたときだけ全体として条件がみたされたとなるんやな。

sabato_icon_1.png

ということは、じゃ。これは左を押していないかつ右を押していない場合じゃな。で、その後またifが出てきておるがこれはどーなっとるんじゃ?1つ上のifの条件を満たしたときに、また判断しておるのかの?

so_icon.png

そやな。_KEY(2)==1 and _KEY(3)==1 が満たされへんかった場合はそもそも内側のif文はチェックもされん。

sabato_icon_4.png

それじゃったらこう書いてはどうかの?同じじゃなかろうか。

 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
so_icon.png

か、神さんの発想はユニークやな。確かにそれでも取り敢えず動作は同じなるけどな。ただ、これやといくつか、というかかなりまずいことがあるんや。

sabato_icon_3.png

なんじゃ、妾の発案に不満かの?

so_icon.png

とりあえずこの方式やと書くの面倒やろ?同じこと4回繰り返しとるから

sabato_icon_6.png

大丈夫じゃ!妾はコピペを覚えておる。3回コピーしてやればいいことよ

so_icon.png

まぁ手間はそれでもええかもしれんけどそれ以外にもあるんや。神さんやったらこの条件変えたいときどないする?

sabato_icon_5.png

とりあえず一番うえのifのやつを書き換えてからまたコピペじゃな。

so_icon.png

それも面倒やと思うけど、問題はそれだけやないんや。一度で済む処理を何度も書くとLuaが不必要に重くなるやろ?

sabato_icon_7.png

Luaが重くなる・・というとFPSがさがるのかの?それならCPUを換えればいい話じゃろう。

so_icon.png

それゆうたらアカン><。神さんはスク水販売とか企業からの上納金とかあるからええけど。普通の人はそんなに買い換えられんのや。

sabato_icon_3.png

上納金とは聞こえが悪い。奉納金じゃ。

so_icon.png

違いがわからへんけど、とりあえず一度で済むことを何度も書くと重くなって良くないんや。というわけで最初の書き方をおすすめしとくな

sabato_icon_1.png

で、最初のというとこれじゃな

 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
so_icon.png

そや。こうやって何段もif文を重ねることを『ネスト』言うんや。ついでやから覚えとき

sabato_icon_7.png

次のこれはエンジンのところと一緒じゃな。

 if HANDLE > 20 then
 	HANDLE = 20;
 elseif HANDLE < -20 then
 	HANDLE = -20;
 end
so_icon.png

そやな。限界超えんようにしとるだけやな。

sabato_icon_6.png

して、次のこれじゃが。Aキーを押しておると_KEY(7)が1になって、BRAKE = 1 * 30になるが、押しておらんとBRAKE=0*30で0になるという仕組みじゃな。

 BRAKE = _KEY(7) * 30;
so_icon.png

相変わらず神さんの理解はええのお。

sabato_icon_10.png

この調子で次もブレーキ・・っとこれはもしかしてまとめられんかの?

HBRAKE = _KEY(7)*20 + _KEY(8)*20;

HBRAKE = (_KEY(7) + _KEY(8))*20;
sabato_icon_4.png

いらぬ計算を減らすと軽くなるんじゃろう?これは特に問題ないように思えるがどうかの。

so_icon.png

あちゃーこれは某のミスやな。神さんの修正したバージョンの方がええわ。ただし、かけ算は減らしてもそない軽くならん。

sabato_icon_1.png

むぅ、さっきは減らせ減らせとやかましかったではないか。

so_icon.png

どの処理が重いかはそのうち説明する予定やけど、とりあえず四則演算はいくらしてもOKや。その代わり関数呼び出しはめっちゃ重いで。

sabato_icon_11.png

関数呼び出し?

so_icon.png

正確な説明は次回やな。それよりもこれの解読をつづけよか。

sabato_icon_1.png

続けるも何もこれで終わりじゃろう?最後のはHBRAKEが限界を超えないようにしとるだけだしの。

so_icon.png

BRAKEについてはなんでいらんのか分かりはるかな?

sabato_icon_2.png

確かに言われてみればなぜかないの。

so_icon.png

BRAKEはAキー押して30になるのが精一杯やけど、AとS両方押したらHBRAKEはどないなる?

sabato_icon_1.png

なるほど、そういう理由じゃったか。確かに制限しないと40になってしまうの。

so_icon.png

さて、永いことおつかれさんでした。今日の分はこれで終わりや。

sabato_icon_10.png

終わっておらんぞ?主はこれからテストドライブじゃ。

so_icon.png

神さんは丈夫やからええけど某はただの鯖やで?ぶつかったら死んでまうがな

sabato_icon_6.png

そのときは鯖のタタキじゃ。大事に食してやろう。

so_icon.png

アカンこの人には何言うてもむだや。

前:さばとともしかしたら:次:さばとと関数


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2021-05-16 (日) 21:52:13