Эффективный способ обновления / редактирования изображений в javafx - PullRequest
0 голосов
/ 07 июня 2018

У меня есть простая плиточная 2D-игра (линейные корабли). Я по умолчанию использую одно изображение для плиток игрового поля (10x10), и мне нужно обновить его, если игрок разместит корабль или атаку и так далее.Я использовал то, что я преобразовал FX-изображение в AWT-изображение, нарисовал что-то и преобразовал обратно в FX-изображение, потому что я не нашел способа нарисовать FX-изображение.Я не могу использовать canvas, потому что мне нужны функции ImageView, которые не поддерживают canvas, и преобразование изображения в canvas и обратно в изображение, вероятно, будет таким же медленным, как и мое текущее решение.(под «медленным» я подразумеваю задержку приложения на несколько секунд, когда я что-то рисую).

мой текущий код:

static Image updateBackground(Game game, ImageView image, TileEntry... entries) {
    BufferedImage img = SwingFXUtils.fromFXImage(image.getImage(), null);
    Graphics2D g = img.createGraphics();

    int imgWidth = (int) (image.getImage().getWidth() / game.getOptions().getLengthX());
    int imgHeight = (int) (image.getImage().getHeight() / game.getOptions().getLengthY());

    for(TileEntry entry : entries) {
        Vector2i pos = entry.getPos();
        Tile tile = entry.getTile();
        Bounds tileBounds = game.getController().getTileBounds(pos);

        Image source = null;

        switch (tile) {
            case SHIP:
                source = images.get(ResourceType.SHIP);
                break;
        }

        if (source != null) {

            int posX = (pos.getX() * imgWidth) - 10;
            int posY = pos.getY() * imgHeight;

            BufferedImage swingImage = SwingFXUtils.fromFXImage(source, null);
            swingImage.getScaledInstance(imgWidth, imgHeight, java.awt.Image.SCALE_DEFAULT);

            g.drawImage(swingImage, posX, posY, null);
        }
    }

    return SwingFXUtils.toFXImage(img, null);
}

РЕДАКТИРОВАТЬ:

мой код с холстом GraphicsContext

static Image updateBackground(Game game, ResizableCanvas canvas, TileEntry... entries) {
    GraphicsContext gc = canvas.getGraphicsContext2D();

    for(TileEntry entry : entries) {
        Vector2i pos = entry.getPos();
        Tile tile = entry.getTile();
        Bounds tileBounds = game.getController().getTileBounds(pos);

        switch (tile) {
            case SHIP:
                Image source = images.get(ResourceType.SHIP);
                gc.drawImage(source, tileBounds.getMinX(), tileBounds.getMinY());
                break;
            case HIT:
                gc.setStroke(javafx.scene.paint.Color.RED);
                gc.setLineWidth(10);
                gc.strokeLine(tileBounds.getMinX(), tileBounds.getMinY(), tileBounds.getMaxX(), tileBounds.getMaxY());
                gc.strokeLine(tileBounds.getMinX(), tileBounds.getMaxY(), tileBounds.getMaxX(), tileBounds.getMinY());
                break;
            case MARKED:
                gc.setStroke(javafx.scene.paint.Color.RED);
                gc.setLineWidth(10);
                gc.strokeLine(tileBounds.getMinX(), tileBounds.getMinY(), tileBounds.getMaxX(), tileBounds.getMaxY());
                gc.strokeLine(tileBounds.getMinX(), tileBounds.getMaxY(), tileBounds.getMaxX(), tileBounds.getMinY());
                break;
        }
    }

    return canvas.toImage();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...