【问题标题】:Frame an image: How to make a shape's dimensions fit around an image?构图:如何使形状的尺寸适合图像?
【发布时间】:2026-02-08 08:20:02
【问题描述】:

我正在制作一个基于 JavaFX 的游戏,该游戏使用宇宙飞船射击无人机来保卫你的基地。我想在图像周围包裹一个形状来为它创建一个碰撞箱。

这将允许激光在无人机接触碰撞箱时对其造成伤害。它将使游戏看起来比激光击中不可见的墙壁(形状的尺寸)更好,而不是实际的图像。

我的问题是,有没有 JavaFX 提供的内置库来解决这个问题,还是必须使用微积分公式来解决这个问题?

我试图查看 JavaFX 的 API,但似乎找不到任何有用的东西。

// Getting the images for the shapes
Image spaceCity = new Image("com/images/spaceCity.jpg");
Image spaceShip = new Image("com/images/spaceShip.png");

// Making the graphics
Rectangle space_Ship = new Rectangle(0, positionOfShipY, 191, 300);
Rectangle background = new Rectangle(0, 0, STAGE_WIDTH, STAGE_HEIGHT);

我这里有我的例子(我不知道为什么堆栈溢出不允许我上传图片):

https://docs.google.com/document/d/1A8HJ61jhthBhd7wr6xrZNLlsTcQJNLUhTzrucvNY3BY/view?usp=sharing

【问题讨论】:

  • 如果您使用带有不可见背景的png 会发生什么?
  • 澄清一下,船在背景之上,它周围的红框(在谷歌文档截图中)并不是实际的形状尺寸。船的背景已经看不见了。这不是我需要为它做这件事的船,而是我尚未为其添加图像的无人机。船会开枪。
  • 飞船将使用 PathTransition 对象将激光(矩形)移向目标。

标签: java image javafx shapes game-development


【解决方案1】:

根据图像设置形状的尺寸,并将两者放在StackPane中:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

public class FxTest extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{

        String imagePath = "https://png.pngtree.com/png-clipart/20190118/ourmid/"
                          + "pngtree-hand-drawn-spaceship-grey-spaceship-alien-spaceship-blue"
                          + "-spaceship-border-png-image_450067.jpg";
        Image image =  new Image(imagePath);
        Rectangle rec = new Rectangle(0, 0, 50+image.getWidth(), 50+image.getHeight());
        rec.setFill(Color.AQUA);

        StackPane root = new StackPane();
        root.getChildren().add(rec);
        root.getChildren().add(new ImageView(image));
        Scene scene = new Scene(root);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(null);
    }
} 

【讨论】:

    【解决方案2】:

    您可以使用DropShadow 在您的宇宙飞船图像周围绘制边框:

    Image image = new Image("/path/to/image.png");
    ImageView imageView = new ImageView(image);
    DropShadow ds = new DropShadow();
    ds.setColor(Color.RED);
    ds.setSpread(10);
    imageView.setEffect(ds);
    

    【讨论】:

    • 问题是,它不能用于形状,因为它使用 setFill() 方法。 JavaFX API 中的不同文件夹。
    最近更新 更多