2013-03-14 63 views
1

我是一個初學者/中級java程序員,他正試圖編寫一些「超出我的聯盟」的東西。該程序應通過按下與不同評分值對應的鍵實時判斷拳擊/ MMA匹配。我發現我需要一個KeyListener,而且我發現使用它的唯一方法就是使用一個applet。如何使用applet運行(僞)主要方法?

我遇到的問題是我必須打印出來的keyPresses和keyReleases得分的唯一線索。我希望得分能夠隨時間打印每秒。我做了一個時鐘函數,可以每秒用一個主要方法打印另一個類,但我不知道如何在applet中執行此操作。

這是我到目前爲止有:

import java.applet.Applet; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.util.ArrayList; 
import javax.swing.*; 

public class KeyPressTwo 
extends Applet 
implements KeyListener{ 

private long t; 
private ArrayList<Integer> keysDown = new ArrayList<Integer>(); 
private double controlOnlyValue = 1; //Stores the score per second for control only 
private double threateningValue = 2.5; //Score for threatening with strikes, i.e. landing sig strikes, or sub attempts 
private double damagingValue = 4; //Score for doing significant damage and dominating hea 
private static double redTotal = 0; //Stores fighter score 
private static double blueTotal = 0; 
private static boolean firstRun = true; 
private static boolean start = false; 
private static boolean releasePressed = false; //Tells KeysReleased method when to wipe keysDown list 
private static long roundBeganAt = 0; //System time when the round began 5 
private static String redName; 
private static String blueName; 


public void init(){  
    this.addKeyListener(this); 
    //If names aren't hardcoded in, get them when the program is run 
    if (redName == null){ 
     redName = JOptionPane.showInputDialog("Enter the red corner fighter's name."); 
     blueName = JOptionPane.showInputDialog("Enter the blue corner fighter's name."); 
    } 

} 

public void paint(){   
    setSize(500,500); 
} 


@Override 
public void keyPressed(KeyEvent e) {    

    if(!keysDown.contains(e.getKeyCode())) 
     keysDown.add(e.getKeyCode()); 

    //Starts the timer, don't print anything until started 
    if(keysDown.contains(KeyEvent.VK_SPACE)){ 
     start = true; 
     roundBeganAt = System.currentTimeMillis(); 
    } 

    //If it's been more than 1s 
    if(nextStep()){  
     //If space has been pushed 
     if(start){ 
      if(keysDown.contains(KeyEvent.VK_Z) || keysDown.contains(KeyEvent.VK_NUMPAD1)){ 
       redTotal += controlOnlyValue; 
      } 
      if(keysDown.contains(KeyEvent.VK_X) || keysDown.contains(KeyEvent.VK_NUMPAD4)){ 
       redTotal += threateningValue; 
      } 
      if(keysDown.contains(KeyEvent.VK_C) || keysDown.contains(KeyEvent.VK_NUMPAD7)){ 
       redTotal += damagingValue; 
      } 
      if(keysDown.contains(KeyEvent.VK_COMMA) || keysDown.contains(KeyEvent.VK_NUMPAD3)){ 
       blueTotal += controlOnlyValue; 
      } 
      if(keysDown.contains(KeyEvent.VK_M) || keysDown.contains(KeyEvent.VK_NUMPAD6)){ 
       blueTotal += threateningValue; 
      } 
      if(keysDown.contains(KeyEvent.VK_N) || keysDown.contains(KeyEvent.VK_NUMPAD9)){ 
       blueTotal += damagingValue; 
      } 
      System.out.print("\n" +redName +": " +redTotal +" \t" +blueName +": " +blueTotal +"\t\t" +time()); 
      releasePressed = true; 
     } 
    } 
} 

//Prints time since start (e.g. 2:05) 
private static String time() {  
    String minutes = ""; 
    String seconds = ""; 
    int sRaw; //Gets time directly from system, will go above 60 
    int s; //Gets time from sRaw, (0 - 59) 

    sRaw = (int)((System.currentTimeMillis() - roundBeganAt))/1000; 
    s = sRaw%60; 

    minutes = Integer.toString(sRaw/60); 
    if(s < 10) 
     seconds = "0" +Integer.toString(s); 
    else seconds = Integer.toString(s); 


    return minutes +":" +seconds; 
} 

//Returns true if it's been more than1s since the last time it ran 
public boolean nextStep() { 
    if(firstRun){ 
     t = System.currentTimeMillis(); 
     firstRun = false; 
     return true; 
    } 
    if(System.currentTimeMillis() > t + 1000){ 
     t = System.currentTimeMillis(); 
     return true;    
    }else 
     return false; 
} 


public void printList(){ 
    for(int i : keysDown) 
     System.out.print(i +" "); 
    System.out.println(); 
} 

@Override 
public void keyReleased(KeyEvent e) { 

    if(releasePressed){ 
     keysDown.clear(); 
     releasePressed = false; 
    } 

} 

@Override 
public void keyTyped(KeyEvent e) { 

} 
} 

回答

1

可能沿着這些路線的東西會爲你工作:

Thread timerOutputThread = new Thread(new Runnable(){ 
    public boolean running = true; 
    public void run(){ 
     output(); 
    } 
    private void output(){ 
     try { 
      Thread.sleep(1000); 
     } catch(Exception ex) { 
      ex.printStackTrace(); 
     } 
     System.out.println("PRINT THE SCORE HERE"); 
     if(running){ 
      output(); 
     } 
    } 
}); 
timerOutputThread.start(); 

棒,無論你想線程定時器啓動代碼,然後填寫那個表示「在這裏打印比分」的地方。

+1

謝謝。我只是在init()中複製/粘貼了這個權限,插入了我所說的printScore(),並且它工作得很好。 – user2171472 2013-03-16 05:01:02

+0

@ user2171472太棒了!很高興我能幫上忙! – 2013-03-16 23:37:14

1

我已經想通了,我需要一個KeyListener的,..」

或最好key bindings

..和我發現使用的唯一方式,是與

的applet。如果地球上沒有你聽到了嗎?!?這絕對是錯誤的。開始使用JFrame爲這個應用程序,它會をrk更好,因爲重點會更可靠。

+0

我一定會檢查出鍵綁定,我知道必須有比我所做的更簡單的方法。我使用applet的唯一原因是我觀看的YouTube KeyListener教程放在一個applet中,所以這是我知道如何使用它的唯一方法。我有很多東西需要學習,這是一個很好的推動正確的方向,謝謝。 – user2171472 2013-03-15 03:20:32

相關問題