2015-11-02 94 views
3

我必须做一个带有碰撞检测的tron类型的游戏。我开始让p1p2移动并在他们身后留下踪迹。处理颜色碰撞检测(java)

我试图做一个颜色碰撞检测,但它不工作。我有不同的变量,例如“P1_edge”,当p1碰到屏幕边缘时。我用红色边框标记。

但是,似乎工作的唯一一个是当游戏开始时他们自己崩溃了。它立即完成,因为它们已经在自己身上。如果我拿走那一点,没有其他检测。

int P1_XPos; //Player 1 position 
int P1_YPos; 

boolean Player1_Up = false; //Determins what way P1 is going 
boolean Player1_Down = false; 
boolean Player1_Left = false; 
boolean Player1_Right = true; 

int P2_XPos; //Player 2 position 
int P2_YPos; 

boolean Player2_Up = false; //Determins what way P2 is going 
boolean Player2_Down = false; 
boolean Player2_Left = true; 
boolean Player2_Right = false; 

boolean Game_State = false; //see if the game is over (false = over) 

final int P1_Edge = 0; //P1 crashed into the edge 
final int P1_P1 = 1; //P1 crashed into P1 
final int P1_P2 = 2; //P1 crashed into P2 

final int P2_Edge = 3; //P2 crashed into the edge 
final int P2_P2 = 4; //P2 crashed into P2 
final int P2_P1 = 5; //P2 crashed into P1 

final int Crash = 6; //Other 

void setup() 
{ 
size(700,600); //Set screen dimensions 
background(0, 0, 0); 

P1_XPos = 100; //set P1 and P2 posision 
P1_YPos = 100; 

P2_XPos = 600; 
P2_YPos = 500; 

strokeWeight(3); //Draw the edge of the screen 
stroke(255, 0, 0); 
line(1, 1, 1, height - 1); 
line(1, 1, width - 1, 1); 
line(width - 2, 1, width - 2, height - 1); 
line(1, height - 2, width - 1, height - 2); 

stroke(0, 255, 0); //Draw the starting positions 
point(P1_XPos, P1_YPos); 

stroke(0, 0, 255); 
point(P2_XPos, P2_YPos); 
} 
void draw() 
{ 
strokeWeight(3); 

if (Game_State == true) //if the game is not over 
{ 
    stroke(0, 255, 0); //Draw P1 
    point(P1_XPos, P1_YPos); 
    MovePlayer1(); //Move P1 

    stroke(0, 0, 255); //Draw P2 
    point(P2_XPos, P2_YPos); 
    MovePlayer2(); //Move P2 

    Collision_Detection(); //Detect any crashes 
} 


} 
void keyPressed() 
{ 
if(key == CODED) //Controls P1 movement 
{ 
    if (keyCode == UP) 
    { 
     Player1_Up = true; 
     Player1_Down = false; 
     Player1_Left = false; 
     Player1_Right = false; 
    } 

    else if(keyCode == DOWN) 
    { 
     Player1_Down = true; 
     Player1_Up = false; 
     Player1_Left = false; 
     Player1_Right = false; 
    } 

    else if (keyCode == LEFT) 
    { 
     Player1_Left = true; 
     Player1_Down = false; 
     Player1_Up = false; 
     Player1_Right = false; 
    } 

    else if (keyCode == RIGHT) 
    { 
     Player1_Right = true; 
     Player1_Down = false; 
     Player1_Left = false; 
     Player1_Up = false; 
    } 
} 

if ((key == 'W') || (key == 'w')) //Controls P2 movement 
    { 
     Player2_Up = true; 
     Player2_Down = false; 
     Player2_Left = false; 
     Player2_Right = false; 
    } 

    else if((key == 'S') || (key == 's')) 
    { 
     Player2_Down = true; 
     Player2_Up = false; 
     Player2_Left = false; 
     Player2_Right = false; 
    } 

    else if ((key == 'A') || (key == 'a')) 
    { 
     Player2_Left = true; 
     Player2_Down = false; 
     Player2_Up = false; 
     Player2_Right = false; 
    } 

    else if ((key == 'D') || (key == 'd')) 
    { 
     Player2_Right = true; 
     Player2_Down = false; 
     Player2_Left = false; 
     Player2_Up = false; 
    } 

    if (key == ' ') 
    { 
     Game_State = true; 
    } 
} 

