forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Программирование (http://forum.boolean.name/forumdisplay.php?f=54)
-   -   Просьба указать причину отстутствия анимированного спрайта на экране (http://forum.boolean.name/showthread.php?t=15567)

MidletUser 30.09.2011 17:20

Просьба указать причину отстутствия анимированного спрайта на экране
 
В чём причина отстутствия анимированного спрайта на экране

Уважаемые 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();





}

}

Romanzes 01.10.2011 01:20

Ответ: Просьба указать причину отстутствия анимированного спрайта на экране
 
Попробуй рисовать спрайт прямо в функции paint(), а не вне ее.

MidletUser 01.10.2011 03:20

Ответ: Просьба указать причину отстутствия анимированного спрайта на экране
 
Уважаемый Romanzes,

воспользовавшись Вашим советом, могу сказать, что появление спрайта в анимированном виде, к результату не привело, однако часть задачи, выполнена. Спрайт виден на экране. В чём тогда дело, что данный спрайт ведёт себя так, что он виден в неанимированном виде, а должен показывать 8 кадров согласно поставленной задачи.

Hurrit 01.10.2011 11:20

Ответ: Просьба указать причину отстутствия анимированного спрайта на экране
 
лол, где ты так научился писать? тоже хотеть так писать

Romanzes 01.10.2011 13:10

Ответ: Просьба указать причину отстутствия анимированного спрайта на экране
 
замени строчку
Код:

if (working) {
на
Код:

while (working) {

MidletUser 01.10.2011 14:58

Ответ: Просьба указать причину отстутствия анимированного спрайта на экране
 
Уважаемый Romanzes,

после замены if на while, на экране виден только тот же самый первый кадр спрайта, однако он стал виден с многократным повтором его мерцания на экране, и это при том, что в программный код был включён метод flushGraphics(); Так что задача остаётся той же, программный код не хочет себя вести должным образом. И снова тот же вопрос, почему?

Romanzes 01.10.2011 17:01

Ответ: Просьба указать причину отстутствия анимированного спрайта на экране
 
Код:

int [] sequence = {0,1,2,3,4,5,6,7};
mysprite.setFrameSequence(sequence);

Уважаемый MidletUser,
Убери вот эти 2 строчки из отрисовки и поставь их до цикла while(working).

MidletUser 01.10.2011 19:40

Ответ: Просьба указать причину отстутствия анимированного спрайта на экране
 
Заработало. Но должен сказать, что мерцание осталось прежним. Да я понимаю, что 8 кадров при 10 миллисекунд остановки потока не вариант для хорошего анимированного спрайта, понимая что в 1 секунду должно быть не менее 24-25 кадров у спрайта, всё таки, ставлю вопрос мерцания данного спрайта. Поскольку был применён сетод flushGraphics() в самом потоке; Неужели Sun разработчики подобного методом flushGraphics() не предусмотрели, в случаях со спрайтами с менее 24-25 кадров в секунду. А вот относительно массива и метода установки очерёднеости воспроизведения очереди кадров, видимо следует смотреть в самом классе Thread, разработанном самими Sun разработчиками, чтобы понять, почему же массив, включенный, в сам поток, ведёт себя несколько иначе, как полагалось, не уже ли массив, внесённый в поток, начинает запись с такой скоростью, что практически не заметно, отображение остальных кадров, или что же там происходит в конце концов. Стоит ли произвести отладку массива int [] sequence, и проверить его на значение в самом цикле while(working). Вот это для меня остаётся загадкой.

Romanzes 01.10.2011 22:48

Ответ: Просьба указать причину отстутствия анимированного спрайта на экране
 
Господин MidletUser, не соблаговолите ли вы быть любезным изъясняться не столь изощренно и вычурно?
Чтобы избавиться от мерцания, можно создать изображение imgBuffer размером с экран, получить его Graphics и отрисовывать все туда. А в paint() поставить строчку g.drawImage(imgBuffer, 0, 0, 0);

baton4ik 01.10.2011 23:24

Ответ: Просьба указать причину отстутствия анимированного спрайта на экране
 
Уважаемый MidletUser, вынужден заметить, что ввиду наличия немалого количества грамматических, лексических и орфографических ошибок в Ваших сообщениях, Вам было бы лучше воздержаться от подобного стиля изложения своих мыслей.


Часовой пояс GMT +4, время: 08:35.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot