小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Blender游戲的基礎(chǔ)教程

 遙遠的橋zz 2011-06-24

引用:

本譯文中的“命令”與“函數(shù)”的意義相同?!g者注。

讓我們從最簡單的開始:

啟動你的blender,并且分割視圖,把右邊的視圖設(shè)置為python文本編輯器?,F(xiàn)在輸入下面的這些:
代碼:

print "hello"
 


給這個腳本起名為“starter”?,F(xiàn)在選擇默認存在的plane并且給它添加一個always sensor,和一個python controller(以"starter"為腳本),并把它們連接起來。
把鼠標放在3D視圖種,按下 P ,然后按Esc并且查看你的blender控制臺窗口,應該會看到輸出了N多遍的“hello”。剛才這只是標準而經(jīng)典的輸出命令,如果除了輸出無聊的字符串以外還能做點別的那會更有用。
刪除原來那行,輸入這些:
代碼:

print dir(GameLogic)
 


把鼠標放在3D視圖種,按下 P ,然后看看你的blender控制臺窗口。對于那條命令如果你還沒看明白,那么其中 dir 含義是 directory ,而 GameLogic 是包含了游戲引擎里各種命令的對象,dir命令會把其中所包括的命令輸出出來?,F(xiàn)在你會看到 GameLogic 所包含的所有命令,其中比較常用的是“getCurrentController”命令。那么現(xiàn)在把你的代碼改成這樣:
代碼:

print dir(GameLogic.getCurrentController)
 


按下 P 并看看你的控制臺窗口。你不僅可以輸出 GameLogic 的所有命令,也可以輸出它所有的子命令。當你想要得到actuator或sensor的命令列表是這一點就會很有用了。剛才那樣的代碼會把命令列表輸出大約20次以上,因為 ALWAYS sensors 一直在反復運行那段腳本,所以只看最下面的輸出就可以了。(其實對于always sensor,如果你讓其中的兩個按鈕都處于彈起的狀態(tài),那么它所連的腳本就只會執(zhí)行一次。——譯者注)

想要知道 getCurrentController 的含義對嗎?
它可以得到和python controller 相連的任何物體的信息,在這個例子里,和這個 python controller 相連的是默認存在的 plane 。
那么它有什么用呢?
恩……當我們得到 controller 之后,我們可以得到相連的那些 sensor 和 actuator 并且改變它們。我們也可以得到擁有這個 controller 的物體,并且改變這個物體的 propertie、位置、旋轉(zhuǎn)狀況,任何東東。那么讓我們從更多的代碼開始吧,把你的代碼改成這樣:
代碼:

cont = GameLogic.getCurrentController()
own = cont.getOwner()
 


“cont”只不過是變量的名字(你也可以換個名字),不過這第一行可以讓我們以后需要的時候不必都打 “GameLogic.getCurrentController()” 這么長的一段了。另外這行末尾有一對圓括號,這是因為如果沒有這對圓括號的話就會出錯(lol 我一直不知道這到底是為什么,有的命令需要一對空的圓括號才能正常工作,不過別管它,就這樣吧)。(這個……我個人認為這個需要圓括號是因為它是成員函數(shù)而不是成員變量……?!g者注;)不管怎么樣,現(xiàn)在“cont”就是一個包含了那個python controller的所有信息的變量了。
現(xiàn)在,關(guān)于 own ,這個變量里包含的是那個python controller的擁有者(也就是擁有這個controller的物體——譯者注),換句話說,它里面是包含了這個python controller的物體。這兩行是最基本的代碼,并且在大多數(shù)的腳本里都應該在開頭放上這兩行(指任何需要訪問物體或邏輯塊的信息的腳本)。另外,代碼里的空格不會帶來什么問題,你可以有一個空格如“x = 1”或者沒有,如“x=1”。

為了得到點樂趣,在這些代碼下面輸入:
代碼:

print dir(cont)
 


按下 P ,看看控制臺窗口。你會發(fā)現(xiàn)它會向你顯示出一些供你使用的有趣的命令。那么讓我們來試一個。給默認的 plane 添加一個新的 actuator ,設(shè)置為 motion actuator,并且把它和 python controller 連接起來。把這個 actuator 重命名為 “move”?,F(xiàn)在在文本編輯視圖里,在現(xiàn)有的代碼之下輸入這些:
代碼:

