在绘制之后但在onDraw()完成之前修改位图

时间:2014-06-01 00:02:10

标签: android android-canvas draw android-bitmap

我正在为Android创建一个自制的游戏引擎,我在重用Bitmap画布时遇到了一些问题:

可见的游戏对象在每个帧中接收主Canvas,因此他们可以使用静态位图或精灵来绘制自己。到目前为止一切正常。

精灵包含两个位图。首先包含完整的绘图序列,第二个是通过Canvas(bitmap)动态绘制的。结果位图及其画布在sprite构造函数中创建,以避免在draw循环中重新分配。

我为每个需要相同绘图序列的对象重用这些精灵。该精灵还具有允许获得包含绘图序列的不同位置的位图的功能。所以,如果对象希望精灵在另一个位置调用它的函数来获取Bitmap并绘制到主画布。

所以问题是所有使用相同精灵的对象最终会绘制相同的图像。

  • 在可见游戏对象中:

    if(spriteDelay > 0) img = sprite.getDelayedBitmap(spriteDelay); else img = sprite.getCurrentBitmap(); canvas.drawBitmap(img, null, focusLocation, null);

  • 在精灵中:

    currentBmpCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); currentBmpCanvas.drawBitmap(scaledImage, delayedIni, fin, null); return currentBmp;

如果我在返回函数中创建一个新的结果位图和一个新画布,那么一切正常:

currentBmp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
currentBmpCanvas = new Canvas(currentBmp);

我假设在onDraw()完成之前不会绘制所有位图,所以有没有办法在不重新分配每个循环中的位图的情况下解决这个问题?

谢谢!

1 个答案:

答案 0 :(得分:1)

经过几个小时的思考,我选择实施一个简单的解决方案,而这个解决方案之前并没有让我想到。

就像对象游戏接收主画布一样,为什么不对精灵做同样的事情呢?

基本上这是游戏对象的代码:

sprite.smashDelayedCanvas(canvas, focusLocation);

对于精灵:

canvas.drawBitmap(scaledImage, delayedIni, dest, null);