Java 总是发生碰撞
我创建了一个tilemap和一个播放器(现在只是一个曲线)。我将瓷砖贴图和播放器放在屏幕上,但播放器位于左上角,并且总是卡在瓷砖中。我不知道如何:Java 总是发生碰撞,java,collision,Java,Collision,我创建了一个tilemap和一个播放器(现在只是一个曲线)。我将瓷砖贴图和播放器放在屏幕上,但播放器位于左上角,并且总是卡在瓷砖中。我不知道如何: 把它从角落里拿出来 阻止碰撞的发生,因为它是非阻塞块 在编写代码之前,您需要了解以下几点: tilesheet是一张有不同瓷砖的纸,它会 [未阻止,未阻止] [封锁,封锁] 这是我的对象超类的碰撞部分(我知道它看起来很像,但在开始之后,你可以得到漂移): 如果您还需要什么,请告诉我,我会给您。在calculateCorners中发生的事情(以及该方法
[封锁,封锁] 这是我的对象超类的碰撞部分(我知道它看起来很像,但在开始之后,你可以得到漂移):
如果您还需要什么,请告诉我,我会给您。在
calculateCorners
中发生的事情(以及该方法操作的变量)也可能与此相关。@MickMemonic好的,添加了它。您可能需要调用重新绘制或在某处验证,手动调整窗口大小以强制重新绘制,并查看播放器是否移动。
public void calculateCorners(double x, double y) {
int leftTile = (int)(x - cwidth / 2) / tileSize;
int rightTile = (int)(x + cwidth / 2 - 1) / tileSize;
int topTile = (int)(y - cheight / 2) / tileSize;
int bottomTile = (int)(y + cheight / 2) / tileSize;
int tl = tileMap.getType(topTile, leftTile);
int tr = tileMap.getType(topTile, rightTile);
int bl = tileMap.getType(bottomTile, leftTile);
int br = tileMap.getType(bottomTile, rightTile);
topLeft = tl == Tile.BLOCKED;
topRight = tr == Tile.BLOCKED;
bottomLeft = bl == Tile.BLOCKED;
bottomRight = br == Tile.BLOCKED;
}
public void checkTileMapCollision() {
currCol = (int) x / tileSize;
currRow = (int) y / tileSize;
x += velX;
y += velY;
calculateCorners(x, ydest);
if (velY < 0) {
if (topLeft || topRight) {
velY = 0;
y = currRow * tileSize + cheight / 2;
System.out.println("Collision");
} else {
y += velY;
}
}
if (velY > 0) {
if (bottomLeft || bottomRight) {
velY = 0;
falling = false;
y = (currRow + 1) * tileSize - cheight / 2;
System.out.println("Collision");
} else {
y += velY;
}
}
calculateCorners(xdest, y);
if (velX < 0) {
if (topLeft || bottomLeft) {
velX = 0;
System.out.println("Collision");
x = currCol * tileSize + cwidth / 2;
} else {
x += velX;
}
}
if (velX > 0) {
if (topRight || bottomRight) {
velX = 0;
System.out.println("Collision");
x = (currCol + 1) * tileSize - cwidth / 2;
System.out.println("Collision");
} else {
x += velX;
}
}
}
public void update() {
System.out.println("update");
getNextPosition();
checkTileMapCollision();
setPosition((int) xtemp, (int) ytemp);
}
public void setLeft(boolean b) {
left = b;
}
public void setRight(boolean b) {
right = b;
}
public void getNextPosition() {
if (left) {
velX = -2;
System.out.println("Left");
} else if (right) {
velX = 2;
System.out.println("Right");
}
}
public void draw(Graphics2D g) {
x += velX;
y += velY;
g.drawImage(spriteSheet, (int) x, (int) y, null);
}
public void setPosition(int x, int y) {
this.x = x;
this.y = y;
}
public void setVel(int velX, int velY) {
this.velX = velX;
this.velY = velY;
}