關(guān)于貓崽指令的困惑及補(bǔ)充|歡迎評(píng)論解答

關(guān)于貓崽指令的代碼分析(僅個(gè)人觀點(diǎn),歡迎討論補(bǔ)充):在代碼的slugnpcai類中有一個(gè)用于玩家與貓崽溝通的函數(shù)communicate,代碼如下:

可以看見,在這里對(duì)貓崽的行為模式進(jìn)行控制 的主要是幾個(gè)變量:player.inputpackage里所使用的player.input里的x和y,以及jmp(即是否按下跳躍鍵的判定),我們找到player.inputpackage的定義

看它和player.input的值在哪里被改變

……
我放棄了,讓我們直接從現(xiàn)象推測(cè)本質(zhì),看看這個(gè)input數(shù)組里的x和y會(huì)造成什么效果,來(lái)推測(cè)它們的作用
經(jīng)過(guò)一段時(shí)間的查找與核對(duì),我最終選擇了菜單控制作為推測(cè)x和y的樣本,因?yàn)榇蠹叶贾涝诓藛雾?yè)按上下左右鍵可以代替鼠標(biāo)選擇菜單按鍵,代碼如下:

以第870和871行為例,這兩行代碼的意思是當(dāng)input[0].x的值不為0且不等于input[1].x時(shí),將菜單選擇的光標(biāo)移到input[0].x的位置,所以我們可以推測(cè),input[0].x和input[0].y是此幀檢測(cè)到上下左右按鍵按下的值,而input[1]的x和y則是上一幀檢測(cè)到上下左右按鍵是否按下的結(jié)果(證據(jù)是當(dāng)我們長(zhǎng)按上下左右的某一個(gè)按鍵時(shí),菜單頁(yè)的被選擇按鈕并不會(huì)呈現(xiàn)出led燈一樣的輪回閃動(dòng),所以不論按下按鍵多久,都只會(huì)檢測(cè)為“按下一次”)。那么我們接下來(lái)就要區(qū)分x和y,哪個(gè)是上下鍵,哪個(gè)是左右鍵,按下的值又分別是什么。

回到控制貓崽行為的communite函數(shù),已知下鍵和跳躍是讓貓崽待在原地,那么從725~727行就可以推測(cè),我們按上鍵和下鍵,是改變input[0].y的值,當(dāng)按下下鍵時(shí),值為-1,按下上鍵時(shí),值為1,不按則為0,x同理。
綜上我們可以推得這個(gè)函數(shù)的作用:先檢測(cè)是否按下跳躍鍵(注意這里是“按下”,而非“按著”),在按下跳躍鍵的這一幀檢測(cè)是否同時(shí)按著上鍵或者下鍵,當(dāng)同時(shí)按著下鍵時(shí)發(fā)出“待在原地”指令, 當(dāng)同時(shí)按著上鍵時(shí)發(fā)出“一起玩”指令。所以評(píng)論區(qū)有些朋友說(shuō)按下和跳躍沒有反應(yīng),因?yàn)闄z測(cè)邏輯是必須要在同一幀達(dá)到“按下”跳躍和“按著”趴下,在現(xiàn)實(shí)操作中很難精準(zhǔn)控制,為了方便操作我們可以更改為先按著趴下再按跳躍,就可以成功發(fā)送指令。
而736行for循環(huán)的指令意思為:檢測(cè)玩家在一段時(shí)間內(nèi)的跳躍狀態(tài),是否多次跳躍,也即up發(fā)現(xiàn)的“連續(xù)跳躍給貓崽發(fā)指令自己玩”,請(qǐng)注意根據(jù)代碼,這里的連續(xù)跳躍讓貓崽自己玩和上+跳躍讓貓崽自己玩,貓崽的行為表現(xiàn)都是使用同一個(gè)狀態(tài)this.toldToPlay?,只是為其賦值的函數(shù)不同,相當(dāng)于小范圍的“自己玩”和大范圍的“自己玩”,所以會(huì)呈現(xiàn)出視頻中顯示的區(qū)別。
其實(shí)我不是很擅長(zhǎng)代碼然后雨世界的邏輯又層層嵌套很難看懂,如有錯(cuò)誤疏漏還請(qǐng)指正,讓讓我吧TAT