2011-04-24 91 views
2

我試圖做一個成熟的遊戲在C++和我進行了塊的矢量, 和我簡單地遍歷向量和檢查單獨的碰撞:2D Box Collisions - 我做錯了什麼? (C++)

//Pseudo code 
class Block{ 
...int x 
...int y 
...int width 
...int height 
}; 

class Player{ 
int x 
int y 
int width 
int height 
int hsp //horizontal speed 
int vsp //vertical speed 
int facing //0 = no direction, -1 = left, 1 = right 
... 



void loop() 
{ 

    if(keyboard_pressed(key_left) { x-=hsp; facing = -1;} 
    if(keyboard_pressed(key_right) {x+=hsp; facing = 1;} 
    if(keyboard_pressed(key_up) {y-=vsp;} 
    if(keyboard_pressed(key_down) {y+=vsp;} 
    if(keyboard_released(key_left | key_right) {facing = 0;} 

    for(int i = 0; i < blocks.size(); i++) 
    { 
     Block b = blocks.at(i); 
     check_Collision(b); 
    } 
} 

}; 

,你可以看,我的播放器根據hsp和vsp簡單地移動。夠簡單。 我的問題的主要部分是在check_Collision()。首先,我檢查玩家 是否位於街區頂部,如果他是,讓他留在那裏。 然後我檢查玩家是否在街區的兩側。 但由於某種原因有問題。由於某種原因,當我在頂部時, 他停留在頂部,但他被轉移到左側。

我真的不知道該去哪裏。 下面的代碼只對頂部和左側的檢查:

check_Collision(){ 
/////////////////////////////////// 
var myLeft, myRight, myTop, myBot; 
var bLeft, bRight, bTop, bBot; 
myLeft = x; 
myRight = x + width; 
myTop = y; 
myBot = y + height; 
///////////////////// 
bLeft = b.x; 
bRight = b.x + b.width; 
bTop = b.y; 
bBot = b.y + b.height; 
////////////////////////////////// 


//Check if we are at the top 
if(myBot + vsp > bTop+1){ 
y = bTop - height; 
} 

//Check if we are at the sides 
if(myBot > bTop+2){ 

    if(myRight + hsp > bLeft) 
    { 
     x = bLeft - width; 
    } 

} 
} 

如果任何人都可以點我到二維盒碰撞一些教程,將是巨大的。

回答

0

您使用的邏輯對我沒有意義。僅僅是爲了檢查玩家是否在阻擋下是不夠的:你是否還需要確保玩家站在其上,也就是說,距離街區的左側或右側不太遠?同樣,在第二次檢查時,您必須確保玩家​​不會跳過,而是跳過(或站在上面)。您的if部分檢查了這一點,但沒有考慮到第一次檢查可能會改變玩家位置的事實。

你能否假設玩家永遠不能走下街區?你能否假設玩家永遠不會移動得足夠快,從而完全通過該塊(hsp> b.width等)來「隧道」?

如果其中任何一個的答案都是否定的,您將需要更復雜的碰撞檢測。