Таймер Java с переменным управлением через JMenuBar - PullRequest
0 голосов
/ 27 декабря 2018

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

Я пробовал несколько разных способов, как изменить задержку, но задержка работает только тогда, когда между скобками есть действительная переменная int.

Ниже показано, где сейчас находится мой кодпытаясь изменить задержку таймера:

private int speed, delay;
private JRadioButtonMenuItem fast, normal, slow;
private boolean speedSlow = false;
private boolean speedNorm = false;
private boolean speedFast = false;

public game()
    {
        frame = new JFrame("Simon");
        renderer = new Renderer();

        JMenuBar menuBar = setMenuBar();
        frame.setSize(WIDTH + 8, HEIGHT + 30);
        frame.setVisible(true);
        frame.addMouseListener(this);
        frame.setResizable(false);
        frame.add(renderer);
        frame.setJMenuBar(menuBar);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Timer timer = new Timer(setDelay(delay), this);

        start();

        timer.start();
    }
public JMenuBar setMenuBar()
{   
    JMenuBar menuBar = new JMenuBar();

    JMenu settings = new JMenu("Settings");     
    JMenu speedSet = new JMenu("Set Speed");
    slow = new JRadioButtonMenuItem("Slow");
    normal = new JRadioButtonMenuItem("Normal");
    fast = new JRadioButtonMenuItem("Fast");
    slow.addActionListener(new java.awt.event.ActionListener()
    {
        public void actionPerformed(java.awt.event.ActionEvent evt)
        {
            speedSlow = true;
        }
    });
    normal.addActionListener(new java.awt.event.ActionListener()
    {
        public void actionPerformed(java.awt.event.ActionEvent evt)
        {
            speedNorm = true;
        }
    });
    fast.addActionListener(new java.awt.event.ActionListener()
    {
        public void actionPerformed(java.awt.event.ActionEvent evt)
        {
            speedFast = true;
        }
    });

    speedSet.add(slow);
    speedSet.add(normal);
    speedSet.add(fast);
    settings.add(speedSet);

    menuBar.add(settings);

    return menuBar;
}
public int setDelay(int delay)
{   

    if (speedSlow)
    {
        delay = 30;
    }
    if (speedNorm)
    {
        delay = 20;
    }
    if (speedFast)
    {
        delay = 10;
    }

    return delay;

}
public void start()
{
    random = new Random();
    indexShown = 0;
    ticks = 0;
    score = 0;
    speed = delay;
}

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Ниже мой код пытается изменить задержку таймера:

Что ж, если вы хотите изменить "задержку" Timer, вам нужночтобы вызвать setDelay(..) метод TImer.

private boolean speedSlow = false;
private boolean speedNorm = false;
private boolean speedFast = false;

Эти переменные не нужны.Вместо этого вы просто хотите установить задержку Timer при нажатии на пункт меню.Таким образом, это означает, что вам нужно сделать переменную Timer переменной экземпляра, чтобы на нее можно было ссылаться в вашем ActionListeners:

private Timer timer;

Теперь в вашем конструкторе вы создаете таймер с задержкой по умолчанию:

timer = new Timer(30, this);

Затем в ваших ActionListeners вы сбрасываете задержку.Например:

slow.addActionListener(new java.awt.event.ActionListener()
{
    public void actionPerformed(java.awt.event.ActionEvent evt)
    {
        //speedSlow = true;
        timer.setDelay( 30 );
    }
});

Ваш существующий метод setDelay (...) не требуется.Кроме того, метод "setter" НЕ должен возвращать значение.Смысл метода «setter» - установить свойство класса.Затем вы также создадите метод «getter», если вам нужно получить доступ к этому значению.Хотя в этом случае ни один метод не нужен, потому что вы можете установить / получить / задержку непосредственно из объекта Timer.

0 голосов
/ 27 декабря 2018

На мой взгляд, начальное значение delay (равное 0) установлено на Таймер, и Таймер запускается.И задержка таймера никогда не обновляется.Если вы ожидаете, что задержка таймера будет обновлена, когда пользователь щелкнет элемент меню, вы должны сделать это в обработчиках действий пунктов меню.

...