2008-09-15 8 views
2

j2me를 사용하여 휴대 전화 게임을 쓰고 있습니다. 이 게임에서는 여러 Canvas 객체를 사용하고 있습니다. 예를 들어 게임 메뉴는 Canvas 객체이며 실제 게임은 Canvas 객체입니다. 일부 장치에서 한 캔버스에서 다른 캔버스 (예 : 메인 메뉴에서 게임)로 전환하면 화면이 잠깐 깜박입니다. 내 자신의 이중 버퍼 Canvas를 사용하고 있습니다.캔버스 사이를 전환 할 때 j2me 화면 깜박임

어쨌든 이것을 피할 수 있습니까?

답변

0

이중 버퍼링을 사용합니까? 장치 자체가 이중 버퍼링을 지원하지 않으면 먼저 오프 스크린 버퍼 (이미지)를 정의하고 페인트해야하며 최종 결과를 실제 화면에 그립니다. 각 캔버스마다이 작업을 수행하십시오. 다음은 그 예이다 :

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); 
     } 
    } 
} 
+0

나는 당신과 비슷한 방법으로 오프 스크린 버퍼를 정의함으로써 이중 버퍼링을 사용합니다. 깜박임은 항상 새로운 Canvas의 주 스레드가 실행될 때 발생합니다. – Dimitris

0

가능한 수정 Display.callSerially을 사용하여 스위치()를 동기화하는 것이다. 플리커는 캔버스의 스위치가 계속 진행되는 동안 앱에서 화면을 그려야 할 때 발생합니다. callSerially()는 다시 그리기가 끝나기를 기다렸다가 run()을 다시 호출하려고합니다.

그러나 많은 장치가 callSerially()를 구현하지 않으므로이 모든 것이 전적으로 전화에 의존하므로 공식 문서에 나열된 구현을 따르지 마십시오. callSerially()에서 올바르게 작동하는 것으로 알려진 장치는 Siemens 전화뿐이었습니다.

또 다른 가능한 시도는 1000ms와 비슷한 거대한 Thread.sleep()을 넣고 미리 setCurrent() 메서드를 호출했는지 확인하는 것입니다. 이렇게하면 디스플레이 어블을 그리기 전에 장치에서 변경 작업을 수행 할 수 있습니다.

가장 큰 문제는 장치 문제이며 깜박임에 대한 보장 된 수정이 간단하다는 것입니다. 하나의 Canvas를 사용하십시오. 아마도 당신이 듣고 싶지 않은 것 같습니다. :)

+0

나는 당신의 충고에 따라 코드에 긴 Thread.sleep()을 넣었다. 나는 Canvas의 run() 메서드에서 첫 번째 repaint() 후에 실제로 깜박임이 발생 함을 발견했습니다. 이견있는 사람? – Dimitris

6

나는 여러 캔버스를 사용하는 것은 일반적으로 나쁜 디자인이라고 말하고 싶습니다. 일부 휴대 전화에서는 충돌이 발생합니다. 가장 좋은 방법은 실제로 응용 프로그램의 상태를 추적하는 하나의 캔버스를 사용하는 것입니다. 그리고 페인트 방법에 당신은

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

가 디자인 청소기를 만들 것 화면 개체와 응용 프로그램 상태를 처리하기 위해 더 나은 방법이 있습니다 것,하지만 난 당신이 생각 :)

/JaanusSiim

거 같아요
0

게임을 작성하는 경우 GameCanvas 클래스를 사용하는 것이 좋습니다. 그러한 목적을 위해 훨씬 더 낫습니다. 제대로 사용되면 문제를 해결해야합니다.

+0

원래 GameCanvas 객체를 사용했습니다.나는 그 구현에 대해서도 같은 "깜박임"동작을 관찰했다. – Dimitris

+0

GameCanvas 백 버퍼링을 위해 하나의 휴대폰이 구현되지 않았기 때문입니다. – Honza

0

귀하의 응용 프로그램에 맞는 컴퓨터 코드가있는 1 개의 캔버스를 사용하는 것이 좋습니다. 그러나 (MOTO v3)에서 응용 프로그램을 테스트해야하는 유일한 장치는 너무 많은 코드가 있기 때문에/1 GameCanvas (Canvas에서 시도하지 않은)에로드 될 자원로드 시간에 충돌합니다. 그것은 실제처럼 고통 스럽지만 나는 문제의 해결책을 찾지 못했습니다. 많은 수의 장치를 테스트 할 수 있다면 다행스럽게도 두 가지 방법을 구현하고 각 장치에 맞는 게임 버전을 만들 수 있습니다.

+0

OMG, 와우 방금 발견했습니다 기본적으로 처음에는 introCanvas, loadingCanvas 및 새 버전 (모두 1 캔버스/상태 시스템)의 gameOverCanvas를 사용했습니다. 단순히 src 폴더에서 이러한 파일을 지우면 응용 프로그램 오류 문제가 해결됩니다. 놀랄 만한!! –