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