处理颜色碰撞检测(java)
Processing color collision detection (java)
我必须制作一款带有碰撞检测功能的 Tron 类游戏。我首先让 p1
和 p2
移动并在它们身后留下痕迹。
我尝试进行颜色碰撞检测,但它不起作用。我有不同的变量,例如 "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)
{
}
}
我知道它很长,但您应该能够将其复制并粘贴到加工草图中,它就会起作用。我也留下了评论,所以你知道为什么我添加了每一位代码。
这是一个真正令人头疼的问题 - 好问题。
最让您失望的是 Processing 默认启用抗锯齿功能。这会导致您的颜色与您的预期略有不同。在大多数草图中,这是一件好事,因为它让事情看起来更好。但是由于您使用的是准确的颜色值,所以这会把您搞砸。您可以通过截取草图然后对颜色进行采样来证明这一点。
要禁用此功能,只需在草图的开头调用 noSmooth()
。可以在参考文献 here.
中找到更多信息
接下来让您搞砸的是您的笔划权重设置为 3,但您一次只将玩家移动 1 个像素。这会导致玩家停留 "inside" 最后绘制的点,这就是为什么他们不断 运行 自己。
要修复 that,您只需在 draw()
函数的开头调用 strokeWeight(1);
。或者,如果您需要 3 的笔画粗细,请确保将玩家移到刚刚绘制的圆圈之外。
这将解决您的问题,但在较长的 运行 中,您可能最好在数据结构中跟踪以前的玩家位置,例如 ArrayList
[=] 14=]。然后,每次调用 draw()
时都会重新绘制它们,而不是只绘制一次。而不是尝试手动检查颜色,只在路径的某些部分进行碰撞检查会更容易,以避免上述情况。
我必须制作一款带有碰撞检测功能的 Tron 类游戏。我首先让 p1
和 p2
移动并在它们身后留下痕迹。
我尝试进行颜色碰撞检测,但它不起作用。我有不同的变量,例如 "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)
{
}
}
我知道它很长,但您应该能够将其复制并粘贴到加工草图中,它就会起作用。我也留下了评论,所以你知道为什么我添加了每一位代码。
这是一个真正令人头疼的问题 - 好问题。
最让您失望的是 Processing 默认启用抗锯齿功能。这会导致您的颜色与您的预期略有不同。在大多数草图中,这是一件好事,因为它让事情看起来更好。但是由于您使用的是准确的颜色值,所以这会把您搞砸。您可以通过截取草图然后对颜色进行采样来证明这一点。
要禁用此功能,只需在草图的开头调用 noSmooth()
。可以在参考文献 here.
接下来让您搞砸的是您的笔划权重设置为 3,但您一次只将玩家移动 1 个像素。这会导致玩家停留 "inside" 最后绘制的点,这就是为什么他们不断 运行 自己。
要修复 that,您只需在 draw()
函数的开头调用 strokeWeight(1);
。或者,如果您需要 3 的笔画粗细,请确保将玩家移到刚刚绘制的圆圈之外。
这将解决您的问题,但在较长的 运行 中,您可能最好在数据结构中跟踪以前的玩家位置,例如 ArrayList
[=] 14=]。然后,每次调用 draw()
时都会重新绘制它们,而不是只绘制一次。而不是尝试手动检查颜色,只在路径的某些部分进行碰撞检查会更容易,以避免上述情况。