使用 Graphics2D Area 的替代方案?

Alternative to using Graphics2D Area?

我正在制作一款游戏,您可以从绘制地图开始。目前它的工作原理是有一个 Area 实例变量,然后当玩家 clicks/drags 鼠标时,它会向其添加 Ellipse2Ds。这就是我的意思:

Area land = new Area();

然后在MouseDragged方法中

Point2D mouse = e.getPoint();
Ellipse2D ter = new Ellipse2D.Double(mouse.getX() - drawRad, mouse.getY() - drawRad, drawRad*2, drawRad*2);

land.add(new Area(ter));

然后基本相同,除了land.subtract(new Area(ter))用于擦除。

我的问题是在画了很多之后画 Area 变得很慢。另一个问题是我希望能够轻松地获得绘图的轮廓,但我还没有找到使用 Areas 的好方法。使用 area.getPathIterator 不够准确。

所以我想知道还有哪些保存图纸的方法?我不能只有一个 Ellipse 数组,因为这样擦除就不起作用了。

谢谢!

如果您一遍又一遍地绘制相同的东西,可能值得将其绘制到图像一次或在启动时从文件加载它,然后只绘制图像而不是绘制所有单独的形状。

要从文件加载,请将图片文件放在与 .java 文件相同的目录中并加载:

 BufferedImage img  = ImageIO.read(this.getClass().getResource("picture.png"));

要在图像上绘制一次:

BufferedImage img  = new BufferedImage(width,height, BufferedImage.TYPE_4BYTE_ABGR);
Graphics2D g = img.createGraphics();

在您的 paintComponent 方法中,您在某处绘制图像。

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

如果你有一些东西在背景上移动,而不是添加和减去移动的项目。只需绘制背景,然后绘制移动的东西,绘制背景将以更少的计算量有效地消除旧位置。