私はボートオブジェクトが矢印キーを使用してランダムに配置された障害オブジェクトをかわすロービングゲームを持っています。ボートが障害物の1つに当たった場合、ボートはランダムなダメージを受けます。ボートは27x52の画像です(片側に2ピクセルあり、コードは2〜25です)。障害物は長方形です。Java:ヒット検出で2つのオブジェクトの重なりが正しく検出されない
私はほとんどの部分でヒット検出を行っています。しかし、ボートが幅よりも大きな矩形の右側にあるときは、ボートが矩形の右端から約5~10ピクセル離れていても、ボートはダメージを受けます。この問題をよりよく理解するには、次の画像を参照してください。http://imgur.com/pqDLMrl
私のコードでは、15の障害物の配列を作成します。障害はパラメータ(色の色、int damageDealt、int xPos、int yPos、intの幅、intの高さ、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値によって25から2 0〜27のいずれかの2つのピクセルがあるため、障害物のx値(xPos〜xPos + width)を循環し、それらの値のいずれかが一致するかどうかを調べます。一致するものがあれば、y値ボートがダメージを受けることに注意してください。これは、ボートが障害物の右側にあり、障害物がそれよりも大きい場合にのみ発生することを覚えておいてください。私の共同体に問題はありませんまだ私は私のエラーのための解決策を見つけることができません。ありがとう。
EDIT:ボートクラスと障害物クラスのコードは次のとおりです。
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);
}
}
やボートクラス:
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);
}
}
ボートは常に真っすぐ向いていますか?もしそうなら、これは衝突のチェックを単純化することができる。 –
@TimBiegeleisenはい、私はRectangleオブジェクトを使ってヒット検出を簡略化しました。問題は、ボートが広いよりも背の高い長方形の右側だけにダメージを与えることです。これは非常に奇妙です。 – Tedion