2016-08-18 133 views
0

背景信息:我正在用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; 
     } 
    } 
    } 
} 
+0

返回FALSE; ?並將我更新爲objects.length,i = objects.length。 – Roberrrt

+0

return;等於返回false – Gatsbill

+0

@Gatsbill它實際上等於'return undefined;'然後在邏輯表達式中求值爲false。 ;) – zfor

回答

1

我想我已經找到了答案。雖然它沒有直接修復這個bug,但我設法通過引入一個新的幫助函數來解決這個問題:
groundedCheckstandingCheck大致相同。它基本上只檢查玩家是否有效地仍然接地(如果player.y + player.height等於object.y)。

There 可能是 絕對是一個更快的方式來做到這一點,但現在工作。

我如何固定它:

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; 
     break; 
    } 
    } 
    // this is new 
    if(player.grounded){ 
    let len = objects.length; 
    for(let j = 0; j < objects.length; j ++){ 
     if(!groundedCheck(player, objects[j])){ 
     len --; 
     } 
    } 
    if(len <= 0){ 
     player.grounded = false; 
    } 
    } 
} 

// so is this 
const groundedCheck = (a, b) => { 
    // a = player, b = object 
    if(!(a.pos.x > b.pos.x + b.width || a.pos.x + a.width < b.pos.x)){ 
    if(a.pos.y + a.height === b.pos.y){ 
     return true; 
    } 
    } 
} 
相關問題