Подтвердить что ты не робот

Рисование зеркальных растровых изображений в 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: Другие лучшие способы?

4b9b3361

Ответ 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);