Java:命中检测未正确检测两个对象之间的重叠
Java: Hit Detection improperly detecting overlap among two objects
所以我有一个划船游戏,其中船对象必须使用箭头键躲避随机放置的障碍物对象。如果船撞到其中一个障碍物,船会受到随机数量的损坏。船是一张 27x52 的图片(两边都有 2 个像素,所以代码显示 2-25),障碍物是矩形。
我大部分时间都在进行命中检测;但是,只要船位于高大于宽的矩形的右侧,它就会受到损坏,即使船距离矩形的右边缘大约 5-10 像素。请参阅此图片以更好地理解该问题:http://imgur.com/pqDLMrl
在我的代码中,我创建了一个包含 15 个障碍物的数组。障碍物采用参数(Color color, int damageDealt, int xPos, int yPos, int width, int height, boolean hasHit)。
//Create array of obstacles
for(int x = 0; x < 15; x++) {
obstacles[x] = new Obstacle((new Color(rand.nextInt(81), rand.nextInt(51), rand.nextInt(51))), rand.nextInt(21) + 10, rand.nextInt(601),
(-x * (rand.nextInt(51) + 31)), (rand.nextInt(31) + 5), (rand.nextInt(31) + 5), false);
}
这是命中检测代码(这是在循环遍历障碍对象数组的 for 循环中:
for(int y = 2; y <= 25; y++) {
//Obstacles hit detection
for(int z = 0; z <= obstacles[x].getw(); z++) {
if(boat.getx() + y == obstacles[x].getx() + z && boat.gety() == obstacles[x].gety()) {
if(!obstacles[x].getDamaged()) {
boat.setHealth(boat.getHealth() - obstacles[x].getdmg());
obstacles[x].setDamaged(true);
}
}
}
现在它循环通过船的 x 值,从 2 到 25,而不是 0 到 27,因为两边的两个像素都没有。然后循环遍历障碍物的 x 值(xPos 到 xPos+width)并查看这些值是否匹配。如果匹配且 y 值匹配,则船将受损。请记住,只有当船位于障碍物的右侧并且障碍物的高度大于宽度时,才会发生这种情况。我没有发现我的代码有问题,但我无法为我的错误找到解决方案。谢谢。
编辑:这是船和障碍物的代码 classes.
import java.awt.Color;
import java.awt.Rectangle;
public class Obstacle {
private int dmg, xPos, yPos, height, width;
private Color color;
private boolean hasDamaged;
public Obstacle(Color hue, int damage, int x, int y, int w, int h, boolean damaged) {
dmg = damage;
xPos = x;
yPos = y;
width = w;
height = h;
color = hue;
hasDamaged = damaged;
}
public boolean getDamaged() {
return hasDamaged;
}
public void setDamaged(boolean damaged) {
hasDamaged = damaged;
}
public Color getColor() {
return color;
}
public int getdmg() {
return dmg;
}
public void setdmg(int damage) {
dmg = damage;
}
public int getx() {
return xPos;
}
public void setx(int x) {
xPos = x;
}
public int gety() {
return yPos;
}
public void sety(int y) {
yPos = y;
}
public int getw() {
return width;
}
public void setw(int w) {
width = w;
}
public int geth() {
return height;
}
public void seth(int h) {
height = h;
}
public Rectangle getBounds() {
return new Rectangle(xPos, yPos, width, height);
}
}
还有船class:
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.Rectangle;
public class Boat {
private int hp, xPos, yPos, dx;
private BufferedImage boatPic;
public Boat(BufferedImage img, int health, int x, int y, int velX) {
boatPic = img;
hp = health;
xPos = x;
yPos = y;
dx = velX;
}
public BufferedImage getImage() {
return boatPic;
}
public void setImage(BufferedImage img) {
boatPic = img;
}
public int getHealth() {
return hp;
}
public void setHealth(int health) {
hp = health;
}
public int getx() {
return xPos;
}
public void setx(int x) {
xPos = x;
}
public int gety() {
return yPos;
}
public void sety(int y) {
yPos = y;
}
public int getdx() {
return dx;
}
public void setdx(int velX) {
dx = velX;
}
public Rectangle getBounds() {
return new Rectangle(xPos, yPos, 25, 49);
}
}
如果你的船总是面向同一个方向,你可以更容易地检查碰撞。
通过为您的飞船和障碍物创建一个方法,return是一个与您的 object 大小相同的矩形。
public Rectangle getBounds() {
return new Rectangle(shipPosX, shipPosY, widht, height);
}
像这样。这样你就可以在一行中测试碰撞:
getBounds().intersects(obstacle.getBounds());
如果它们相交,这将 return 为真。
如果你想要更精确,或者想要不同方向的碰撞的不同情况,你可以为你的船的不同部分创建一个矩形,比如 body 和机翼。
public Rectangle getRightWingBound(){}
public Rectangle getLeftWindBound(){}
等等。
所以我有一个划船游戏,其中船对象必须使用箭头键躲避随机放置的障碍物对象。如果船撞到其中一个障碍物,船会受到随机数量的损坏。船是一张 27x52 的图片(两边都有 2 个像素,所以代码显示 2-25),障碍物是矩形。
我大部分时间都在进行命中检测;但是,只要船位于高大于宽的矩形的右侧,它就会受到损坏,即使船距离矩形的右边缘大约 5-10 像素。请参阅此图片以更好地理解该问题:http://imgur.com/pqDLMrl
在我的代码中,我创建了一个包含 15 个障碍物的数组。障碍物采用参数(Color color, int damageDealt, int xPos, int yPos, int width, int height, boolean hasHit)。
//Create array of obstacles
for(int x = 0; x < 15; x++) {
obstacles[x] = new Obstacle((new Color(rand.nextInt(81), rand.nextInt(51), rand.nextInt(51))), rand.nextInt(21) + 10, rand.nextInt(601),
(-x * (rand.nextInt(51) + 31)), (rand.nextInt(31) + 5), (rand.nextInt(31) + 5), false);
}
这是命中检测代码(这是在循环遍历障碍对象数组的 for 循环中:
for(int y = 2; y <= 25; y++) {
//Obstacles hit detection
for(int z = 0; z <= obstacles[x].getw(); z++) {
if(boat.getx() + y == obstacles[x].getx() + z && boat.gety() == obstacles[x].gety()) {
if(!obstacles[x].getDamaged()) {
boat.setHealth(boat.getHealth() - obstacles[x].getdmg());
obstacles[x].setDamaged(true);
}
}
}
现在它循环通过船的 x 值,从 2 到 25,而不是 0 到 27,因为两边的两个像素都没有。然后循环遍历障碍物的 x 值(xPos 到 xPos+width)并查看这些值是否匹配。如果匹配且 y 值匹配,则船将受损。请记住,只有当船位于障碍物的右侧并且障碍物的高度大于宽度时,才会发生这种情况。我没有发现我的代码有问题,但我无法为我的错误找到解决方案。谢谢。
编辑:这是船和障碍物的代码 classes.
import java.awt.Color;
import java.awt.Rectangle;
public class Obstacle {
private int dmg, xPos, yPos, height, width;
private Color color;
private boolean hasDamaged;
public Obstacle(Color hue, int damage, int x, int y, int w, int h, boolean damaged) {
dmg = damage;
xPos = x;
yPos = y;
width = w;
height = h;
color = hue;
hasDamaged = damaged;
}
public boolean getDamaged() {
return hasDamaged;
}
public void setDamaged(boolean damaged) {
hasDamaged = damaged;
}
public Color getColor() {
return color;
}
public int getdmg() {
return dmg;
}
public void setdmg(int damage) {
dmg = damage;
}
public int getx() {
return xPos;
}
public void setx(int x) {
xPos = x;
}
public int gety() {
return yPos;
}
public void sety(int y) {
yPos = y;
}
public int getw() {
return width;
}
public void setw(int w) {
width = w;
}
public int geth() {
return height;
}
public void seth(int h) {
height = h;
}
public Rectangle getBounds() {
return new Rectangle(xPos, yPos, width, height);
}
}
还有船class:
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.Rectangle;
public class Boat {
private int hp, xPos, yPos, dx;
private BufferedImage boatPic;
public Boat(BufferedImage img, int health, int x, int y, int velX) {
boatPic = img;
hp = health;
xPos = x;
yPos = y;
dx = velX;
}
public BufferedImage getImage() {
return boatPic;
}
public void setImage(BufferedImage img) {
boatPic = img;
}
public int getHealth() {
return hp;
}
public void setHealth(int health) {
hp = health;
}
public int getx() {
return xPos;
}
public void setx(int x) {
xPos = x;
}
public int gety() {
return yPos;
}
public void sety(int y) {
yPos = y;
}
public int getdx() {
return dx;
}
public void setdx(int velX) {
dx = velX;
}
public Rectangle getBounds() {
return new Rectangle(xPos, yPos, 25, 49);
}
}
如果你的船总是面向同一个方向,你可以更容易地检查碰撞。
通过为您的飞船和障碍物创建一个方法,return是一个与您的 object 大小相同的矩形。
public Rectangle getBounds() {
return new Rectangle(shipPosX, shipPosY, widht, height);
}
像这样。这样你就可以在一行中测试碰撞:
getBounds().intersects(obstacle.getBounds());
如果它们相交,这将 return 为真。
如果你想要更精确,或者想要不同方向的碰撞的不同情况,你可以为你的船的不同部分创建一个矩形,比如 body 和机翼。
public Rectangle getRightWingBound(){}
public Rectangle getLeftWindBound(){}
等等。