簡體   English   中英

在小程序中實現計時器?

[英]Implementing a timer into an applet?

有人可以幫助新手為自己的游戲增加計時器嗎? :P在過去的一兩天內,我一直在嘗試各種方法,但仍然無法正常工作。 這里有人可以解決嗎?

基本上,我有一個游戲,目標是在最快的時間內收集6個物品。 因此,我當然希望計時器顯示從0開始計數,以便用戶可以跟蹤自己的狀況。

以下是相關類別的骨架-

public class StartingPoint extends Applet implements Runnable{

    Task t = new Task();
    Menu menu = new Menu();
    int num;
    public static enum STATE{
        MENU, 
        GAME,
    }; 

    public static STATE State = STATE.MENU;

    public void init() {
        setSize(800, 600);
    }

    public void start() {

        if(num < 2){
            Thread thread = new Thread(this);
            thread.start();
            num++;
        }
    }

    public void run() {

        if (State == STATE.GAME) {
            while (true) {
                repaint();

                try {
                    Thread.sleep(17);
                    } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        } else if (State == STATE.MENU) {

            while (true) {
                repaint();
                try {
                    Thread.sleep(17);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }

    }

    public void paint(Graphics g) {

        if (State == STATE.GAME) {

            ball.paint(g);

        } else if (State == STATE.MENU) {
            menu.render(g);
        }
    }
}



public class Task extends TimerTask {
    int seconds;
    int minutes;
    public String time;

    public void run() {

        seconds++;

        if (seconds == 60) {
            seconds = 0;
            minutes++;
        }

        String s = String.valueOf(seconds);
        String m = String.valueOf(minutes);

        if (seconds < 10) {
            time = (m + ":0" + s);
        } else {
            time = (m + ":" + s);
        }
    }
}



public class Start {

    private static Timer ourClock;
    private static TimerTask ourTask;

    public static void update(){
        ourClock = new Timer();
        ourTask = new Task();
        ourClock.scheduleAtFixedRate(ourTask,1000,1000);
    }
 }

我知道很多,但是如果有人可以幫助我在applet上顯示任務類中的字符串“時間”,那將非常有幫助。

謝謝!

PS注意,這是Applet而不是JApplet。 :-/另外,如果您能想到一種不使用我現有類的方法,那就去吧! 我願意接受任何建議,我只想把這件事做完,我已經努力了好幾天...

如果我只是嘗試繪制字符串“時間”,這是錯誤消息

Exception in thread "AWT-EventQueue-1" java.lang.NullPointerException: String is null
at sun.java2d.SunGraphics2D.drawString(SunGraphics2D.java:2880)
at Start.paint(Start.java:23)
at StartingPoint.paint(StartingPoint.java:229)
at StartingPoint.update(StartingPoint.java:215)
at sun.awt.RepaintArea.updateComponent(RepaintArea.java:255)
at sun.lwawt.LWRepaintArea.updateComponent(LWRepaintArea.java:47)
at sun.awt.RepaintArea.paint(RepaintArea.java:232)
at sun.lwawt.LWComponentPeer.handleJavaPaintEvent(LWComponentPeer.java:1312)
at sun.lwawt.LWComponentPeer.handleEvent(LWComponentPeer.java:1196)
at java.awt.Component.dispatchEventImpl(Component.java:4959)
at java.awt.Container.dispatchEventImpl(Container.java:2292)
at java.awt.Component.dispatchEvent(Component.java:4705)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:746)
at java.awt.EventQueue.access$400(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:697)
at java.awt.EventQueue$3.run(EventQueue.java:691)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.awt.EventQueue$4.run(EventQueue.java:719)
at java.awt.EventQueue$4.run(EventQueue.java:717)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:716)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

我認為您是從錯誤的角度看待這個問題。

在Java中,您可以在現有類中創建一個內部類。 這將允許您的實例化類與其父類進行對話。

實際上(根據我的有限經驗),這是在Java中使用Timers的標准。

public class Start {

    private static Timer ourClock;
    public static String time;


    public static void update(){
        ourClock = new Timer();
        ourClock.scheduleAtFixedRate(new TimerTask(){
            public void run() {
            int seconds;
            int minutes;

            seconds++;

            if (seconds == 60) {
                seconds = 0;
                minutes++;
            }

            String s = String.valueOf(seconds);
            String m = String.valueOf(minutes);

            if (seconds < 10) {
                time = (m + ":0" + s);
                } else {
                time = (m + ":" + s);
            }
        },1000,1000);
    }
 }

您可以在此找到一些很好的例子@

雖然這個問題是其他問題的重復,但我認為它更像是Java具有其他語言所沒有的觀點或范例問題。 通常,內部或嵌套類的使用實際上是您在日常Java中看到的。 但是,它在C ++和C#中大受打擊。 在某些情況下,這被認為是非常糟糕的做法(PHP),而在其他情況下,則完全不允許這樣做(Objective-C)。

話雖如此,僅僅因為一個人不喜歡它並不意味着不應該使用它,而是您應該查看為什么要使用它,以及它如何適合您的環境。

暫無
暫無

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

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