使用TILED映射进行Java碰撞检测

时间:2011-09-08 17:44:56

标签: java collision-detection tile

我正在制作游戏并遇到了问题。 当poly接触瓷砖时,我做了一个碰撞检测,说明是真的。 虽然这对于让玩家不走(真的?)墙是完美的。 当我施加重力时,应该使用相同的方法停止,但这会产生问题。 它一直在下降,直到撞到地板,但你也不能再走了,所以我需要另外一次碰撞检测。 我不知道从哪里开始? :( 感谢。

2 个答案:

答案 0 :(得分:1)

将所有切片加载到ArrayList中。然后,您可以使用for-each循环将碰撞检测应用于您的播放器的所有磁贴。请注意,以下示例可能不会声明所有必要的工作,但它应该可以帮助您了解这种碰撞检测方法的工作原理,并允许您将其实现到游戏中。

Tile.java

    import java.awt.Rectangle;
    private int tileWidth = 32;
    private int tileHeight = 32;
    private int x;
    private int y;
    public class Tile() {
        public Tile(int tx, int ty) {
            x = tx * tileWidth;
            y = ty * tileHeight;
        }
        public Rectangle getBounds() {
            return new Rectangle(x, y, tileWidth, tileHeight);
        }
    }

CheckCollision.java

    import java.awt.Rectangle;
    public class CheckCollision {
        public boolean isColliding(Player player, Tile tile) {
            Rectangle pRect = player.getBounds();
            Rectangle tRect = tile.getBounds();
            if(pRect.intersects(tRect)) {
                return true;
            } else {
                return false;
            }
        }
    }

Player.java

    import java.awt.Rectangle;
    import java.util.ArrayList;
    public class Player {
        public void move(ArrayList<Tile> tiles) {
            y -= directionY; //falling
            for(Tile t: tiles) { // for all of the Tiles in tiles, do the following
                Tile next = t;
                if(CheckCollision.isColliding(this, next) {
                    y += directionY; //stop falling
                }
            }
            x -= dx; // move your x
            for(Tile t: tiles) { // for all of the Tiles in tiles, do the following
                Tile next = t;
                if(CheckCollision.isColliding(this, next) {
                    x += directionY; //move back if collides                  }
            }

        }

        public Rectangle getBounds() {
            return new Rectangle(playerX, playerY, playerWidth, playerHeight);
        }
    }

Graphics.java(绘制图块和播放器的类)

    import java.awt.ActionListener;
    import java.util.ArrayList;
    public class Graphics extends JPanel implements ActionListener {
        public ArrayList<Tile> tiles = new ArrayList();
        Player player = new Player();
        public JPanel() {
            tiles.add(new Tile(0, 0)); //adds a Tile at X:0 Y:0 to ArrayList tiles
        }

        @Override
        public void ActionPerformed(ActionEvent e) {
            player.move(tiles);
        }
    }

答案 1 :(得分:0)

我的Minecraft克隆遇到了类似的问题。问题是我的代码每帧都检测到与地板的碰撞,我通过取消所有3个维度的运动来回应。我改变了它所以我只取消了那个动作的垂直分量,并且它工作正常。