move = cont.getActuator("move")
 


這行代碼得到了與 python controller 相連的actuator,并且允許我們訪問它來進行某些操作。這里dir命令可以再次給予我們幫助。接下來輸入:
代碼:

print dir(move)
 


按下 P,看看控制臺窗口,看看有些什么好東東。Now choose your poison and lets move on, for sake of the tute, ill choose to use DLoc.(這句話不知道啥意思……——譯者 -_-!)
去掉那行print代碼,加入這些:
代碼:

speed = move.getDLoc()[1]
 


這行代碼獲得了在actuator里設(shè)置的速度的Y軸分量(目前應該是0.0)。
這個“[1]”是做什么用的?恩……在這個actuator的DLoc部分里有4個值,x、y、z和local(也就是界面里末端的那個小按鈕)(這4個值組成了一個數(shù)組,getDLoc函數(shù)返回的就是這個數(shù)組?!g者注)。Python里的數(shù)組下標從0開始,所以為了獲得其中的Y值(數(shù)組的第二個元素),需要訪問下標為1的元素(又例如: x=[0], y=[1], z=[2], and local=[3])。變量“speed”保存了actuator里DLoc部分的信息數(shù)組,如果 print dir(speed) ,它輸出這樣的數(shù)組 [0.0,0.0,0.0,1],所以在getDLoc之后使用 [1] 會返回其中的第二個元素,應該是0。(這句話似乎有問題……因為按照上面的代碼,speed變量保存的應該是一個數(shù)組元素,我也不明白……——譯者注)不管怎么樣,讓我們繼續(xù)。

我們所要的,是讓我們的plane逐漸地獲得速度,而因為我們的腳本是“always”運行的,所以每次腳本運行時,我們就要增加一點速度。所以“speed”一行的下面輸入:
代碼:

speed = speed + 0.001
 


這行讓speed的值增加0.001。現(xiàn)在我們需要用新的速度值來更新 actuator 。在最后一行下面輸入:
代碼:

move.setDLoc(0.0, speed, 0.0, 1)
 


現(xiàn)在我們的Y值就等于我們的speed值了。最后一件事,我們需要在游戲里激活這個新的值。所以接下來輸入:
代碼:

GameLogic.addActiveActuator(move,1)
 


這一行把 move actuator 加回游戲之中,而參數(shù)1是用來指明是要啟用該actuator,還是關(guān)閉actuator而只是更新其中的值(其實這第二個參數(shù)是bool型的,用來指定第一個參數(shù)所指的actuator是啟用還是關(guān)閉,True為啟用,F(xiàn)alse為關(guān)閉?!g者注),我們這里是要啟用它。現(xiàn)在按下 P ,如果一切正常那么你的plane應該會逐漸地獲得Y軸上的速度。


所以你最終的 motion 腳本應該是這樣的(記住腳本里是區(qū)分大小寫的):
代碼:

cont=GameLogic.getCurrentController()
own = cont.getOwner()
move = cont.getActuator("move")
speed = move.getDLoc()[1]

speed = speed + 0.001
move.setDLoc(0.0, speed, 0.0, 1)
GameLogic.addActiveActuator(move,1)
 

 

Now lets get crazy with this script.(不知道該如何翻譯……——譯者注 *^_^*)
給plane增加一個新的 property ,取名為“go”,并且給它賦初值為0。增加一個 keyboard sensor ,取名為“up”,在the prompt thing那按下向上的方向鍵。(這里的the prompt thing不知道該怎么翻譯,反正這里就是在keyboard sensor里,先點一下“key”右邊的空白方塊,然后按下鍵盤上的有個鍵,這樣這個keyboard sensor就會監(jiān)控你所指定的那個鍵的狀態(tài)了?!g者注)。把它和 python controller 連接起來。再增加另一個 keyboard sensor ,取名為“down”并且使它監(jiān)視向下的方向鍵的狀態(tài)。把它也和 python controller 連接起來?,F(xiàn)在,在第三行下面,也就是“own”變量的下面,輸入這兩行:
代碼:

pressup = cont.getSensor("up")
pressdown = cont.getSensor("down")
 


