Как добавить случайную петлю таймера в JavaFX Scene Builder? - PullRequest
0 голосов
/ 28 декабря 2018

Я программирую свою первую маленькую «Компьютерную игру» как школьный проект, и это Beat 'em up, Fighting Game, где 2 парня избивают друг друга, довольно простая игра.Мне нужно реализовать метод, который заставляет врага атаковать игрока через случайные промежутки времени, когда программа работает, и вы можете вводить атаки и т. Д.

Я создал AI-метод и, честно говоря, яраньше у меня были некоторые проблемы, но это работало во время тестирования 9/10 раз.Я добавил таймер, который все время перезапускается с другим случайным числом, чтобы запускать таймерную задачу через произвольные интервалы, чтобы сделать противника более непредсказуемым в моей игре.Я также добавил несколько звуковых эффектов и проверку, потеряли ли вы все свои хитпоинты и проиграли игру.Урон наносится Healthbar, который является [] Char Array.Это вычисляется в моем методе "DamageMachen ()".

Теперь моя игра закончена, и я хочу внедрить этот метод в свой controllerClass, но как только метод получает старт, моя программа падает: (

Кто-нибудь знает какое-либо решение для исправления этой проблемы или, может быть, другой метод, который я мог бы использовать, с теми же функциями, что и у меня?

В моем тестовом классе этот AI-метод работает ... не хорошо, но это работает. Иногда ИИ останавливается, я думаю из-за случайных чисел, но он работал 9/10 раз. Я просто не мог решить проблему. Я пытался изменить диапазон случайных чисел, а иногда это было еще хуже, поэтому я выбрал цифры от 1 до 3 секунд, которые мне больше всего понравились.

Когда я внедрил этот метод в мою игру, игра либо вылетает, либо я не могу ничего больше вводить, потому что яПолагайте, что AI-метод сначала должен закончиться, но как я его запрограммировал, он никогда не закончится, пока игра не закончится.

Если у вас есть вопросы по поводу моего кода, прошуSE, дайте мне знать.Я впервые задаю вопрос здесь, поэтому я надеюсь, что того, что я вам показал, достаточно, чтобы увидеть мою проблему.

// KI-Methode THIS IS MY MAIN PROBLEM. I'LL ALSO ADD THE OTHER METHODS DOWN 
//THERE JUST TO HELP YOU VISUALIZE MY WHOLE CODE

public void KI() {

    long interval = 0;

    gewinnErmitteln();
    boolean verloren = noob();
    int start = 0;
    int zaehler = 0;

    while (gewonnen == false && verloren == false) {
        try {
            Random r = new Random();
            double randomValue = 1 + (3 - 1) * r.nextDouble();

            ki = new Timer();
            interval = (long) (randomValue * 1000);

            TimerTask kitask = new TimerTask() {
                public void run() {

                    damageMachen(damageNormal);

                    // Visualisieren TEST
                    //visualisieren();

                    done = true;
                    ki.cancel();
                }
            };
            if (start == zaehler) {
                ki.schedule(kitask, interval);
                zaehler++;
            } else if (done == true) {
                done = false;
                ki.schedule(kitask, interval);
            }

// THIS METHOD JUST CHECKS, IF YOU EITHER HAVE WON OR LOST BY CHECKING; IF THE //[]CHAR ARRAY IS FULL (All Health lost)

            gewinnErmitteln();
            verloren = noob();

        } catch (IllegalStateException e) {
            System.out.println("EXCEPTION: " + e);
        }
        continue;
    }
    if (verloren == true) {
        ki.cancel();
        try {

            AudioInputStream sad = AudioSystem.getAudioInputStream(
                    new File("MySoundHere"));

            Clip clip = AudioSystem.getClip();
            clip.open(sad);
            clip.start();
        } catch (Exception ex) {
            System.out.println("Error with playing sound.");
            ex.printStackTrace();
        }
    }
}



// HERE IS THE METHOD, WHICH I USE TO CALCULATE THE DAMAGE OF ENEMY ATTACKS
// DAMAGE GETS DONE TO A HEALTHBAR, WHICH IS A []CHAR-ARRAY

// Damage-Methoden

public void damageMachen(int damage) {
    int damagedone = 0;
    int thisdamage = damage;
    int focusdamage = 2;
    int focusdamagedone = 0;

    if (blocken == false) {

        // AUDIO

        for (int i = 0; i < lebensbalkenValue; i++) {
            if (thisdamage != damagedone && lebensbalken[i] == ' ') {
                lebensbalken[i] = 'I';
                damagedone++;
                try {

                    AudioInputStream punch = AudioSystem.getAudioInputStream(new File(
                            "MyOtherAudio"));

                    Clip clip = AudioSystem.getClip();
                    clip.open(punch);
                    clip.start();
                } catch (Exception ex) {
                    System.out.println("Error with playing sound.");
                    ex.printStackTrace();
                }
            }
        }
        for (int i = fokusValue - 1; i >= 0; i--) {
            if (focusdamage != focusdamagedone && fokusbalken[i] == 'I') {
                fokusbalken[i] = ' ';
                focusdamagedone++;
                try {

                    AudioInputStream punch = AudioSystem.getAudioInputStream(new File(
                            "YetAnotherAudioClip"));

                    Clip clip = AudioSystem.getClip();
                    clip.open(punch);
                    clip.start();
                } catch (Exception ex) {
                    System.out.println("Error with playing sound.");
                    ex.printStackTrace();
                }
            }
        }
    } else {
        int focusdone = 0;
        int thisfocus = 1;
        for (int i = 0; i < fokusValue; i++) {
            if (thisfocus != focusdone && fokusbalken[i] == ' ') {
                fokusbalken[i] = 'I';
                focusdone++;

            }
        }
    }
}

// MY CONSTRUCTOR

public Model() {

    lebensbalken = new char[lebensbalkenValue];

    for (int i = 0; i < lebensbalkenValue; i++) {
        lebensbalken[i] = ' ';
    }

    fokusbalken = new char[fokusValue];

    for (int i = 0; i < fokusValue; i++) {
        fokusbalken[i] = ' ';
    }
}

// MY CONTROLLER CLASS, I INITIALIZE THE AI METHOD RIGHT AT THE BEGINNING

@Override
public void initialize(URL location, ResourceBundle resources) {

    javaFighter = new Model();

//AI_METHOD STARTING

    javaFighter.KI();

// other stuff to handle buttons, etc. This all works fine, so I don't think I // have to show it to you

}

Я ожидал, что AI-метод будет работать, пока игрок или враг не выиграют игруи пока AI-метод работает и атакует игрока, игрок все еще может вводить свои атаки и т. д.

Программа вылетала, как только она запускала AI-метод.Временами программа не вылетала, цикл таймера не позволял мне вводить что-либо еще, поэтому мне пришлось закрыть программу.

...