2016-05-10 213 views
0

我有一個使用ProcessingJS庫碰撞在2D遊戲Processingjs

// Game 
 
var player = { 
 
    x: 50, 
 
    y: 100, 
 
    width: 30, 
 
    height: 30, 
 
    speed: 10.5, 
 
    score: 0 
 
}; 
 
var food = { 
 
    x: 200, 
 
    y: 200, 
 
    width: 30, 
 
    height: 30, 
 
    speed: 10.5 
 
}; 
 
var up = 38; 
 
var down = 40; 
 
var left = 37; 
 
var right = 39; 
 

 
draw = function() { 
 
    background(155, 154, 156); 
 
    fill(0, 255, 85); 
 
    rect(player.x,player.y,player.width,player.height); 
 
    fill(245, 3, 3); 
 
    rect(food.x,food.y,food.width,food.height); 
 
    text('Score: ' + player.score,50,50); 
 
}; 
 

 
var collided = function(){ 
 
    if (player.x < food.x + food.width && 
 
    player.x + player.width > food.x && 
 
    player.y < food.y + food.height && 
 
    player.height + player.y > food.y) { 
 
     return true; 
 
    } else { 
 
     return false; 
 
    } 
 
}; 
 
keyPressed = function(){ 
 
    switch(keyCode){ 
 
     case up: 
 
      player.y -= player.speed; 
 
      break; 
 
     case down: 
 
      player.y += player.speed; 
 
      break; 
 
     case right: 
 
      player.x += player.speed; 
 
      break; 
 
     case left: 
 
      player.x -= player.speed; 
 
      break; 
 
     default: 
 
      break; 
 
    } 
 
    if(collided()){ 
 
     while(collided()){ 
 
      if(/* condition */){ 
 
       // Do What? 
 
      }; 
 
     } 
 
    } 
 
};

我命名爲某些原因對象「食物」,所以不要拿這一點這段JavaScript代碼。 我試圖讓玩家與「食物」物體發生碰撞時,它會像「食物」物體是一個固體物體一樣行動,並且無法通過它(就像你試圖穿過牆壁。)

我試着從玩家的X位置減去1,直到碰撞停止。我將玩家移動到與「食物」物體的側面碰撞,並且運作良好。但是當我在物體的頂部或底部碰撞時,它會將玩家移動到物體的邊緣。我不知道如何解決這個問題,所以幫助將不勝感激。

回答

2

1)不要試圖猜測,玩家應該回去,我就開始通過存儲在播放器位置在每個開始在keyPressed

keyPressed = function(){ 
    var oldX = player.x; 
    var oldY = player.y; 
    //do the other stuff 

現在,如果有衝突,你可以用player.x = oldX等方法讓他回到原來的位置。當然,這有可能讓他回到太遠。

2)相反,你可以使用更接近你的方法。由於keyPressed,您知道玩家來自哪個方向,並且您知道需要將他移回的距離有多遠,因爲您的座標是「食物」。我們可以跳過「而(碰撞)如果(條件)」,並把另一個開關直接進入了「如果(碰撞)」

if(collided()){ 
    switch(keyCode){ 
     case up: 
      player.y = food.y + food.height; 
      break; 
     case down: 
      player.y = food.y - player.height; 
      break; 
     //etc. 

3)最後,它可能是你,因爲你編碼的連續檢查想要增加更多的障礙,並認爲這是確保玩家不會與任何東西發生碰撞的最簡單方法。如果是這樣的話,我建議你多看看類和對象是如何工作的(如果你想自己編寫一切代碼)或者尋找一個碰撞庫(如果你希望它更有效)。如果你想擴大遊戲的範圍或增加功能,這種硬編碼的方法可能會在稍後給你帶來麻煩。