所以我是新手程序员修改/添加已经制作的太空入侵者游戏的东西,以便更熟悉游戏的编程方式。我试图在游戏中添加作弊,而快速的欺诈行为给我带来了一些麻烦。当你选择快速射击并进入关卡时,游戏有时可能会在一些外星人仍然离开时触发notifyWin。这是因为有时两次射击同时击中同一个敌人,使计算机认为有2个不同的敌人被杀死,因此留下一些外星人有时会遗留下来,而你已经赢了!"屏幕弹出。当外星人计数达到0时触发胜利两次相同的敌人将外星人的数量减少2而不是1.我不能为我的生活看出这一点。
// reduce the alient count, if there are none left, the player has won
alienCount--;
if (alienCount == 0)
{
notifyWin ();
}
以下是镜头与敌人碰撞的代码
/**
* Notification that this shot has collided with another
* entity
*
* @parma other The other entity with which we've collided
*/
public void collidedWith(Entity other) {
// prevents double kills, if we've already hit something,
// don't collide
if (used) {
return;
}
// if we've hit an alien, kill it!
if (other instanceof AlienEntity) {
// remove the affected entities
game.removeEntity(this);
game.removeEntity(other);
// notify the game that the alien has been killed
game.notifyAlienKilled();
used = true;
}
}
答案 0 :(得分:2)
一种可能的解决方案是将敌人作为对象添加到列表中。拍摄后,将它们从列表中删除,检查它们是否仍在手边。列表为空时执行notifyWin。这样,如果对敌人进行碰撞检测的逻辑产生太多命中,它仍然可以正常工作。
为了在屏幕上渲染敌人,这个列表已经存在的可能性很大。
编辑:现在我看到了这个方法,你可能只需要在collidedWith的顶部执行以下操作:
if (used || !game.containsEntity(other)) {
return;
}
方法containsEntity检查内部列表中是否存在实体或者持有游戏参与者(实体)的结构。