Java中断/停止计时器

时间:2019-01-29 21:27:02

标签: java timer libgdx collision-detection

Item should get deactived after going through first obstacle

我有一个if语句,该语句检查我的对象(向导)是否击中了item。如果他这样做了,向导的大小就会改变,他应该能够承受1次障碍物的碰撞。

现在,我被困在“幸存1个障碍物碰撞中”,因为在我的碰撞方法中,我将其设置为如果InvulnerabilityActive为true,则它不应检测到碰撞。

所以问题是,在整个持续时间(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语句,因为它只是检查项目是否处于活动状态,但是我不知道如何更改它以使其起作用。

1 个答案:

答案 0 :(得分:1)

您需要首先检查碰撞。如果碰撞检测 - 检查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在碰撞开始,我们重置时碰撞结束。