我试图建立一个简单的游戏,建立在RealTutsGML wave游戏的基础上(我假设有人在这里知道它可能有所帮助)。无论如何,我试图做一个"僵尸球员"这将避免敌人,我相信一切都应该是正确的,但由于某种原因,它一次只对一个敌人起作用(我每隔几秒就向游戏添加敌人,新敌人是唯一有效的敌人)。奇怪的是,我在我的敌人周围创建了一个圆圈,然后我用这个圆圈检测到附近的敌人,我有以下代码:if (circle.intersects(rectangle))
,圆圈接收玩家位置并一直更新,矩形得到敌人通过for循环定位:
for (int i = 0; i < handler.object.size(); i++) {
GameObject tempObject = handler.object.get(i);
if (tempObject.getId() == ID.basicEnemy) {
rectangle = new Rectangle((int) tempObject.getX(), (int) tempObject.getY(), 16, 16); }
如果发生碰撞,我会设置一条打印线,只是为了测试和看到,每当敌人击中玩家周围的圆圈时,它就会打印出#34;碰撞&#34;,它适用于所有敌人。但是以下导致玩家移动的代码仅在最后创建的敌人对象发生时发生。
这就是整个方法的样子:
public void AImove() {
for (int i = 0; i < handler.object.size(); i++) {
circle = new Ellipse2D.Double((int) player.getX() - 48, (int) player.getY() - 48, 130, 130);
GameObject tempObject = handler.object.get(i);
if (tempObject.getId() == ID.basicEnemy) {
rectangle = new Rectangle((int) tempObject.getX(), (int) tempObject.getY(), 16, 16);
}
if (rectangle != null && circle != null) {
if (circle.intersects(rectangle)) {
float diffX = rectangle.x - player.getX() - 8;
float diffY = rectangle.y - player.getY() - 8;
float distance = (float) Math.sqrt((rectangle.x - player.getX()) * (rectangle.x - player.getX())
+ ((rectangle.y - player.getY()) * (rectangle.y - player.getY())));
float newX = ((-1 / distance) * diffX * 10);
float newY = ((-1 / distance) * diffY * 10);
player.setVelX(newX);
player.setVelY(newY);
} else if (player.getX() != WIDTH / 2 - 32 && player.getY() != HEIGHT / 2 - 32) {
float diffX = player.getX() - 368 + 10;
float diffY = player.getY() - 268 + 10;
float distance = (float) Math.sqrt((player.getX() - 368) * (player.getX() - 368)
+ ((player.getY() - 268) * (player.getY() - 268)));
player.setVelX((-1 / distance) * diffX * 5);
player.setVelY((-1 / distance) * diffY * 5);
}
}
}
}
(只是一个简短的exlanation,newX / Y算法没有将玩家设置在一个新的位置,它只是设置velocityX / Y,它将玩家移动到被碰撞的敌人的oopsite方向,如果没有碰撞,玩家将尝试使用相同的算法返回屏幕中心。
我还测试过&#34;应该是&#34;新的velX和velY,如下:
System.out.println((-1 / distance) * diffX * 10);
System.out.println((-1 / distance) * diffY * 10);
同样,无论哪个敌人与玩家的圈子碰撞,它都会给出正确的价值,但由于某种原因它只是不移动,并且仅在最后创建的敌人物体击中圆圈时起作用
我有点失落,因为我真的没有看到它不会工作的原因,条件发生,需要执行的代码有效,但它没有。 对于这篇长篇文章感到抱歉,我尽量做到具体而且简短,如果需要更多代码请告诉我,我只是不想添加太多代码。谢谢你的帮助!
编辑 - https://github.com/pardovot/MyProjects/tree/master/AImove/Pong - 链接到github中的项目,这样您就可以获得有关它的所有必要信息。
我认为Dezigo所说的关于最后一次迭代更新值的说法是正确的,有没有人有任何想法我可以做些什么来解决这个问题?因为总体而言我没有看到真正的原因发生,因为实际的代码应该在每次迭代中运行,并且实际工作(显然没有......)