-1

私はゲームを作っていて、問題に遭遇しました。ポリゴンがタイルに触れたときに true と言う衝突検出を行いました。それは、プレイヤーが壁を歩かないようにするのに最適でしたが (本当ですか?)。重力を適用すると、同じ方法で停止するはずですが、問題が発生しました。床にぶつかるまで落ち続けましたが、もう歩けなくなったので、別の衝突検出が必要です。どこから始めればいいのかわからない?:( ありがとう。

4

2 に答える 2

1

すべてのタイルを ArrayList にロードします。次に、for-each ループを使用して、プレーヤーのすべてのタイルに衝突検出を適用できます。次の例は、動作に必要なすべてを宣言しているわけではありませんが、この衝突検出方法がどのように機能するかを理解し、ゲームに実装できるようにするのに役立つはずです。

タイル.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);
        }
    }
于 2012-02-17T08:01:08.613 に答える
0

Minecraft のクローンでも同様の問題が発生しました。問題は、コードがフレームごとに床との衝突を検出し続け、3 次元すべてのモーションをキャンセルすることで対応していたことです。そのモーションの垂直成分のみをキャンセルするように変更したところ、問題なく動作しました。

于 2014-01-03T05:12:21.097 に答える