我正在制作游戏并遇到了问题。 当poly接触瓷砖时,我做了一个碰撞检测,说明是真的。 虽然这对于让玩家不走(真的?)墙是完美的。 当我施加重力时,应该使用相同的方法停止,但这会产生问题。 它一直在下降,直到撞到地板,但你也不能再走了,所以我需要另外一次碰撞检测。 我不知道从哪里开始? :( 感谢。
答案 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个维度的运动来回应。我改变了它所以我只取消了那个动作的垂直分量,并且它工作正常。