Take the 2-minute tour ×
Game Development Stack Exchange is a question and answer site for professional and independent game developers. It's 100% free, no registration required.

I’m trying to make an android game and I’m having a bit of trouble getting the collision detection to work. It works sometimes but my conditions aren’t specific enough and my program gets it wrong. How could I improve the following if conditions?

public boolean checkColisionWithPlayer( Player player )
{
                    // Top Left             // Top Right                // Bottom Right                                         // Bottom Left                      //
    int[][] PP = { { player.x, player.y }, { player.x + player.width, player.y }, {player.x + player.height, player.y + player.width }, { player.x, player.y + player.height } };

    // TOP LEFT - PLAYER //

    if( ( PP[0][0] > x && PP[0][0] < x + width ) && ( PP[0][1] > y && PP[0][1] < y + height ) && ( (x - player.x) < 0 ) )
    {
        player.isColided = true;
        //player.isSpinning = false;

        // Collision On Right
        if( PP[0][0] > ( x + width/2 ) && ( PP[0][1] - y < ( x + width ) - PP[0][0] ) )
        {
            Log.i("Colision", "Top Left - Right Side");

            player.x = ( x + width ) + 1;
            player.Vh = player.phy.getVelsoityWallColision(player.Vh, player.Cr);
        }
        // Collision On Bottom
        else if( PP[0][1] > ( y + height/2 ) )
        {
            Log.i("Colision", "Top Left - Bottom Side");

            player.y = ( y + height ) + 1;
            if( player.Vv > 0 ) player.Vv = 0;
        }

        return true;
    }

    // TOP RIGHT - PLAYER //

    else if( ( PP[1][0] > x && PP[1][0] < x + width ) && ( PP[1][1] > y && PP[1][1] < y + height ) && ( (x - player.x) > 0 ) )
    {
        player.isColided = true;
        //player.isSpinning = false;

        // Collision On Left
        if( PP[1][0] < ( x + width/2 )  && ( PP[1][0] - x < PP[1][1] - y ) )
        {
            Log.i("Colision", "Top Right - Left Side");

            player.x = ( x ) + 1;
            player.Vh = player.phy.getVelsoityWallColision(player.Vh, player.Cr);
        }
        // Collision On Bottom
        else if( PP[1][1] > ( y + height/2 ) )
        {
            Log.i("Colision", "Top Right - Bottom Side");

            player.y = ( y + height ) + 1;
            if( player.Vv > 0 ) player.Vv = 0;
        }

        return true;
    }

    // BOTTOM RIGHT - PLAYER //

    else if( ( PP[2][0] > x && PP[2][0] < x + width ) && ( PP[2][1] > y && PP[2][1] < y + height ) )
    {
        player.isColided = true;
        //player.isSpinning = false;

        // Collision On Left
        if( PP[2][0] < ( x + width/2 ) && ( PP[2][0] - x < PP[2][1] - y ) )
        {
            Log.i("Colision", "Bottom Right - Left Side");

            player.x = ( x ) + 1;
            player.Vh = player.phy.getVelsoityWallColision(player.Vh, player.Cr);
        }
        // Collision On Top
        else if( PP[2][1] < ( y + height/2 ) )
        {
            Log.i("Colision", "Bottom Right - Top Side");

            player.y = y - player.height;
            player.Vv = player.phy.getVelsoityWallColision(player.Vv, player.Cr);
            //player.Vh = -1 * ( player.phy.getVelsoityWallColision(player.Vv, player.Cr) );
            int rs = x - player.x;
            Log.i("RS", String.format("%d", rs));
            if( rs > 0 ) 
            {
                player.direction = -1;
                player.isSpinning = true;
                player.Vh = -0.5 * ( player.phy.getVelsoityWallColision(player.Vv, player.Cr) );
            }
            if( rs < 0 ) 
            {
                player.direction = 1;
                player.isSpinning = true;
                player.Vh = 0.5 * ( player.phy.getVelsoityWallColision(player.Vv, player.Cr) );
            }
            player.rotateSpeed = 1 * rs;
        }

        return true;
    }

    // BOTTOM LEFT - PLAYER //

    else if( ( PP[3][0] > x && PP[3][0] < x + width ) && ( PP[3][1] > y && PP[3][1] < y + height ) )//&& ( (x - player.x) > 0 ) )
    {
        player.isColided = true;
        //player.isSpinning = false;

        // Collision On Right
        if( PP[3][0] > ( x + width/2 ) && ( PP[3][1] - y < ( x + width ) - PP[3][0] ) )
        {
            Log.i("Colision", "Bottom Left - Right Side");

            player.x = ( x + width ) + 1;
            player.Vh = player.phy.getVelsoityWallColision(player.Vh, player.Cr);
        }
        // Collision On Top
        else if( PP[3][1] < ( y + height/2 ) )
        {
            Log.i("Colision", "Bottom Left - Top Side");

            player.y = y - player.height;
            player.Vv = player.phy.getVelsoityWallColision(player.Vv, player.Cr);
            //player.Vh = -1 * ( player.phy.getVelsoityWallColision(player.Vv, player.Cr) );
            int rs = x - player.x;
            //Log.i("RS", String.format("%d", rs));
            //player.direction = -1;
            //player.isSpinning = true;
            if( rs > 0 ) 
            {
                player.direction = -1;
                player.isSpinning = true;
                player.Vh = -1 * ( player.phy.getVelsoityWallColision(player.Vv, player.Cr) );
            }
            if( rs < 0 ) 
            {
                player.direction = 1;
                player.isSpinning = true;
                player.Vh = 1 * ( player.phy.getVelsoityWallColision(player.Vv, player.Cr) );
            }
            player.rotateSpeed = 1 * rs;
        }

        //try { Thread.sleep(1000, 0); } 
        //catch (InterruptedException e) {}
        return true;
    }

    else 
    {
        player.isColided = false;
        player.isSpinning = true;
    }


    return false;
}
share|improve this question
add comment

2 Answers

up vote 0 down vote accepted

There is a problem with the bottom right:

{player.x + player.height, player.y + player.width }

must be

{player.x + player.width, player.y + player.height }
share|improve this answer
    
Thanks i cant believe i missed that –  Dan Jul 17 '12 at 7:15
add comment

Instead of reinventing the wheel, I recommend you use a library that will handle collision detection (and possibly physics) for you. JBox2D will handle collision detection and physics for you. If you want to learn to create your own physics / collision engine, take a look at its source code.

I'm sorry if this didn't answer your question fully.

share|improve this answer
    
Thanks, looking at the source code will be good but i don’t think i will use the library because i want to be able to understand what the engine is doing and that will be easier it i write it my self –  Dan Jul 10 '12 at 23:40
    
are there any text books you know that would help –  Dan Jul 11 '12 at 1:13
    
I haven't bought any good books on collision detection myself. Sorry. –  Oskar Jul 12 '12 at 9:27
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.