用Java在Canvas上绘制东西

时间:2017-05-04 18:26:06

标签: java canvas draw

我有一个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);

但它看起来很大。任何人都有其他解决方案吗?提前谢谢!

3 个答案:

答案 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);

此解决方案是Multiple independent layers in Graphics