Рисование зеркальных растровых изображений в android
Я пытаюсь научиться создавать анимированный спрайт в android и не могу понять, как организовать организацию растровых изображений. У меня есть лист спрайтов моего персонажа, идущий вправо: растровое изображение пяти копий персонажа, равномерно распределенного (каждые 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);
который, похоже, не работает (не уверен, что на самом деле происходит здесь, но на моей поверхности ничего не рисуется).
Поиск в Интернете, кажется, я должен сделать копию своего оригинального растрового изображения, зеркально отобразить его с помощью матрицы преобразования, а затем использовать это растровое изображение для рисования при ходьбе влево. Однако я также нашел реализации, в которых многие мелкие объекты растрового изображения создаются из исходного листа спрайтов, сохраняются (и преобразуются для зеркального движения), а затем используются по мере необходимости.
Итак, мне интересно, что было бы лучше в этом случае или если есть какая-то разница (производительность/память):
Метод 1: Загрузите мой исходный лист спрайтов, создайте новый экземпляр растрового изображения, зеркалируйте его, затем вычислите все прямоугольники и используйте эти два целых листа для рисования (по общему признанию, есть некоторые дополнительное растровое пространство, в котором лист спрайта не используется).
Метод 2: Загрузите мой исходный лист спрайтов, для каждого кадра создайте новые два растровых объекта (1 зеркальный, 1 нормальный) и сохраните их для рисования.
Способ 3: Другие лучшие способы?
Ответы
Ответ 1
Метод 2 будет слишком дорогим, и вам не понадобится холст, чтобы перевернуть растровое изображение. Просто создайте другое растровое изображение с применением Матрицы, например:
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);
}
Ответ 2
Чтобы отразить ваш спрайт, просто примените следующее преобразование на шкале Canvas: scale (-1, 1). Вам также придется компенсировать спрайт по его ширине.
Ответ 3
Чтобы нарисовать вертикальное зеркальное растровое изображение 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 place. otherwise you will not see it
m.postTranslate(canvas.getWidth(), 0);
canvas.drawBitmap(bmp, m, p);