У меня есть простая плиточная 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();
}