为了账号安全,请及时绑定邮箱和手机立即绑定

Java中断/停止定时器

Java中断/停止定时器

素胚勾勒不出你 2022-05-25 16:38:49
我有一个 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 语句,因为它只是检查项目是否处于活动状态,但我不知道如何更改它以使其工作。
查看完整描述

1 回答

?
红颜莎娜

TA贡献1842条经验 获得超12个赞

您需要先检查碰撞。如果检测到碰撞-检查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 InvulnerabilityActivePending到GameRenderer. 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在碰撞开始时重置,而是在碰撞结束时重置它。


查看完整回答
反对 回复 2022-05-25
  • 1 回答
  • 0 关注
  • 208 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信