簡體   English   中英

Java Applet 游戲循環停止鼠標/鍵盤輸入?

[英]Java Applet Game Loop stops Mouse/Keyboard Input?

經過大約 2 小時的嘗試后,我遇到了一個無法上班的問題。 我想要一個循環來執行 2 種方法(繪制和更新),但還要聽鼠標/鍵盤事件。 我有一個繪制和更新的循環,但在循環之外什么都不做(監聽事件)我嘗試了很多東西,但沒有任何效果。 請幫忙?

我嘗試使用 Runnable Thread,使用不同的命令,使用 wait() 和 notify(),我嘗試了很多東西。 但基本上我想知道如何運行循環並仍然檢查用戶輸入

此外,當我嘗試單擊紅色“X”退出程序時,它不會退出但仍然可以工作

這是代碼:

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);
    }
}

本教程應該提供一些關於如何構建程序的見解。 對鼠標聽眾很有幫助。

您應該解決的問題:
1)你正在用paint方法做一些可疑的事情。 你為什么在那里調用t.run() 線程t已經在運行並且循環不斷地調用paint()方法來重繪屏幕。 刪除這個電話,看看你得到了什么。

1)您的線程/應用程序的破壞很差。 上面的第一個例子提供了一種更好的方式來實現這一點

2)您在mousePressed()上有System.Exit(0)並帶有注釋//on mouse click但在mouseClicked()中沒有任何內容 ...它可以工作,但它的約定不好

3)將 class 命名為main是非常糟糕的約定,既令人困惑又不切實際。 將您的 class 重命名為“游戲”或類似名稱。

4)如果不使用Screen ,為什么要聲明它?

我看到您在初始化時將 Running 變量定義為 true。 此變量用於確定游戲是否應該停止。 但是,我沒有看到您將此變量的值修改為 false 的任何地方。 這可以解釋為什么你的游戲永遠不會退出。

至於游戲無法運行,請嘗試在 IDE 中調試應用程序。 然后,您應該注意拋出了什么異常(如果有的話)以及您所質疑的任何變量的值。 希望這能讓您深入了解應用程序的行為。

不要忘記向我們提供您發現的任何新信息,以便我們一路為您提供幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM