2013-03-14 51 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