现在我需要在现有的Canvas
(父Canvas
)中绘制新的Canvas
,就像Bitmap
的作品一样。
逻辑是:
Sprite
可以拥有其他Sprite
个节点(LinkedList<Sprite> nodes
); 如果没有节点(nodes = null
)那么,将(Bitmap) Sprite.image
直接绘制到父画布,在update
方法上接收,就像(当前正在工作):
public void update(Canvas canvas){
if(this.nodes == null){
canvas.drawBitmap(this.image, ...);
}
...
}
如果它有节点,我需要创建一个新的Canvas
,在此上绘制节点位图,并在父Canvas
上绘制新的Canvas
。这不起作用,但这个想法是这样的:
public void update(Canvas canvas){
...
else { // this.nodes != null
Canvas newCanvas = new Canvas();
for(Sprite node: this.nodes){
node.update(newCanvas);
}
// Canvas working like Bitmap! (?)
canvas.drawCanvas(newCanvas, this.x, this.y, this.paint);
}
}
真实示例用法:好吧,我有Sprite
名为CarSprite
。 CarSprite
有一个名为WheelSprite extends Sprite
的私有类。 CarSprite
实现了WheelSprite
的两个节点(二维示例),这些节点将位于CarSprite
中,似乎是汽车的轮廓。到目前为止,没问题。
但如果CarSprite
受到关卡中某个对象的影响,则会转为透明。例如,我会做objectOfCarSprite.paint.setAlpha(127);
。问题是,如果我这样做(当前正在工作模式),只有汽车位图会变得透明,而不是井,因为它是直接绘制到全局{{ 1}}对象。
此部分影响不大:目前,我正在获取父(父N)Canvas
对象alpha,并且通过一些数学计算,我得到了一个透明的解决方案对于我需要的几乎同样有效的滚轮,但是,例如,如果Paint
对象超过汽车位图,则可以看到汽车的地面,如图片。
存在一种更好的方式来执行,就像我想要的,或者只有就像当前的工作一样?
答案 0 :(得分:2)
我做到了。但是很慢,但工作正常。
final Bitmap split = Bitmap.createBitmap(GameActivity.screenWidth,
GameActivity.screenHeight,
Bitmap.Config.ARGB_8888);
final Canvas subCanvas = new Canvas(split);
for(final Sprite sprite: this.nodes) {
sprite.update(subCanvas);
}
canvas.drawBitmap(split, this.x, this.y, this.paint);
Canvas
对象(此处只是canvas
); Bitmap
我们将绘制的地方。这需要从当前width
获得height
和canvas
。我在这个案例中使用了一个快捷方式; Canvas
,它会传递给Sprite.nodes
; 注意:这种效果非常好,但影响速度很快。