0

そのため、ボート オブジェクトが矢印キーを使用してランダムに配置された障害物オブジェクトをかわす必要があるローイング ゲームがあります。ボートが障害物にぶつかると、ランダムな量のダメージを受けます。ボートは 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);
                            }
                      }             
                }

現在、どちらの側にも何もない 2 つのピクセルがあるため、ボートの x 値を 0 から 27 ではなく 2 から 25 に切り替えています。次に、障害物の x 値 (xPos から xPos+width) を循環し、それらの値のいずれかが一致するかどうかを確認します。一致があり、y 値が一致する場合、ボートはダメージを受けます。これは、ボートが障害物の右側にあり、障害物が幅よりも高さが高い場合にのみ発生することに注意してください。コードに問題はありませんが、エラーの解決策がわかりません。ありがとう。

編集: ボートと障害物クラスのコードは次のとおりです。

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);
}    
}
4

1 に答える 1

1

船が常に同じ方向を向いていれば、衝突を簡単に確認できます。

オブジェクトのサイズの長方形を返す、船と障害物用のメソッドを作成します。

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

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

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

それらが交差する場合、これは true を返します。

より正確にしたい場合、またはさまざまな方向からの衝突のさまざまなケースが必要な場合は、船体や翼など、船のさまざまな部分に長方形を作成できます。

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

等々。

于 2016-06-02T07:01:10.190 に答える