Sign in to follow this  
newbie_game_dev

Push rectangle to where the collision happens?

Recommended Posts

Hi. I have a problem in tile collision. I am using Libgdx framework. I got the working tile collision base on their example the problem though is that is collision happens I cant move my sprite. For example if i have a collision in right side I cant move my sprite to move up or down :( Here is my code

 int startX, startY, endX, endY;
        float pushx = 0,pushy = 0;
        // move player
        if(Gdx.input.isKeyPressed(Input.Keys.LEFT)){
            dx=-1;
            currentWalk = leftWalk;

        }
        if(Gdx.input.isKeyPressed(Input.Keys.RIGHT)){
            dx=1;
            currentWalk = rightWalk;

        }
        if(Gdx.input.isKeyPressed(Input.Keys.DOWN)){
            dy=-1;
            currentWalk = downWalk;
        }
        if(Gdx.input.isKeyPressed(Input.Keys.UP)){
            dy=1;
            currentWalk = upWalk;
        }



        sr.setProjectionMatrix(camera.combined);
        sr.begin(ShapeRenderer.ShapeType.Line);
        Rectangle koalaRect = rectPool.obtain();
        koalaRect.set(player.getX(), player.getY(), pw, ph /2 );

        float oldX = player.getX(), oldY = player.getY(); // THIS LINE WAS ADDED

        player.setXY(player.getX() + dx * Gdx.graphics.getDeltaTime() * 4f, player.getY() + dy * Gdx.graphics.getDeltaTime() * 4f); // THIS LINE WAS MOVED HERE FROM DOWN BELOW



            if(dx> 0) {
                startX = endX = (int)(player.getX() + pw);
            } else {
                startX = endX = (int)(player.getX()  );
            }
            startY = (int)(player.getY());
            endY = (int)(player.getY() + ph);
            getTiles(startX, startY, endX, endY, tiles);

            for(Rectangle tile: tiles) {
                sr.rect(tile.x,tile.y,tile.getWidth(),tile.getHeight());
                if(koalaRect.overlaps(tile)) {

                        //dx = 0;
                        player.setX(oldX); // THIS LINE CHANGED
                        Gdx.app.log("x","hit  " + player.getX() + " " + oldX);
                        break;
                    
                }
            }






            if(dy > 0) {
                startY = endY = (int)(player.getY() + ph );
            } else {
                startY = endY = (int)(player.getY() );
            }
            startX = (int)(player.getX());
            endX = (int)(player.getX() + pw);
            getTiles(startX, startY, endX, endY, tiles);

            for(Rectangle tile: tiles) {
                if(koalaRect.overlaps(tile)) {
                    //dy = 0;
                    player.setY(oldY); // THIS LINE CHANGED
                    //Gdx.app.log("y","hit" + player.getY() + " " + oldY);
                    break;
                }
            }


        sr.rect(koalaRect.x,koalaRect.y,koalaRect.getWidth(),koalaRect.getHeight() / 2);
        sr.setColor(Color.GREEN);
        sr.end();

The solution i think is to push back the sprite when collision happens, but i dont know how. pls help :( thanks

 

Share this post


Link to post
Share on other sites
Kaptein    2224

If I'm reading your code right then:

 

1. koalaRect is set to players original location

2. Player is then moved to new position: X + dx, Y + dy

3. If (koalaRect is overlapping something it shouldnt) move player back to old position

 

As you can see, you are testing collision using old player position before adding (dx, dy),

and that means that collisions only happen once the player is technically already stuck. smile.png

 

Move the line that sets the koalaRect to after setting new player position to immediately fix the problem,

or simply set koalaRect to player.X + dx, player.Y + dy, and only upon confirming the player won't be stuck there,

move the player.

 

Finally, it looks like you are trying to check player.X + dx and player.Y + dy independently, which is exactly what you want to do,

however, again koalaRect isn't updated, so the second collision check is the very same test you performed just lines before.

To run independent tests for dx and dy:

 

koalaRect.set(player.getX() + dx, player.getY(), pw, ph);

 

if (collisionTest(koalaRect) == false)

{

   // (player.X + dx, player.Y) did not collide with anything

   // move player on X-axis only:

   player.X += dx;

}

 

koalaRect.set(player.getX(), player.getY() + dy, pw, ph);

 

if (collisionTest(koalaRect) == false)

{

   // (player.X, player.Y + dy) did not collide with anything

   // move player on Y-axis only:

   player.Y += dy;

}

 

Hope this helps

Edited by Kaptein

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this