2016-06-02 6 views
0

私はボートオブジェクトが矢印キーを使用してランダムに配置された障害オブジェクトをかわすロービングゲームを持っています。ボートが障害物の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); 
}  
} 
+1

ボートは常に真っすぐ向いていますか?もしそうなら、これは衝突のチェックを単純化することができる。 –

+0

@TimBiegeleisenはい、私はRectangleオブジェクトを使ってヒット検出を簡略化しました。問題は、ボートが広いよりも背の高い長方形の右側だけにダメージを与えることです。これは非常に奇妙です。 – Tedion

答えて

1

あなたの船はなかれ同じ方向を向いている場合は、はるかに簡単衝突を確認することができます。

あなたの船のための方法とあなたのオブジェクトのサイズの矩形を返す障害物を作成することによって。

public Rectangle getBounds() { 
    return new Rectangle(shipPosX, shipPosY, widht, height); 
} 

このようにします。このようにして、1行で衝突をテストできます。

getBounds().intersects(obstacle.getBounds()); 

これは、交差するとtrueを返します。

もっと正確にするには、異なる方向からの衝突に対して異なるケースが必要な場合は、本体と羽のように船のさまざまな部分の四角形を作成できます。

public Rectangle getRightWingBound(){} 
public Rectangle getLeftWindBound(){} 

などとなる。

+0

ありがとうございます、これにより、コードははるかにコンパクトになりました。しかし、私はまだ彼らが広いよりも背の高いブロックの右側に問題を取得しています。私はボートの寸法が正確であることを確認したので、問題はわかりません。 – Tedion

+0

@Tedionデバッグの目的で、オブジェクトの周りに長方形を描くことができます。境界の四角形と同じパラメータを使用して、何が起こっているか把握するのに役立ちます。 – eldo

+0

@テジョンあなたが障害物と選手クラスやボートを分かち合うと、もっと助けることができます。 – eldo

関連する問題