Intereting Posts
Аппаратное обеспечение сканера отпечатков пальцев Marshmallow Запутанный с тестом Google Приложение Android в Eclipse: отредактируйте текст, не отображающийся на графическом макете Как использовать шквал в приложении? Диалоговое окно GUI пользовательского распознавания голоса Android Android Как установить 2 xml для LinearLayout Как избавиться от «Это приложение заставляет ваше устройство работать медленно» уведомление (время разработки приложения)? Ошибка: идентификатор ресурса не найден для атрибута 'adSize' в пакете 'com.google.example' main.xml Не получать OnItemClick Событие ListView Как запустить функцию андроида каждые 15 минут, и особенно на 15-минутной отметке каждый день? Объединение Spannable с String.format () Android 2.2 и «Плохое семейство адресов» на Socket Connect Ошибка setPreviewTexture в устройстве MTK Обработать значение предпочтения перед сохранением в Android? Руководства пользователя для Android Honeycomb на планшетах

Sprite Rotation в Android с помощью Canvas.DrawBitmap. Я близка, что я делаю неправильно?

У меня есть этот алгоритм вращения sprite (его плохо названный и просто используемый для тестирования). Он настолько близок, что спрайты с ним вращаются. Everyframe Я могу добавить +5 градусов к нему и посмотреть, как мой красивый маленький спрайт вращается вокруг. Проблема в том, что теперь нарисован другой материал, нарисованный на холсте. Если я не делаю вращения, регулярные рисованные спрайты отлично работают. Я думаю, что я близка, но я просто не знаю, какую часть мне не хватает. Ниже приведены мои два метода «Draw_Sprite»: один только рисует ранее загруженный бит растровый файл на холст, прошедший в. Другой, делает какое-то вращение наилучшим образом, я знаю, как вращать спрайт на так много градусов … и затем нарисовать его , Если у меня есть хороший игровой цикл, который рисует несколько объектов, один тип – это повернутый вид. Затем невращающиеся спрайты мерцают, и все же вращение спрайта никогда не происходит. Хотя, если я сначала рисую невращающиеся спрайты, все хорошо, но тогда Z-Ordering может быть испорчен (спрайты поверх элементов пользовательского интерфейса и т. Д.) … Определения методов:

/************************************************* * rotated sprite, ignore the whatever, its for ease of use and testing to have this argument list * @param c canvas to draw on. * @param whatever ignore * @param rot degrees to rotate * @return */ public int Draw_Sprite(Canvas c, int whatever, int rot) { //rotating sprite Rect src = new Rect(0, 0, width, height); Rect dst = new Rect(x, y, x + width, y + height); Matrix orig = c.getMatrix(); mMatrix = orig; orig.setTranslate(0, 0); orig.postRotate(rot, x+width/2, y+height/2); c.setMatrix(orig); c.drawBitmap(images[curr_frame], src, dst, null); c.setMatrix(mMatrix); //set it back so all things afterwards are displayed correctly. isScaled=false; return 1; } /******************************************************** * draw a regular sprite to canvas c * @param c * @return */ public int Draw_Sprite(Canvas c) { Rect src = new Rect(0, 0, width, height); Rect dst = new Rect(x, y, x + width, y + height); c.drawBitmap(images[curr_frame], src, dst, null); isScaled=false; return 1; } 

И теперь использование:

 void onDraw(Canvas c) { canvas.drawRect( bgRect, bgPaint); //draw the background //draw all game objects // draw the normal items for (GameEntity graphic : _graphics) { graphic.toScreenCoords((int)player_x, (int)player_y); if(graphic.getType().equals("planet")) //draw planets graphic.Draw_Sprite(canvas); //before the rotation call draws fine else { //rotate all space ships every frame so i see them spinning //test rotation mRot +=5; if(mRot>=360) mRot=0; graphic.Draw_Sprite(canvas, 0, mRot); //yes function name will be better in future. this rotates spins draws fine } } thePlayer.Draw_Sprite(canvas); //FLICKERS drawUI(canvas);//all things here flickr } 

Таким образом, он делает это, вещи после вызова вращательной ничьей рисуются правильно. Но проблема в том, что это flickrs. Теперь можно сказать, что я должен просто сделать все свои невращательные вещи и сохранить это последнее, но zordering не будет … предложения относительно того, как решить эту проблему zordering или мерцания?

Solutions Collecting From Web of "Sprite Rotation в Android с помощью Canvas.DrawBitmap. Я близка, что я делаю неправильно?"

Попробуйте использовать canvas.save () перед вращением и canvas.restore () после завершения обработки.

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

Просто для следующего парня, который может это прочитать. Вы можете сделать это только с несколькими строками кода:

 canvas.save(); canvas.rotate(rotation_angle, x + (widthofimage / 2), y + (heightofimage / 2)); canvas.drawBitmap(bitmap, x, y, null); canvas.restore();