|
Программирование Вопросы связанные с программированием в JAVA |
30.09.2011, 17:20
|
#1
|
AnyKey`щик
Регистрация: 11.08.2011
Сообщений: 8
Написано одно полезное сообщение
|
Просьба указать причину отстутствия анимированного спрайта на экране
В чём причина отстутствия анимированного спрайта на экране
Уважаемые 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();
}
}
Последний раз редактировалось MidletUser, 30.09.2011 в 19:58.
|
(Offline)
|
|
01.10.2011, 01:20
|
#2
|
Разработчик
Регистрация: 06.04.2008
Сообщений: 541
Написано 196 полезных сообщений (для 638 пользователей)
|
Ответ: Просьба указать причину отстутствия анимированного спрайта на экране
Попробуй рисовать спрайт прямо в функции paint(), а не вне ее.
|
(Offline)
|
|
01.10.2011, 03:20
|
#3
|
AnyKey`щик
Регистрация: 11.08.2011
Сообщений: 8
Написано одно полезное сообщение
|
Ответ: Просьба указать причину отстутствия анимированного спрайта на экране
Уважаемый Romanzes,
воспользовавшись Вашим советом, могу сказать, что появление спрайта в анимированном виде, к результату не привело, однако часть задачи, выполнена. Спрайт виден на экране. В чём тогда дело, что данный спрайт ведёт себя так, что он виден в неанимированном виде, а должен показывать 8 кадров согласно поставленной задачи.
|
(Offline)
|
|
01.10.2011, 11:20
|
#4
|
Мастер
Регистрация: 27.01.2008
Адрес: Россия, СКФО, ЧР, Грозный
Сообщений: 1,144
Написано 578 полезных сообщений (для 2,207 пользователей)
|
Ответ: Просьба указать причину отстутствия анимированного спрайта на экране
лол, где ты так научился писать? тоже хотеть так писать
|
(Offline)
|
|
01.10.2011, 13:10
|
#5
|
Разработчик
Регистрация: 06.04.2008
Сообщений: 541
Написано 196 полезных сообщений (для 638 пользователей)
|
Ответ: Просьба указать причину отстутствия анимированного спрайта на экране
|
(Offline)
|
|
01.10.2011, 14:58
|
#6
|
AnyKey`щик
Регистрация: 11.08.2011
Сообщений: 8
Написано одно полезное сообщение
|
Ответ: Просьба указать причину отстутствия анимированного спрайта на экране
Уважаемый Romanzes,
после замены if на while, на экране виден только тот же самый первый кадр спрайта, однако он стал виден с многократным повтором его мерцания на экране, и это при том, что в программный код был включён метод flushGraphics(); Так что задача остаётся той же, программный код не хочет себя вести должным образом. И снова тот же вопрос, почему?
|
(Offline)
|
|
01.10.2011, 17:01
|
#7
|
Разработчик
Регистрация: 06.04.2008
Сообщений: 541
Написано 196 полезных сообщений (для 638 пользователей)
|
Ответ: Просьба указать причину отстутствия анимированного спрайта на экране
int [] sequence = {0,1,2,3,4,5,6,7};
mysprite.setFrameSequence(sequence);
Уважаемый MidletUser,
Убери вот эти 2 строчки из отрисовки и поставь их до цикла while(working).
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
01.10.2011, 19:40
|
#8
|
AnyKey`щик
Регистрация: 11.08.2011
Сообщений: 8
Написано одно полезное сообщение
|
Ответ: Просьба указать причину отстутствия анимированного спрайта на экране
Заработало. Но должен сказать, что мерцание осталось прежним. Да я понимаю, что 8 кадров при 10 миллисекунд остановки потока не вариант для хорошего анимированного спрайта, понимая что в 1 секунду должно быть не менее 24-25 кадров у спрайта, всё таки, ставлю вопрос мерцания данного спрайта. Поскольку был применён сетод flushGraphics() в самом потоке; Неужели Sun разработчики подобного методом flushGraphics() не предусмотрели, в случаях со спрайтами с менее 24-25 кадров в секунду. А вот относительно массива и метода установки очерёднеости воспроизведения очереди кадров, видимо следует смотреть в самом классе Thread, разработанном самими Sun разработчиками, чтобы понять, почему же массив, включенный, в сам поток, ведёт себя несколько иначе, как полагалось, не уже ли массив, внесённый в поток, начинает запись с такой скоростью, что практически не заметно, отображение остальных кадров, или что же там происходит в конце концов. Стоит ли произвести отладку массива int [] sequence, и проверить его на значение в самом цикле while(working). Вот это для меня остаётся загадкой.
|
(Offline)
|
|
01.10.2011, 22:48
|
#9
|
Разработчик
Регистрация: 06.04.2008
Сообщений: 541
Написано 196 полезных сообщений (для 638 пользователей)
|
Ответ: Просьба указать причину отстутствия анимированного спрайта на экране
Господин MidletUser, не соблаговолите ли вы быть любезным изъясняться не столь изощренно и вычурно?
Чтобы избавиться от мерцания, можно создать изображение imgBuffer размером с экран, получить его Graphics и отрисовывать все туда. А в paint() поставить строчку g.drawImage(imgBuffer, 0, 0, 0);
|
(Offline)
|
|
01.10.2011, 23:24
|
#10
|
Дэвелопер
Регистрация: 21.11.2009
Адрес: Афула
Сообщений: 1,700
Написано 658 полезных сообщений (для 1,963 пользователей)
|
Ответ: Просьба указать причину отстутствия анимированного спрайта на экране
Уважаемый MidletUser, вынужден заметить, что ввиду наличия немалого количества грамматических, лексических и орфографических ошибок в Ваших сообщениях, Вам было бы лучше воздержаться от подобного стиля изложения своих мыслей.
__________________
kali surgeon
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 18:33.
|