【问题标题】:Modify bitmap after being drawn but before onDraw() finishes在绘制后但在 onDraw() 完成之前修改位图
【发布时间】:2014-07-21 10:50:35
【问题描述】:

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

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

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

我为每个需要相同绘图序列的对象重复使用这些精灵。这个精灵也有一个功能,允许获得一个包含不同位置的绘图序列的位图。因此,如果对象想要精灵在另一个位置调用它的函数来获取位图并绘制到主画布。

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

  • 在可见的游戏对象中:

    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() 完成之前不会绘制所有位图,那么有没有办法在不重新分配每个循环中的位图的情况下解决这个问题?

谢谢!

【问题讨论】:

    标签: android android-canvas draw android-bitmap


    【解决方案1】:

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

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

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

    sprite.smashDelayedCanvas(canvas, focusLocation);
    

    对于精灵:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-07
      • 2014-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多