Рисование зеркальных растровых изображений в android

Я пытаюсь научиться делать анимированный спрайт в android и не могу понять, как организовать организацию растровых изображений. У меня есть лист спрайтов моего персонажа, идущий вправо: bitmap пяти копий персонажа, равномерно распределенного (каждые 45 пикселей), в цикле ходьбы.

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

Rect sourceRect = new Rect(0, 0, 45, 75); canvas.drawBitmap(spriteSheetBitmap, sourceRect, new Rect(0, 0, 45, 75), null); 

Затем для следующих кадров добавьте «sourceRect.x» на 45, затем перерисуйте и так далее.

Тем не менее, я теперь не уверен, как сделать, чтобы мой спрайт шел влево. Я изначально думал, что могу просто отразить свой прямоугольник, из которого я рисую, чтобы получить перевернутое изображение. Что-то вроде:

 sourceRect = new Rect(45, 0, 0, 75); 

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

Поиск в Интернете, похоже, я должен сделать копию своего оригинального растрового изображения, зеркально отобразить его с помощью матрицы преобразования, а затем использовать это bitmap для рисования при ходьбе влево. Однако я также нашел реализации, в которых многие мелкие объекты растровых изображений создаются из исходного листа спрайтов, сохраняются (и преобразуются для зеркального движения), а затем используются по мере необходимости.

Поэтому мне интересно, что было бы лучше в этом случае или если есть какая-то разница (производительность / память):

Метод 1: Загрузите на моем исходном листе спрайта, создайте новый экземпляр растрового изображения, зеркалируйте его, затем просчитайте все прямоугольники и используйте эти два целых листа для рисования (по общему признанию, имеется некоторое дополнительное растровое пространство, где лист спрайта не используется) ,

Способ 2: Загрузите в моем исходном листе спрайта, для каждого кадра создайте новые два растровых объекта (1 зеркальный, 1 нормальный) и сохраните их для рисования.

Способ 3: Другие лучшие способы?

Метод 2 будет слишком дорогим, и вам не понадобится canvas, чтобы перевернуть bitmap. Просто создайте другое bitmap с применением Матрицы, например:

 BitmapDrawable flip(BitmapDrawable d) { Matrix m = new Matrix(); m.preScale(-1, 1); Bitmap src = d.getBitmap(); Bitmap dst = Bitmap.createBitmap(src, 0, 0, src.getWidth(), src.getHeight(), m, false); dst.setDensity(DisplayMetrics.DENSITY_DEFAULT); return new BitmapDrawable(dst); } 

Чтобы отразить ваш спрайт, просто примените следующее преобразование на шкале Canvas: scale (-1, 1). Вам также придется компенсировать спрайт по его ширине.

Чтобы нарисовать вертикальный зеркальный битмап bmp на canvas :

 Matrix m = new Matrix(); // Mirror is basically a rotation m.setScale( -1 , 1 ); // so you got to move your bitmap back to it's place. otherwise you will not see it m.postTranslate(canvas.getWidth(), 0); canvas.drawBitmap(bmp, m, p); 
Interesting Posts
Давайте будем гением компьютера.