首页 > 解决方案 > Java中断/停止定时器

问题描述

通过第一个障碍后,项目应该被停用

我有一个 if 语句,它检查我的对象(向导)是否命中了item. 如果他这样做了,巫师的体型就会改变,他应该能够在与障碍物的 1 次碰撞中幸存下来。

现在我被困在“幸存 1 个障碍物碰撞”,因为在我的碰撞方法中我已经设置了它,如果它InvulnerabilityActive是真的,那么它不应该检测到碰撞。

所以问题是,在整个持续时间(9 秒)内,没有检测到与障碍物的碰撞。巫师只是飞过。如何更改它,使其不会检测到与第一个障碍物的碰撞,然后停用该项目?

我想过使用该Timer.cancel()方法,但正如您所见,我只能用this关键字来引用它。Timer.cancel()在我使用它之前我不能打电话Timer

这是与物品的碰撞。

try {
    invulnerability = new Rectangle(GameWorld.obstacle1.getX() - GameRenderer.generator2.getValue2(),
            GameWorld.obstacle1.getY() + GameRenderer.generator2.getValue1(), 15, 15);
    if ((Intersector.overlaps(GameWorld.wizard.getBoundingRectangle(), invulnerability))){
        GameRenderer.InvulnerabilityActive = true;
        activeItem = true;
        case0 = true; 
        GameWorld.wizard.setWidth(8);
        GameWorld.wizard.setHeight(8);
        new java.util.Timer().schedule(
                new java.util.TimerTask() {
                    public void run() {
                        this.cancel();
                        GameRenderer.InvulnerabilityActive = false;
                        activeItem = false;
                        case0 = false;
                        GameWorld.wizard.setWidth(16);
                        GameWorld.wizard.setHeight(16);
                    }
                 },
                 9000
        );
     }
} catch (NullPointerException e){
     System.out.println("Caught NullPointerException!");
}

这是与障碍物碰撞的方法:

public boolean collides(Wizard wizard) {
   if (GameRenderer.InvulnerabilityActive){
       return false;
   } else {
       return (Intersector.overlaps(wizard.getBoundingRectangle(), barUp)
               || Intersector.overlaps(wizard.getBoundingRectangle(), barDown));
   }
}

我知道问题出在 if 语句,因为它只是检查项目是否处于活动状态,但我不知道如何更改它以使其工作。

标签: javatimerlibgdxcollision-detection

解决方案


您需要先检查碰撞。如果检测到碰撞-检查InvulnerabilityActive。如果是true- 将其重置为false并返回 false。在下一次碰撞InvulnerabilityActive将是假的,碰撞将被检测到。

public boolean collides(Wizard wizard) {
    if (Intersector.overlaps(wizard.getBoundingRectangle(), barUp)
            || Intersector.overlaps(wizard.getBoundingRectangle(), barDown)) {
        if (GameRenderer.InvulnerabilityActive) {
            GameRenderer.InvulnerabilityActive=false;
            return false;
        } else {
            return true;
        }
    } else {
        return false;
    }
}

可能会出现“向导飞过障碍物并不断检测到碰撞”之类的问题。在这种情况下:将额外的字段添加bool InvulnerabilityActivePendingGameRenderer. GameRenderer.InvulnerabilityActivePending = true;旁边添加GameRenderer.InvulnerabilityActive = true;。并使用此代码:

public boolean collides(Wizard wizard) {
    if (Intersector.overlaps(wizard.getBoundingRectangle(), barUp)
            || Intersector.overlaps(wizard.getBoundingRectangle(), barDown)) {
        if (GameRenderer.InvulnerabilityActive) {
            GameRenderer.InvulnerabilityActivePending=false;
            return false;
        } else {
            return true;
        }
    } else {
        GameRenderer.InvulnerabilityActive=GameRenderer.InvulnerabilityActivePending;
        return false;
    }
}

我们不是InvulnerabilityActive在碰撞开始时重置,而是在碰撞结束时重置它。


推荐阅读