Просьба указать причину отстутствия анимированного спрайта на экране
В чём причина отстутствия анимированного спрайта на экране
Уважаемые J2ME-User'ы. С учётом того, что Eclipse показывает чистый код, реализация анимированного спрайта на экране мобильного телефона, после прочтения соответствующего материала в книгах по J2ME, результата не показала. По этой причине прошу объяснить причину в программном коде, блокирующая реализацию данной задачи. Спрайт содержит 8 кадров, каждый по 23х28. Горизонтальное расположение. С уважением MidletUser Программный код import java.io.IOException; import javax.microedition.lcdui.Display; import javax.microedition.midlet.*; public class MyMidlet extends MIDlet { Display display; MyGameCanvas mygamecanvas; public MyMidlet() throws IOException{ display = Display.getDisplay(this); mygamecanvas = new MyGameCanvas(); } protected void destroyApp(boolean arg0) throws MIDletStateChangeException { // TODO Auto-generated method stub } protected void pauseApp() { // TODO Auto-generated method stub } protected void startApp() throws MIDletStateChangeException { mygamecanvas.setFullScreenMode(true); display.setCurrent(mygamecanvas); // TODO Auto-generated method stub } } import java.io.IOException; import javax.microedition.lcdui.game.*; import javax.microedition.lcdui.*; import javax.microedition.io.*; public class MyGameCanvas extends GameCanvas implements Runnable { Graphics g; boolean working; Thread thread; LayerManager layermanager; Sprite mysprite; Image image2; public MyGameCanvas() throws IOException{ super(true); working = true; thread = new Thread(this); thread.start(); } public void run() { try { image2 = Image.createImage("/animated_sprite.png"); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } mysprite = new Sprite ( image2, 23, 28 ) ; mysprite.defineReferencePixel(0, 0); mysprite.setPosition(10, 10); layermanager = new LayerManager(); layermanager.append(mysprite); g = getGraphics(); if(working){ layermanager.paint(g, 0, 0); mysprite.paint(g); mysprite.nextFrame(); flushGraphics(); repaint(); try { Thread.sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } // TODO Auto-generated method stub } public void paint(Graphics g){ g.setColor(255, 255, 255); g.fillRect(0, 0, 240, 320); int [] sequence = {0,1,2,3,4,5,6,7}; mysprite.setFrameSequence(sequence); mysprite.nextFrame(); } } |
Ответ: Просьба указать причину отстутствия анимированного спрайта на экране
Попробуй рисовать спрайт прямо в функции paint(), а не вне ее.
|
Ответ: Просьба указать причину отстутствия анимированного спрайта на экране
Уважаемый Romanzes,
воспользовавшись Вашим советом, могу сказать, что появление спрайта в анимированном виде, к результату не привело, однако часть задачи, выполнена. Спрайт виден на экране. В чём тогда дело, что данный спрайт ведёт себя так, что он виден в неанимированном виде, а должен показывать 8 кадров согласно поставленной задачи. |
Ответ: Просьба указать причину отстутствия анимированного спрайта на экране
|
Ответ: Просьба указать причину отстутствия анимированного спрайта на экране
замени строчку
Код:
if (working) { Код:
while (working) { |
Ответ: Просьба указать причину отстутствия анимированного спрайта на экране
Уважаемый Romanzes,
после замены if на while, на экране виден только тот же самый первый кадр спрайта, однако он стал виден с многократным повтором его мерцания на экране, и это при том, что в программный код был включён метод flushGraphics(); Так что задача остаётся той же, программный код не хочет себя вести должным образом. И снова тот же вопрос, почему? |
Ответ: Просьба указать причину отстутствия анимированного спрайта на экране
Код:
int [] sequence = {0,1,2,3,4,5,6,7}; Убери вот эти 2 строчки из отрисовки и поставь их до цикла while(working). |
Ответ: Просьба указать причину отстутствия анимированного спрайта на экране
Заработало. Но должен сказать, что мерцание осталось прежним. Да я понимаю, что 8 кадров при 10 миллисекунд остановки потока не вариант для хорошего анимированного спрайта, понимая что в 1 секунду должно быть не менее 24-25 кадров у спрайта, всё таки, ставлю вопрос мерцания данного спрайта. Поскольку был применён сетод flushGraphics() в самом потоке; Неужели Sun разработчики подобного методом flushGraphics() не предусмотрели, в случаях со спрайтами с менее 24-25 кадров в секунду. А вот относительно массива и метода установки очерёднеости воспроизведения очереди кадров, видимо следует смотреть в самом классе Thread, разработанном самими Sun разработчиками, чтобы понять, почему же массив, включенный, в сам поток, ведёт себя несколько иначе, как полагалось, не уже ли массив, внесённый в поток, начинает запись с такой скоростью, что практически не заметно, отображение остальных кадров, или что же там происходит в конце концов. Стоит ли произвести отладку массива int [] sequence, и проверить его на значение в самом цикле while(working). Вот это для меня остаётся загадкой.
|
Ответ: Просьба указать причину отстутствия анимированного спрайта на экране
Господин MidletUser, не соблаговолите ли вы быть любезным изъясняться не столь изощренно и вычурно?
Чтобы избавиться от мерцания, можно создать изображение imgBuffer размером с экран, получить его Graphics и отрисовывать все туда. А в paint() поставить строчку g.drawImage(imgBuffer, 0, 0, 0); |
Ответ: Просьба указать причину отстутствия анимированного спрайта на экране
Уважаемый MidletUser, вынужден заметить, что ввиду наличия немалого количества грамматических, лексических и орфографических ошибок в Ваших сообщениях, Вам было бы лучше воздержаться от подобного стиля изложения своих мыслей.
|
Часовой пояс GMT +4, время: 21:30. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot