2014-05-17 4 views
0

Java에서 platformer 게임을 프로그래밍 중입니다. Canvas이 업데이트 될 때 화면의 깜박임을 제외하고 모든 것이 잘 작동하고 더 큰 문제는 없습니다. 내 게임 "엔진이"어떻게 작동하는지Canvas를 업데이트 할 때 bufferstrategy로 깜박임을 피하는 방법

나는 대략 설명 할 것이다 : 을 내 주요 방법에서, 나는 루프를 가지고, 그 두 번째 자체를 30 회 반복한다 :

while (play) { 
    Date delay_time = new Date(); 
    delay_time.setTime(delay_time.getTime() + (int) (1000*(1.0/FPS))); 

    // Here is all the game stuff, like the motion of the player, 
    // function calling, etc. 

    Graphics g = can.getGraphics(); 
    can.update(g); 
    while(new Date().before(delay_time)) { 

    } 

} 

내 FPS 변수가 static final int입니다 현재 30으로 설정되어 있습니다. 그래서 캔버스 30 초를 업데이트하고 있습니다.

재생은 게임이 아직 재생 중이거나 플레이어가 사망 한 경우를 제어하는 ​​부울 값입니다.

Can은 내 클래스 MyCanvas.java의 인스턴스입니다. 는 paint() 메소드의 코드는 그래서 다음과 같습니다 그래서

if (Main.play) { 
     //NOW 
     //Draw the now Level Caption 
     //SIZE: 240 
     g2.setFont(new Font("Bank Gothic", Font.PLAIN, 240)); 
     g2.setColor(new Color(Math.abs(bg.getRed() - 30), Math.abs(bg.getGreen() - 30), Math.abs(bg.getBlue() - 30))); 
     g2.drawString("LEVEL " + Main.lvl, 80, 80 + 300 - Main.groundY); 

     //Draw the ground 
     g2.setColor(haba); 
     g2.fillRect(0, Main.screenSize.height - Main.groundY, Main.screenSize.width, Main.groundY); 

     //Draw the level 
     g2.setColor(haba); 
     for (int i = 0; i < Main.LVLWIDTH; i++) { 
      for (int j = 0; j < Main.LVLHEIGHT; j++) { 
       if (Main.level[i][j] == '1') { 
        g2.fillRect(i*(Main.BLOCK_X), (j - Main.LVLHEIGHT)*(Main.BLOCK_Y) + Main.screenSize.height - Main.groundY, Main.BLOCK_X, Main.BLOCK_Y); 
       } 

     } 

     //More drawing stuff... 

    } 

, 당신이, 내가 꽤 많이 업데이트하고 볼 수 - 30 회 초. 이로 인해 내 게임 (전체 화면 모드 BTW에서 재생 중임)이 항상 깜박 거리는 문제가 발생합니다. 어떻게 그 문제를 해결합니까? Bufferstrategy가 올바른 방법입니까? 그리고 그렇다면 어떻게해야합니까? Bufferstartegy에 대해 설명하거나 훌륭한 튜토리얼이나 설명이있는 링크를 제공 할 수 있습니까? 그게 좋을거야.

+0

AWT 구성 요소는 이중 버퍼링되지 않으며 스윙 구성 요소는 있습니다. 당신은 햇볕이 잘 드는 getGraphics이어야합니다. 그리는 방법은 아닙니다! 적절한 페인트 방법을 재정의해야합니다. 페인팅 프로세스에 대한 절대적인 제어를 원한다면 BufferedStrategy를 사용하는 것을 고려할 것입니다. 그런 다음 모든 종류의 스윙 구성 요소를 사용할 수 없도록 차단하고, 문제인지 여부는 알 수 없지만 제한 사항에주의해야합니다. – MadProgrammer

+0

스윙 구성 요소는 기본적으로 이중 버퍼링됩니다. 나는 25fps에서 약 5,000 개의 개별 요소를 애니메이션 할 수있는 두 개의 예제 (하나의 구성 요소를 기반으로 한 실제 구성 요소)와 많은 문제없이 25fps에서 10000 개 이상의 페인트 된 객체 (JPanel의 paintComponent를 오버라이드하여)를 얻은 두 개의 예제를 수행했습니다. . 그냥 – MadProgrammer

+0

라고 말해 yr 코드의 또 다른 문제는 강제 지연 루프입니다. Thread.sleep은 0 % CPU를 사용하여 루프 스레드를 절전 모드로 전환합니다. 다른 스레드가 더 잘 작동하도록 허용 – MadProgrammer

답변