我正在用Java开发2D横屏游戏。渲染的所有块和敌人均为32x32px。当我尝试设置太大的关卡时,游戏将无法处理它们,这将使其滞后很多。因此,我要解决此问题的方法是仅使摄影机渲染可见的块,并且只有摄影机+ 200-300px可见的块运行其tick方法。这可能会使游戏的滞后时间减少。
代码:
所有类型的对象都有一个自己的类,该类扩展了一个称为GameObject的类,该类为它们提供了所需的所有方法(刻度方法,渲染,碰撞等)。在称为Handler的类中,将GameObject制成一个LinkedList,如下所示:
public LinkedList<GameObject> object = new LinkedList<GameObject>();
LinkedList内的所有内容都是这样运行的...
public void tick()
for(int i = 0; i < object.size(); i++){
GameObject tempObject = object.get(i);
tempObject.tick(object);
if(tempObject.getId() == ID.MovingBlock){
velX_MB = tempObject.velX;
velY_MB = tempObject.velY;
}
}
}
...并以如下方式呈现:
public void render(Graphics g){
for(int i = 0; i < object.size(); i++){
GameObject tempObject = object.get(i);
tempObject.render(g);
}
}
我已尝试通过执行以下操作来仅渲染摄像机内部的块:
private GameObject player;
for(int i = 0; i < object.size(); i++){ //searching through GameObject LinkedList
if(object.get(i).getId() == ID.Player){ //if found player
player = object.get(i);
}
}
在那之后,我检查了这些块是否与播放器足够接近,可以在render方法中进行渲染;如果是,则我将它们渲染,如下所示:
public void render(Graphics g){
for(int i = 0; i < object.size(); i++){
GameObject tempObject = object.get(i);
if(tempObject.getX() <= player.getX() + Game.xsize + 200 && tempObject.getX() >= player.getX() - Game.xsize - 200){ //this row got error
tempObject.render(g);
}
}
}
但是这没有用,它给了我一个NullPointerException错误,指向前面显示的代码中标记的行。完整的错误消息:
Exception in thread "Thread-12" java.lang.NullPointerException
at game.main.Handler.render(Handler.java:53)
at game.main.Game.render(Game.java:363)
at game.main.Game.run(Game.java:302)
at java.lang.Thread.run(Unknown Source)
那只是render方法,但是我想运行它们时会一样。
感谢您抽出宝贵的时间。
编辑:我修复了空错误,并在tick()和render()中添加了我的旧方法,但是它仍然非常滞后。