简体   繁体   中英

Processing color collision detection (java)

I have to make a tron type game with collision detection. I started by making p1 and p2 move and leave a trail behind them.

I tried to make a color collision detection but its not working. I have different variables such as "P1_edge" which is when p1 hits the edge of the screen. I mark that with a red border.

But the only one that seem to be working is when they crash into themselves when the game starts. It instantly finishes as they are already on themselves. if I take that bit away, nothing else detects.

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)
 {

 }

}

I know it's long, but you should be able to just copy and paste this in a processing sketch and it will work. I have also left comments so you know why I've added each bit of code.

This was a real head scratcher- good question.

The biggest thing throwing you off is the fact that Processing enables anti-aliasing by default. This causes your colors to be just a little different than what you expect. In most sketches, this is a good thing, since it makes things look better. But since you're using the exact color values, this is screwing you up. You can prove this by taking a screenshot of your sketch and then sampling your colors.

To disable this, simply call noSmooth() at the beginning of your sketch. More info can be found in the reference here .

The next thing screwing you up is that your stroke weight is set to 3, but you're only moving the players 1 pixel at a time. This causes the players to stay "inside" the last point that was drawn, which is why they're constantly running into themselves.

To fix that , you could simply call strokeWeight(1); at the beginning of the draw() function. Or if you need a stroke weight of 3, then make sure you move the player outside of the circle that was just drawn.

That'll fix your problem here, but in the long run, you'd probably be better off keeping track of previous player positions in a data structure like an ArrayList of PVectors . Then you'd redraw them each time draw() was called instead of only drawing them once. And instead of trying to check colors manually, it would be easier to do collision checks in only certain parts of the paths, to avoid the above case.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM