Установка границ для камеры игрока для предотвращения выхода растра за границы при использовании его с getSubImage () карты - PullRequest
0 голосов
/ 07 ноября 2019

Карта используется для создания миникарты, которая вызывается в методе класса Handler renderMap, чтобы можно было визуализировать объекты и спрайты для игры. playerCameraL / R настроен так, чтобы получить разделенный вид из стороны в сторону карты, которая будет мини-картой, и увеличить его до размера экрана. Затем я отрисовываю миникарту и устанавливаю ее в нижнюю середину экрана.

Проблема, которую я не могу полностью понять, заключается в этой ошибке:

Exception in thread "Thread-0" java.awt.image.RasterFormatException: (x + width) is outside raster
    at java.desktop/sun.awt.image.IntegerInterleavedRaster.createWritableChild(IntegerInterleavedRaster.java:463)
    at java.desktop/java.awt.image.BufferedImage.getSubimage(BufferedImage.java:1202)
    at Game.Game.render(Game.java:169)

Из вопросов, которые я видел, задают другие, эта ошибка связана с тем, что значение x выходит за пределы изображения,Но из того, что я могу сказать, это, похоже, не так. Я также позаботился о том, чтобы использовать ширину, равную половине экрана, поскольку я делю его пополам для игрока 1 и игрока 2. По этой же причине высота все еще устанавливается в gameHeight. Я также предоставил класс Camera для справки о том, как проверяются границы.

map = (BufferedImage) createImage(1280, 1280);
graphic = map.createGraphics();

// calls on renderMap method in the handler class
display.renderMap(1280, 720, graphic);
background = (BufferedImage) createImage(1280, 720);
graphic = background.createGraphics();

// c1 and c2 were given x and y value of (0,0)
c1.tick(handler.getTank(ID.Player));
c2.tick(handler.getTank(ID.Player2));

playerCameraL = map.getSubimage((int) c1.getX(), (int) c1.getY(), 640, gameHeight);
(line->169) playerCameraR = map.getSubimage((int) c2.getX(), (int) c2.getY(), 640, gameHeight);

graphic.drawImage(playerCameraL,0,0,this);
graphic.drawImage(playerCameraR,640,0,this);

graphic.drawImage(map, 550, 530, 200, 200, this);

graphic.dispose();

g.drawImage(background, 0, 0, this);

// without this call the two players don't show up on the screen
handler.render(g);

// Camera Class //
public class Camera {

    private float x, y;

    public Camera(float x, float y) {
        this.x = x;
        this.y = y;
    }

    public void tick(Tank object) {
        System.out.println(x);
        x += ((object.getX() - x) - 640 / 2) * 0.05f;
        System.out.println(x);
        System.out.println(y);
        y += ((object.getY() - y) - 720 / 2) * 0.05f;
        System.out.println(y);
        if (x <= 0) x = 0;
        if (x >= (1280)) x = (1280);
        if (y <= 0) y = 0;
        if (y >= 720) y = 720;

    }

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

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

    public float getX() {
        return x;
    }

    public float getY() {
        return y;
    }
}
...