Изменить растровое изображение после рисования, но до завершения onDraw()

Я создаю самодельный игровой движок для Android, и у меня возникают проблемы с повторным использованием растрового холста:

Видимые игровые объекты получают основной холст в каждом кадре, чтобы они могли рисовать себя статическим растровым изображением или спрайтом. Пока все работает нормально.

Спрайт состоит из двух растровых изображений. Первый содержит полную последовательность рисунков, а второй динамически рисуется через файл Canvas(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() не завершится, поэтому есть ли способ решить эту проблему без перераспределения растрового изображения в каждом цикле?

Спасибо!


person Coneone    schedule 01.06.2014    source источник


Ответы (1)


После нескольких часов размышлений я решил реализовать простое решение, которое раньше не приходило мне в голову.

Как объект игры получает основной холст, почему бы не сделать то же самое со спрайтом?

Итак, в основном это код для игрового объекта:

sprite.smashDelayedCanvas(canvas, focusLocation);

И для спрайта:

canvas.drawBitmap(scaledImage, delayedIni, dest, null);
person Coneone    schedule 02.06.2014