Обнаружение столкновения Java с TILED картами - PullRequest
0 голосов
/ 08 сентября 2011

Я делал игру и столкнулся с проблемой. Я сделал обнаружение столкновения, которое говорит, что истина, когда поли касается плитки. Хотя это было идеально, чтобы заставить игрока не ходить (правда?) По стене. Когда я применил гравитацию, он должен был остановиться тем же методом, который создал проблему. он продолжал падать, пока не упал на пол, но тогда вы также не можете больше ходить, поэтому мне нужно другое обнаружение столкновений. и я понятия не имею, с чего начать? :( Спасибо.

Ответы [ 2 ]

1 голос
/ 17 февраля 2012

Загрузите все ваши плитки в 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);
        }
    }
0 голосов
/ 03 января 2014

У меня была похожая проблема с моим клоном Minecraft.Проблема заключалась в том, что мой код продолжал обнаруживать столкновение с полом каждый кадр, на что я реагировал, отменяя движение во всех трех измерениях.Я изменил его, поэтому я отменил только вертикальную составляющую этого движения, и она работала нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...