這兩行獲得了那兩個 keyboard sensor ?,F(xiàn)在,在“speed”變量的下面,“speed = speed+0.001”的上面加上這兩行:
代碼:

if pressup.isPositive():
   own.go = 1
elif pressdown.isPositive():
   own.go = 0
 


那么如果 press up sensor 被激活了(也就是向上的方向鍵被按下了),它就會把物體的 property “go” 賦值為1。而如果向下的方向鍵被按下了,就把物體的 property “go” 賦值為0。
現(xiàn)在我們需要僅在“go”等于1時才讓物體有所動作。所以把代碼重排為這個樣子:
代碼:

if own.go == 1:
   speed = speed + 0.001
   move.setDLoc(0.0, speed, 0.0, 1)
   GameLogic.addActiveActuator(move,1)
else:
   speed = 0
   move.setDLoc(0.0, speed, 0.0, 1)
   GameLogic.addActiveActuator(move,0)
 


OK,現(xiàn)在從頭開始解釋一下。如果 property “go” 等于1,那么就如以前那樣執(zhí)行腳本,增加 speed 并且移動我們的plane,但是如果“go”不等于1,那么就把speed重設(shè)為0并且把 actuator 關(guān)閉。


所以最終版本的腳本是這樣的:
代碼:

cont=GameLogic.getCurrentController()
own = cont.getOwner()
move = cont.getActuator("move")
speed = move.getDLoc()[1]

if pressup.isPositive():
   own.go = 1
elif pressdown.isPositive():
   own.go = 0

if own.go == 1:
   speed = speed + 0.001
   move.setDLoc(0.0, speed, 0.0, 1)
   GameLogic.addActiveActuator(move,1)
else:
   speed = 0
   move.setDLoc(0.0, speed, 0.0, 1)
   GameLogic.addActiveActuator(move,0)
 


 

 


最后瀏覽一下。前面4行設(shè)置了我們所需要的變量。接下來的兩個“if”語句決定了“go”應該等于0還是1,而再接下來的兩個判斷語句在“go”等于1時會啟用動作,而在“go”等于0時復位并關(guān)閉動作。

這里還有一些基本的信息:

關(guān)于數(shù)組(list,不過似乎python里這個都翻譯為“列表”?!g者注):
數(shù)組是十分常用的數(shù)據(jù)結(jié)構(gòu)。它把一些信息或變量簡單的用方括號合在了一起。例如,getDLoc()函數(shù)返回一個數(shù)組如 [0, 0, 0, 1] 。要知道關(guān)于數(shù)組的更多信息,請閱讀隨python附帶的文檔。

布爾操作(if,elif,else,while):
~“if”語句非常簡單。 if 條件成立,那么就做某事……
~“elif”語句是用在“if”語句之后的,它的含義是“如果之前的條件不成立而這個條件成立,那么就做某事……”(“elif”的含義其實就是“else if”?!g者注)。例如:如果沒有按向上的方向鍵,但是向下的方向鍵被按下了,那么 own.go = 1。你可以在一個“if”語句之后接上多個“elif”。閱讀python文檔可以獲得更多的信息。
~“else”的含義是“如果所有的條件都沒有成立,那么就做某事……”
~“while”語句是這樣使用的:
代碼:

while own.go ==1:
   value = value + 1
   ……
 

其含義是:當 own.go 等于1時,就不停地給“value”增加1??墒菍ξ襾碚f使用“while”總是出錯,會讓blender失去響應。(個人認為……這種情況是因為寫的代碼中出現(xiàn)了死循環(huán)……——譯者注-_-!)

為什么這里會有兩個等號呢?恩……布爾運算有各種不同的比較操作符:
“==” 指的是 “等于”
“>=” 指的是 “大于或等于”
“>” 指的是 “大于”
“<=” 指的是 “小于或等于”
“<” 指的是 “小于”
“!=” 指的是 “不等于”
“and”用于兩個比較語句之間,比如:
代碼:

if this > that and this <= theother:
   do this
 

“or”也是用于兩個比較語句之間的,比如:
代碼:

if this > that or this > theother:
   do this
 


*記住,所有拼寫都是大小寫敏感的,并且不要忘了在條件判斷語句的末尾放上冒號,還要確保在條件判斷語句下面的代碼前要插入 tab

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多