void MovePlayer1() //Moves P1 
{ 
if(Player1_Up == true) 
{ 
    P1_YPos -= 1; 
} 

if(Player1_Down == true) 
{ 
    P1_YPos += 1; 
} 

if(Player1_Left == true) 
{ 
    P1_XPos -= 1; 
} 

if(Player1_Right == true) 
{ 
    P1_XPos += 1; 
} 
} 

void MovePlayer2() //Moves P2 
{ 
if(Player2_Up == true) 
{ 
    P2_YPos -= 1; 
} 

if(Player2_Down == true) 
{ 
    P2_YPos += 1; 
} 

if(Player2_Left == true) 
{ 
    P2_XPos -= 1; 
} 

if(Player2_Right == true) 
{ 
    P2_XPos += 1; 
} 
} 

int TestColorP1 (color P1Test) //Detect what color P1 is touching 
{ 

if (P1Test == color (255,0,0)) 
return P1_Edge; 
else if (P1Test == color(0,255,0)) 
return P1_P1; 
else if (P1Test == color(0,0,255)) 
return P1_P2; 
else return Crash; 
} 

int TestColorP2 (color P2Test) //Detect what color P2 is touching 
{ 

if (P2Test == color (255,0,0)) 
return P2_Edge; 
else if (P2Test == color(0,255,0)) 
return P2_P1; 
else if (P2Test == color(0,0,255)) 
return P2_P2; 
else return Crash; 
} 

void Collision_Detection() 
{ 
color P1_Pixel; //This is the color P1 is touching 
color P2_Pixel; 

P1_Pixel = get(P1_XPos, P1_YPos); //Declare is as P1 position 
P2_Pixel = get(P2_XPos, P2_YPos); 

if (TestColorP1(P1_Pixel) == P1_Edge) //See if P1 has crashed 
{ 
    background(0); 
    Game_State = false; 
} 
else if (TestColorP1(P1_Pixel)== P1_P1) 
{ 
    // background(0); 
    // Game_State = false; 
} 
else if (TestColorP1(P1_Pixel) == P1_P2) 
{ 
    background(0); 
    Game_State = false; 
} 

if (TestColorP2(P2_Pixel) == P2_Edge) //See if P2 has crashed 
{ 
    background(0); 
    Game_State = false; 
} 
else if (TestColorP2(P2_Pixel)== P2_P1) 
{ 
    background(0); 
    Game_State = false; 
} 
else if (TestColorP2(P2_Pixel) == P2_P2) 
{ 
    // background(0); 
    // Game_State = false; 
} 
else if (TestColorP2(P2_Pixel) == Crash) 
{ 

} 

} 

我知道它很长,但你应该能够将它复制并粘贴到处理草图中,并且它将起作用。我也留下了评论,所以你知道为什么我添加了每一个代码。

回答

3

这是一个真正的头部划痕 - 很好的问题。

抛弃你的最大问题是Processing默认情况下启用了抗锯齿功能。这会导致您的颜色与您所期望的颜色稍有不同。在大多数草图中,这是一件好事,因为它使事情看起来更好。但是因为你使用的是确切的颜色值,所以这会让你感到困扰。您可以通过截取草图并随后采样颜色来证明这一点。

要禁用此功能,只需在草图开始处拨打noSmooth()即可。更多信息可以在参考here中找到。

接下来让你感到困扰的是你的中风重量设置为3,但是你一次只移动一个像素。这会导致玩家“留在”最后一点的内部,这就是为什么他们会不断跑到自己身边。

要修复,您可以在draw()函数的开头简单地调用strokeWeight(1);。或者,如果您需要3的中风重量,那么请确保您将播放器移动到刚刚绘制的圆圈之外。

这会解决你的问题,但从长远来看,你可能会更好地跟踪数据结构中的以前的玩家位置,如的ArrayList。然后,每次调用draw()时,都会重新绘制它们,而不是仅绘制一次。而不是尝试手动检查颜色,只会在路径的某些部分进行碰撞检查,以避免上述情况。

+0

啊谢谢,把strokeweight改为1固定它。这只是一个小小的任务,下个星期我们必须做蛇,所以生病可能不得不使用像你所说的pvectors的阵列列表。再次感谢信息 – Will

+0

你可以用'noSmooth'来镜像PGraphics并在那里检测。 –

+0

@ Will Yep,Snake可能需要'ArrayList'方法,因为尾巴不会不断增长。 –