j2me tela flicker ao alternar entre as telas

votos
2

Eu estou escrevendo um jogo do telefone móvel utilizando J2ME. Neste jogo, eu estou usando vários objetos em tela. Por exemplo, o menu do jogo é um objeto Canvas, eo jogo real é um objeto Canvas também. Tenho notado que, em alguns dispositivos, quando eu mudar de uma tela para outra, por exemplo, a partir do menu principal do jogo, a tela momentaneamente pisca. Eu estou usando minha própria lona tamponada dupla.

Existe uma maneira de evitar isso?

Publicado 15/09/2008 em 21:08
fonte usuário
Em outras línguas...                            


5 respostas

votos
6

Eu diria, que o uso de múltiplas telas é geralmente mau design. Em alguns telefones ele vai mesmo falhar. A melhor maneira seria realmente usando uma tela com monitoramento estado do aplicativo. E, em seguida, no método de pintura você teria

protected void paint(final Graphics g) {
  if(menu) {
    paintMenu(g);
  } else if (game) {
    paintGame(g);
  }
}

Há melhores maneiras de lidar com o estado do aplicativo com objetos de tela, que fariam o limpador de design, mas eu acho que você teve a idéia :)

/ JaanusSiim

Respondeu 16/09/2008 em 03:21
fonte usuário

votos
0

Hipoteticamente, usando 1 lona com um código de máquina sate para a sua aplicação é uma boa idéia. No entanto, o único dispositivo que eu tenho que testar aplicativos em (v3 MOTO) falha em tempo de recursos de carregamento só porque há muito código / a ser carregado em 1 GameCanvas (não tentei com tela). É tão doloroso que seja real e atm eu não ter encontrado uma solução para o problema. Se você tiver sorte de ter um bom número de dispositivos para testar, vale a pena ter ambas as abordagens implementadas e muito bem fazer versões de seu jogo para cada dispositivo.

Respondeu 25/11/2008 em 18:10
fonte usuário

votos
0

Pode ser uma boa idéia usar classe GameCanvas se você estiver escrevendo um jogo. É muito melhor para esse fim e, quando utilizado adequadamente, ele deve resolver o seu problema.

Respondeu 17/09/2008 em 19:28
fonte usuário

votos
0

Uma possível solução é sincronizando o interruptor usando Display.callSerially (). A cintilação provavelmente é causado pelo aplicativo tentando desenhar na tela enquanto o interruptor da tela ainda está em curso. callSerially () é suposto que esperar para a repintura de terminar antes de tentar chamar run () novamente.

Mas tudo isso é totalmente dependente do telefone uma vez que muitos dispositivos não implementar callSerially (), não importa acompanhar a execução listados na documentação oficial. Os únicos dispositivos que eu conheço para funcionar corretamente com callSerially () foram Siemens telefones.

Outra possível tentativa seria colocar um Thread.sleep () de algo enorme como 1000 ms, certificando-se de que você chamou seu método setCurrent () antemão. Desta forma, o dispositivo pode conseguir fazer a mudança antes das tentativas exibíveis para desenhar.

O problema mais provável é que ele é uma questão de dispositivo e a correção garantido para a cintilação é simples - usar um Canvas. Provavelmente não o que você queria ouvir embora. :)

Respondeu 15/09/2008 em 23:28
fonte usuário

votos
0

Você usa o buffer duplo? Se o próprio dispositivo não suporta double buffering você deve definir um buffer fora da tela (imagem) e pintar a ele primeiro e depois pintar o resultado final para a tela real. Faça isso para cada uma de suas telas. Aqui está um exemplo:

public class MyScreen extends Canvas {
   private Image osb;
   private Graphics osg;
   //...

   public MyScreen()
   {
         // if device is not double buffered
         // use image as a offscreen buffer
         if (!isDoubleBuffered())
         {
            osb = Image.createImage(screenWidth, screenHeight);
            osg = osb.getGraphics();
            osg.setFont(defaultFont);
         }
   }

   protected void paint(Graphics graphics)
   {
      if (!isDoubleBuffered())
      {
         // do your painting on off screen buffer first
         renderWorld(osg);

         // once done paint it at image on the real screen
         graphics.drawImage(osb, 0, 0, Tools.GRAPHICS_TOP_LEFT);
      }
      else
      {
         osg = graphics;
         renderWorld(graphics);
      }
   }
}
Respondeu 15/09/2008 em 21:43
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more