Java Applet Game Loop останавливает ввод с клавиатуры или мыши? - PullRequest
0 голосов
/ 08 июля 2011

У меня возникла проблема, я не мог приступить к работе примерно через 2 часа попыток.Я хочу иметь цикл, который выполняет 2 метода (рисование и обновление), а также прослушивает события мыши / клавиатуры.У меня есть цикл, который рисует и обновляет, но ничего не делает вне цикла (прослушивание событий). Я пробовал много вещей, но ничего не получалось.Помогите, пожалуйста?

Я пытался использовать Runnable Thread, используя разные порядки, используя wait () и notify (), я пробовал много вещей.Но в основном я хочу знать, как запустить цикл и по-прежнему проверять пользовательский ввод

Также, когда я пытаюсь выйти из программы, нажимая на красную букву «Х», она не завершается, но все еще работает

Вот код:

import java.applet.Applet;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

public class main extends Applet implements MouseListener, Runnable {

    public main() {
        super();
        init();
    }
    Thread t;
    Screen screen = new Screen();
    String Text = "Hello";
    boolean Running = true;
    boolean Click = false;
    int R = 0x00;
    int G = 0x00;
    int B = 0x00;
    int xpoints[] = {25, 40, 40, 25, 25};
    int ypoints[] = {40, 40, 25, 25, 25};
    int npoints = 5;

    public void run() {
        while (Running) {
            GameLoop();
        }
    }

    public void init() {
        this.addMouseListener(this);
        this.setSize(400, 300); //manually set your Frame's size
        t = new Thread(this);
        t.start();
    }

    public void paint(Graphics g) {
        g.setColor(new Color(R, B, G));
        g.fillPolygon(xpoints, ypoints, npoints);
        Running = true;
        t.run();
    }

    public void mousePressed(MouseEvent e) { //On Mouse Click
        System.exit(0);
    }

    public void mouseReleased(MouseEvent e) {
    }

    public void mouseEntered(MouseEvent e) {
        System.exit(0);
    }

    public void mouseExited(MouseEvent e) {
    }

    public void mouseClicked(MouseEvent e) {
    }

    public boolean keyDown(Event e, int key) {
        return true;
    }

    public void GameLoop() {
        if (Running) {
            if (R != 0xff) {
                R++;
            } else {
                if (G != 0xff) {
                    G++;
                } else {
                    if (B != 0xff) {
                        B++;

                    } else {
                        System.exit(0);
                    }
                }
            }
            try {
                sleep(20);
            } catch (InterruptedException e) {

                e.printStackTrace();
            }
            paint(getGraphics());
        }
    }

    public void sleep(int time) throws InterruptedException {
        Thread.sleep(time, 0);
    }
}

Ответы [ 2 ]

1 голос
/ 08 июля 2011

Этот урок должен дать некоторое представление о том, как ваша программа должна быть структурирована.И этот полезен для слушателя мыши.

Проблемы, на которые следует обратить внимание:
1) Вы делаете что-то подозрительное с помощью метода paint,Почему ты звонишь туда t.run()?Поток t уже запущен и постоянно зацикливается, вызывая метод paint() для перерисовки экрана.Удалите этот вызов и посмотрите, что вы получите.

1) Уничтожение вашей темы / приложения оставляет желать лучшего.Первый приведенный выше пример обеспечивает лучший способ для этого

2) У вас есть System.Exit(0) на mousePressed() с комментарием //on mouse click, но ничего в mouseClicked() ... это работает, но плохосоглашение

3) Наличие вашего класса с именем main является крайне плохим соглашением, которое является и запутанным, и непрактичным.Переименуйте ваш класс во что-то вроде «Игра» или аналогичное.

4) Зачем объявлять Screen, если вы его не используете?

0 голосов
/ 08 июля 2011

Я вижу, что вы определяете переменную Running, которая будет истинной при инициализации.Эта переменная используется, чтобы определить, должна ли игра остановиться.Однако я не вижу места, где вы можете изменить значение этой переменной на false.Это объясняет, почему ваша игра никогда не завершается.

Что касается игры, которая не работает, попробуйте отладить приложение в IDE.Затем вы должны обратить внимание на то, что, если таковые имеются, генерируется Исключение и значения любых переменных, которые вы подвергаете сомнению.Надеемся, что это даст вам представление о поведении вашего приложения.

Не забудьте обновить нас любой новой информацией, которую вы обнаружите, чтобы мы могли помочь вам в этом.

...