1

ゲームの有効な解決策を見つけるために、本当に助けが必要です。ゲームはほぼ完成しましたが、ゲーム内の壁がまだ正常に機能していません。

この問題の解決策をインターネットで見つけようとしましたが、壁 (別の長方形) と衝突する直前に長方形を止める簡単な方法をまだ見つけていません。

現在、プレイヤーの四角形と壁の四角形の間に衝突検出を実装し、移動を停止しましたが、壁にぶつかると壁の内側に引っかかってしまいます。

まだ動けるように、直前で停止させたい。これまでにこれを行ったコードは次のとおりです。

パックマンクラス

public class Pacman {

private String pacmanup = "pacmanup.png";
private String pacmandown = "pacmandown.png";
private String pacmanleft = "pacmanleft.png";
private String pacmanright = "pacmanright.png";

private int dx;
private int dy;
private int x;
private int y;
private int width;
private int height;
private boolean visible;

private Image imageup;
private Image imagedown;
private Image imageleft;
private Image imageright;

public Pacman() {

    ImageIcon i1 = new ImageIcon(this.getClass().getResource(pacmanup));
    imageup = i1.getImage();

    ImageIcon i2 = new ImageIcon(this.getClass().getResource(pacmandown));
    imagedown = i2.getImage();

    ImageIcon i3 = new ImageIcon(this.getClass().getResource(pacmanleft));
    imageleft = i3.getImage();

    ImageIcon i4 = new ImageIcon(this.getClass().getResource(pacmanright));
    imageright = i4.getImage();

    width = imageup.getWidth(null);
    height = imageup.getHeight(null);
    visible = true;
    x = 270;
    y = 189;

}

public int getDx() {
    return dx;
}

public void setDx(int dx) {
    this.dx = dx;
}

public int getDy() {
    return dy;
}

public void setDy(int dy) {
    this.dy = dy;
}

public int getX() {
    return x;
}

public int getY() {
    return y;
}

public void setX(int x) {
    this.x = x;
}

public void setY(int y) {
    this.y = y;
}

public Image getImageup() {
    return imageup;
}

public Image getImagedown() {
    return imagedown;
}

public Image getImageleft() {
    return imageleft;
}

public Image getImageright() {
    return imageright;
}

public void setVisible(boolean visible) {
    this.visible = visible;
}

public boolean isVisible() {
    return visible;
}

public Rectangle getBounds() {
    return new Rectangle(x, y, width, height);
}

public void move() {

    x += dx;
    y += dy;
}

public void keyPressed(KeyEvent e) {

    int key = e.getKeyCode();

    if (key == KeyEvent.VK_LEFT) {
        dx = -2;
        dy = 0;
    }

    if (key == KeyEvent.VK_RIGHT) {
        dx = 2;
        dy = 0;
    }

    if (key == KeyEvent.VK_UP) {
        dx = 0;
        dy = -2;
    }

    if (key == KeyEvent.VK_DOWN) {
        dx = 0;
        dy = 2; 
    }
}

ここでは Rectangle getBounds メソッドを作成しました。これを使用して pacman の長方形を作成し、その上に画像を配置します。

バリアクラス・ウォールクラス

public class Barrier {

private String barrier = "barrier.png";

private int x;
private int y;
private int width;
private int height;
private boolean visible;
private Image image;

public Barrier(int x, int y) {
    ImageIcon ii = new ImageIcon(this.getClass().getResource(barrier));
    image = ii.getImage();      
    width = image.getWidth(null);
    height = image.getHeight(null);
    visible = true;
    this.x = x;
    this.y = y;
}

public int getX() {
    return x;
}

public int getY() {
    return y;
}

public boolean isVisible() {
    return visible;
}

public void setVisible(Boolean visible) {
    this.visible = visible;
}

public Image getImage() {
    return image;
}

public Rectangle getBounds() {
    return new Rectangle(x, y, width, height);
}

このクラスには、衝突を検出するために使用する Rectangle getBounds クラスもあります。

私が示す最後のコードは、これまでの衝突検出の方法です。

Board クラス内のコード

Rectangle r3 = pacman.getBounds();

 for (int j = 0; j<barriers.size(); j++) {
        Barrier b = (Barrier) barriers.get(j);
        Rectangle r4 = b.getBounds();

        if (r3.intersects(r4)) {
            System.out.println("Wall hit");
            pacman.setDx(0);
            pacman.setDy(0);
        }
    }

r3 と r4 の間に衝突が発生した場合、Dx と Dy を 0 に設定します。別の解決策を見つけて、衝突を検出しますが、壁の内側で立ち往生することはありません。方法がわからない:/

誰かが助けてくれることを願っています。

4

1 に答える 1