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에 대해 설명하거나 훌륭한 튜토리얼이나 설명이있는 링크를 제공 할 수 있습니까? 그게 좋을거야.
AWT 구성 요소는 이중 버퍼링되지 않으며 스윙 구성 요소는 있습니다. 당신은 햇볕이 잘 드는 getGraphics이어야합니다. 그리는 방법은 아닙니다! 적절한 페인트 방법을 재정의해야합니다. 페인팅 프로세스에 대한 절대적인 제어를 원한다면 BufferedStrategy를 사용하는 것을 고려할 것입니다. 그런 다음 모든 종류의 스윙 구성 요소를 사용할 수 없도록 차단하고, 문제인지 여부는 알 수 없지만 제한 사항에주의해야합니다. – MadProgrammer
스윙 구성 요소는 기본적으로 이중 버퍼링됩니다. 나는 25fps에서 약 5,000 개의 개별 요소를 애니메이션 할 수있는 두 개의 예제 (하나의 구성 요소를 기반으로 한 실제 구성 요소)와 많은 문제없이 25fps에서 10000 개 이상의 페인트 된 객체 (JPanel의 paintComponent를 오버라이드하여)를 얻은 두 개의 예제를 수행했습니다. . 그냥 – MadProgrammer
라고 말해 yr 코드의 또 다른 문제는 강제 지연 루프입니다. Thread.sleep은 0 % CPU를 사용하여 루프 스레드를 절전 모드로 전환합니다. 다른 스레드가 더 잘 작동하도록 허용 – MadProgrammer