背景信息:我正在用HTML5畫布製作一個非常基本的2D平臺。 在我的主循環中,我遍歷所有對象以檢查玩家是否站在對象上。如果是這樣,我結束該函數的執行直到下一個循環。爲什麼這段代碼似乎在return語句後執行?
如果物體和玩家發生碰撞,在使用return
退出該功能(因爲我們知道玩家站在那個物體上)之前,我將玩家的Y軸速度設置爲0,調整他的Y位置稍微只是爲了讓他和對象正確對齊,並將玩家的屬性:player.grounded
設置爲true。這是主要問題所在。它是與player.isFalling
屬性關聯的必需布爾值。更新功能檢查玩家的Y速度是否高於0並檢查他是否沒有接地。在這種情況下player.isFalling
是正確的。只有當isFalling
爲真時,纔會執行站點檢查幫助器功能。
const standingCheckHandler = (player) => {
for(let i = 0; i < objects.length; i ++){
if(standingCheck(player, objects[i])){
player.pos.y = objects[i].pos.y - player.height;
player.velocity.y = 0;
player.grounded = true;
return;
}else{
player.grounded = false;
}
}
}
現在的問題:即使我退出功能,或者使用break
,環路依然延續遍歷其它對象。我會記錄player.grounded
,甚至在它設置爲true
(意味着該函數應該退出本身,對嗎?)後,它會繼續循環其他對象並將player.grounded
設置爲false
,這會導致遊戲本身的詭計。 (理論上它是有效的,但玩家不停地上下襬動,這不是一個真正的好景象)。
我試過各種東西。使用新的屬性,計算玩家可以站在的對象的數量,似乎沒有任何工作。我覺得我忽略了一些東西,但我不確定這可能是什麼。
(抱歉文本牆!)
更新:這是standingCheck方法:
const standingCheck = (a, b) => {
// a = player, b = object
if(a.isFalling){
if(!(a.pos.x > b.pos.x + b.width || a.pos.x + a.width < b.pos.x)){ //x
if(a.pos.y + a.height < b.pos.y && a.pos.y + a.height >= b.pos.y){ //y
return true;
}
}
}
}
返回FALSE; ?並將我更新爲objects.length,i = objects.length。 – Roberrrt
return;等於返回false – Gatsbill
@Gatsbill它實際上等於'return undefined;'然後在邏輯表達式中求值爲false。 ;) – zfor