Java图形闪烁

Jor*_*ori 10 java windows java-2d game-development

好的,我理解你需要一个SSCCE,所以我创建了(我的第一个).

我设法用200行代码复制问题.在我的系统上,这个演示编译并运行完美(当然只有闪烁仍在那里).我剥夺了与它无关的所有东西.所以基本上我们现在有两个源文件:屏幕管理器和游戏管理器.

屏幕管理员:http: //pastebin.com/WeKpxEXW

游戏经理:http: //pastebin.com/p3C5m8UN

你可以使用这个make文件编译这段代码(我使用的是移植版本的Linux'make for Windows):CC = javac BASE = nl/jorikoolstra/jLevel CLASS_FILES = classes/$(BASE)/Game/GameMain.class classes/$ (BASE)/Graphics/ScreenManager.class

jLevel: $(CLASS_FILES)
    @echo Done.

classes/%.class : src/%.java
    @echo Compiling src/$*.java to $@ [command: $(CC) src/$*.java ] ...
    @$(CC) -Xlint:unchecked -d classes -classpath src src/$*.java
Run Code Online (Sandbox Code Playgroud)

源文件放在/src目录和目录中的类中/classes.

在编译为字节码后,可以使用以下.bat文件启动游戏:

@set STARUP_CLASS=nl.jorikoolstra.jLevel.Game.GameMain
@set ARGUMENTS=1280 1024 32
@java -cp classes;resources %STARUP_CLASS% %ARGUMENTS%
Run Code Online (Sandbox Code Playgroud)

请注意,ARGUMENT变量取决于您自己的屏幕设置,您必须更改它,以便以适合您屏幕的分辨率显示游戏.

shu*_*why 5

我明白为什么它会闪烁----

BufferStrategy从Component的paint()方法做一个单独的绘画工作,他们似乎使用不同的Graphics对象,他们以不同的速度刷新 -

什么时候paint()被调用show(),没关系.但

paint()之后调用时show(),它会将组件重新绘制为其初始空白外观 - 因此闪烁发生.


很容易消除闪烁:paint()你的JFrame(GameMain)的覆盖方法,因为你不需要它做任何事情(BufferStrategy可以让你更精确地控制绘画的东西):

@Override
public void paint (Graphics g) {}
Run Code Online (Sandbox Code Playgroud)

就这样.(我测试了它,它工作正常,希望这可能有帮助:))


=====更新=====

而不是覆盖paint()方法,更好的方法是调用setIgnoreRepaint(true)你的JFrame(GameMain) - 这个方法只是为这样的目的而设计的!使用它!

private GameMain(String ... args)
{
    setIgnoreRepaint(true);
    .....
}
Run Code Online (Sandbox Code Playgroud)