我有一个Entity对象列表,我想在画布上使用Graphics2D对象绘制所有对象,但是如果它们位于相同位置,则必须绘制其他对象,我有一个这样的解决方案:
for(Entity e : cloneEntities)
if (e instanceof Dirty) e.render(g);
for(Entity e : cloneEntities)
if (e instanceof Box) e.render(g);
for(Entity e : cloneEntities)
if (e instanceof RunObstacle) e.render(g);
但它看起来很大。任何人都有其他解决方案吗?提前谢谢!
答案 0 :(得分:1)
您可以按类型排序cloneEntities
(您可能需要自定义Comparator来指定排序),然后按顺序渲染它们。这可以做同样的事情,但可能会保存一些计算。
答案 1 :(得分:1)
与@ patrick-hainge的答案类似,您可以在Entity
中添加名为z-index
的{{1}}字段,该字段在{{1}的构造函数中设置}}。因此,您的子构造函数将需要向其发送值。
然后你就可以在调用每个像这样的渲染之前对int
列表进行排序:
Entity
注意强>
仅当cloneEntities
被声明为clonedEntities.stream().sort((a,b)->a.getZindex()-b.getZindex()).forEach((a)->a.render(g));
而非cloneEntities
答案 2 :(得分:0)
可能最好的解决方案是为Front,Middle和Background创建一些BufferedImages:
BufferedImage dirties = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
Buffered Image boxes = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB)
BufferedImage obstacles = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
for(Entity e : cloneEntities){
if (e instanceof Dirty) e.render(dirties.getGraphics());
if (e instanceof Box) e.render(boxes.getGraphics());
if (e instanceof RunObstacle) e.render(obstacles.getGraphics());
}
//And then render all Layers
g.drawImage(dirties, 0, 0, width, height, null);
g.drawImage(boxes, 0, 0, width, height, null);
g.drawImage(obstacles, 0, 0, width, height, null);