我写了以下代码。一旦发生碰撞,我想停止绘图。不幸的是,它只在发生碰撞时才停止绘制对象,然后再次开始绘制对象。
举一个我要学习的例子:玩家收集硬币,硬币消失。如果玩家错过了硬币,硬币仍会出现在屏幕上。
我的想法是在开始整理之前学习基本概念。在不理解的情况下复制代码并不好玩。提前谢谢。
batcher.begin();
if (egg.collected) {
batcher.draw(AssetLoader.textureEgg, eggRect.x, eggRect.y, eggRect.width, eggRect.height);
}
batcher.end();
我的蛋类:
public class Egg {
private Rectangle egg;
private Vector2 location;
public Egg(float x, float y){
location = new Vector2(x, y);
egg = new Rectangle(location.x, location.y, 10, 15);
}
public void update(float delta) {
egg.x--;
if (egg.x < -20) {
egg.x = 137;
};
}
public boolean collected = false;
public Rectangle getEgg() {
return egg;
}
public boolean isCollected() {
return collected;
}
}
上述代码的结果是:游戏崩溃并出现以下错误。
Exception in thread "LWJGL Application" java.lang.NullPointerException
at com.mygdx.gameworld.GameRenderer.render(GameRenderer.java:60)
at com.mygdx.screens.GameScreen.render(GameScreen.java:32)
at com.badlogic.gdx.Game.render(Game.java:46)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:214)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:120)
答案 0 :(得分:0)
Tenfour04是对的。由于当两个对象重叠时碰撞为真,它将在重叠时停止绘制并再次开始绘制。将返回值保存到成员变量。
答案 1 :(得分:0)
在Egg类中创建一个成员变量,以跟踪鸡蛋是否已被收集:
public boolean collected = false;
如果你想练习良好的封装,你可以将这个变量设为私有并给它一个getter和setter,但我会保持这样简单。
然后在你的游戏或屏幕课程中,你需要告诉鸡蛋收集时间:
if (eggRect.overlaps(boundingRect))
egg.collected = true;
现在,如果没有收集鸡蛋,你应该只画鸡蛋:
batcher.begin();
if (!egg.collected){
batcher.draw(AssetLoader.textureEgg, eggRect.x, eggRect.y, eggRect.width, eggRect.height);
}
batcher.end();
顺便说一句,你的Egg类扩展Rectangle有点奇怪,但是你并没有将它用作Rectangle而是用作其他Rectangle的容器。您也可以删除“extends Rectangle
”。