[英]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.