Таймер прерывания / остановки Java - PullRequest
0 голосов
/ 30 января 2019

Item should get deactived after going through first obstacle

У меня есть оператор 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 Ответ

0 голосов
/ 30 января 2019

Сначала нужно проверить столкновения.Если обнаружено столкновение - отметьте InvulnerabilityActive.Если это true - сбросьте его на false и верните false.При следующем столкновении InvulnerabilityActive будет иметь значение false, и столкновение будет обнаружено.

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 при начале столкновения, мы сбрасываем его по окончании столкновения.

...