如何在JavaFX Scene Builder中添加随机计时器循环?

时间:2018-12-28 16:04:57

标签: java javafx timer scenebuilder timertask

我正在将我的第一个小“计算机游戏”编程为学校项目,这是一个Beat'em up,一个格斗游戏,其中2个Dudes互相击败,这是一个非常简单的游戏。 我需要实现一个方法,该方法可以使敌人在程序运行时以随机的间隔攻击玩家,而您可以输入攻击等信息。

我制作了一种AI方法,说实话,我之前遇到过一些麻烦,但是在测试9/10次时仍然有效。 我添加了一个计时器,该计时器始终以另一个随机数重新启动,以随机间隔启动计时器任务,以使敌人在我的游戏中更加难以预测。 如果您丢失了所有生命值并丢失了游戏,我还添加了一些音效和检查。 损坏健康栏,它是[] Char数组。这是通过我的“ DamageMachen()”方法计算得出的。

现在我的游戏结束了,我想将该方法实现到我的controllerClass中,但是一旦该方法开始使用,我的程序就会崩溃:(

有没有人知道任何解决该问题的解决方案,或者我可以使用与我相同的功能的另一种方法?

在我的测试班中,此AI方法有效...不好,但是有效。我认为有时AI会停止,因为它是随机数,但它可以工作9/10次。我只是无法解决问题。我尝试更改随机数的范围,有时甚至更糟,所以我选择了1到3秒之间的数字,这对我来说效果最好。

当我在游戏中实现该Method时,游戏要么崩溃,要么无法输入其他内容,因为我相信AI-Method首先必须完成,但是我如何编程,它将永远不会完成,直到游戏结束。

如果您对我的代码有疑问,请告诉我。这是我第一次在这里提问,所以我希望我向您展示的内容足以解决我的问题。

// 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方法后立即崩溃。 当时,程序没有崩溃,Timer-Loop没有让我输入其他任何内容,所以我不得不关闭程序。

0 个答案:

没有答案