2
votes

I understand the basis of collision detection and have developed my way (as far as I know) for collision detection. However, it does not seem to be working. What I have done is instead of drawing full rectangles around sprites, shapes, and other objects, I simply made methods that draw lines (very thin rectangles) on all sides of the object, left, right, top, and bottom.

The methods that draw the thin rectangles on the left,right,top, and bottom of the specified sprites. This is probably not the best way to do collision, but this is what I have, and am open to all ideas and different solutions!

Note: The(int)(x-Game.getCamera().getX()),(int)(y + height -Game.getCamera().getY()), is simply for the camera, so when the player moves, the trees (in my case the object I want to collide with) do not move with him

public Rectangle getBounds() {
return new Rectangle((int)(x-Game.getCamera().getX()),
        (int)(y + height - Game.getCamera().getY()),width,height-height);
}

public  Rectangle getBoundsTop() {
return new Rectangle((int)(x-Game.getCamera().getX()),
        (int)(y- Game.getCamera().getY()),width,height-height);
}

public  Rectangle getBoundsRight() {
return new Rectangle((int)(x + width -Game.getCamera().getX()),
        (int)(y - Game.getCamera().getY()),width - width,height);

}

public  Rectangle getBoundsLeft() {
return new Rectangle((int)(x -Game.getCamera().getX()),
        (int)(y- Game.getCamera().getY()),width - width,height);

    }

Actual collision CHECKING (in player class)-

if(getBounds().intersects(treeTile.getBoundsTop())) {
    //What happens when they collide
    //When the bottom of the player collides with the top of the tree.
    }
if(getBoundsTop().intersects(treeTile.getBounds())) {
    //What happens when they collide
    //When the top of the player collides with the bottom of the tree

    }
if(getBoundsRight().intersects(treeTile.getBoundsLeft())) {
    //What happens when they collide
    //when the right side of the player collides with the left of the 
    //tree
    }
if(getBoundsLeft().intersects(treeTile.getBoundsRight())) {
    //What happens when they collide
    //When the left of the player collides with the right of the tree
    }

I appreciate all the help I can get

Here is collision and movement code-

for (int i = 0; i < handler.object.size(); i++) {
        Square handle = handler.object.get(i);
    if (getBounds().intersects(treeTile.getBoundsTop())) {
            handle.setvelY(-1);

    }
    if (getBoundsTop().intersects(treeTile.getBounds())) {
            handle.setvelY(0);

    }
    if (getBoundsRight().intersects(treeTile.getBoundsLeft())) {
            handle.setvelX(0);
    }
    if (getBoundsLeft().intersects(treeTile.getBoundsRight())) {
            handle.setvelX(0);

    }
    }

Movement-

    public void keyPressed(KeyEvent e) {

    int code = e.getKeyCode();



    for (int i = 0; i < handler.object.size(); i++) {
        Square handle = handler.object.get(i);

        if (handle.getId() == ObjectId.Zelda) {


            if (code == KeyEvent.VK_D) {
                handle.right();
            }
            if (code == KeyEvent.VK_A) {
                handle.left();
            }
            if (code == KeyEvent.VK_W) {
                handle.up();
            }
            if (code == KeyEvent.VK_S) {
                handle.down();
            }
 }

My new collision idea -

boolean walkRight = true;
boolean walkLeft = true;
boolean walkDown = true;
boolean walkUp = true;
public void tick() {

    if(walkRight == true) {
        velX = 2;

    }if(walkLeft == true) {
        velX = -2;

    }if(walkDown == true) {
        velY = 2;

    }if(walkUp == true) {
        velY = -2;
    }


if (getBounds().intersects(treeTile.getBoundsTop())) {
       walkDown = false;

}
if (getBoundsTop().intersects(treeTile.getBounds())) {
        walkUp = false;
}
if (getBoundsRight().intersects(treeTile.getBoundsLeft())) {
        walkRight = false;

}
if (getBoundsLeft().intersects(treeTile.getBoundsRight())) {
        walkLeft = false;

} 

Something like this, not exactly, it is just an example.

1

1 Answers

1
votes

Have you tried using 1 instead of width - width and height - height ?

I think these evaluating to 0 for the width / height is causing the intersects function to fail.

EDIT

I think you're over complicating this. If you just have one big collision box, instead of four small ones, then where ever you're moving your player, you can

// Square previousPosition = currentPosition
// do move player code, which presumably updates the currentPosition
// loop through all the trees you have
//    if the player is colliding with a tree
//        currentPosition = previousPosition

This should handle the player colliding with any side of the tree, since we just move them back to where they were previously.