我做了一个小游戏,里面有两辆坦克,怎么做才可以两个人同时在键盘上操作各自的坦克呢?就像泡泡堂一样。现在某一时刻只能操作其中一辆。程序大至如下
  jFrame.addKeyListener(tank1);
  jFrame.addKeyListener(tank2);class tank extends JPanel implements KeyListener{
.......
}

解决方案 »

  1.   

    把键盘分两个区 对应两个tank
      

  2.   

    这只是逻辑上的分区相当于哪几个键按下 就只指挥tank1,
    另外几个键按下,指挥tank2
      

  3.   

    public void actionPerformed(KeyEvent  e)
    {
        if(某几个键)坦克1……;
        if(另外几个键) 坦克2……;
    }
    这样算不算逻辑分区啊?
      

  4.   

    我想是不是可以这样做,一个坦克类为一个线程,但是不需要用坦克类所联接的VIEW去接收键盘事件,可以考虑用一个总的VIEW去接收键盘事件,然后根据键盘定义分发到所属的坦克类。
      

  5.   

    我也遇到过这一类问题,就是方向键,如果同时按下两个要怎么处理
    我的方法是实现两个方法,keyPressed和keyReleased,同时对要做处理的按键做个标识,
    如果pressed,标时为true,released的时候变为false,这样就可以根据标识来处理相应的事件
    至少问题是解决了。只是我的做法,提供参考而已。
      

  6.   

    不太明白上面两位所说的,现在把我的代码放在下面,有空帮我修改一下,我是java初学者,多多指教import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;class TankThread extends JFrame{
    Weapon tank;
    Weapon tank1;
    Button shell;
    Button shell2;
    Thread t;
    public TankThread(){
    getContentPane().setLayout(null);
    //setLayout(null);
    setSize(600,500);
    setBackground(new Color(193,193,193));
    addWindowListener(new WinAd(this)); tank = new Weapon(1,this);
    tank1 = new Weapon(2,this);
    //tank1 = new NewTank("坦克",this);
    // tank1.setLocation(325,400);
    JPanel p = new JPanel();
    p.setLocation(200,300);
    p.setSize(30,50);
    tank.setLocation(225,400);
    tank1.setLocation(200,300);
    addKeyListener(tank);
    addKeyListener(tank1);

    getContentPane().add(tank);

    t=(new Thread(){
    public void run(){getContentPane().add(tank1); }});
    //add(tank);
    t.start();
    shell = new Button();
    shell.setSize(8,8);
    shell.setBackground(new Color(10,10,10));
    shell.setVisible(false);
    shell.setFocusable(false);
    getContentPane().add(shell); shell2 = new Button();
    shell2.setSize(8,8);
    shell2.setBackground(new Color(255,10,10));
    shell2.setVisible(false);
    shell2.setFocusable(false);
    getContentPane().add(shell2); // getContentPane().add(p);
    //add(shell);
    setLocation();
    setVisible(true);
    } public static void main(String[] args) 
    {
       new TankThread();
    } public void setLocation(){
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    Dimension frameSize = this.getSize();
    if (frameSize.height > screenSize.height) {
    frameSize.height = screenSize.height;
    }
    if (frameSize.width > screenSize.width) {
    frameSize.width = screenSize.width;
    }
    this.setLocation( (screenSize.width - frameSize.width) / 2,
                         (screenSize.height - frameSize.height) / 2);
    this.setVisible(true);
    }
    }
    class WinAd extends  WindowAdapter{
    private Frame frame;
    public WinAd(Frame frame){
    this.frame = frame;
    }
    public void windowClosing(WindowEvent e){
    frame.setVisible(false);
    frame.dispose();
    System.exit(0);
    }
    }class Weapon extends JPanel implements KeyListener{
    int strType;
    TankThread jframe;
    BulletThread bt1,bt2;
    Thread t;
    static int fkey;
    Weapon wp;
    private int orient = 1;
    public Weapon(int strType,TankThread jframe){
    this.strType = strType;
    this.jframe = jframe;
    if (strType==1 || strType==2){
    this.setSize(50,50);
    }else{
    this.setSize(10,10);
    }
    wp = this;
    //addKeyListener(this);
    } public void paintComponent(Graphics g){
    super.paintComponent(g);
    if(strType==1 || strType==2){
    g.setColor(new Color(112,111,153));
    if(orient == 1){
    g.fill3DRect(0,15,10,50,true);
    g.fill3DRect(10,25,30,15,true);
    g.fill3DRect(40,15,50,50,true); 
    g.fillOval(15,15,20,20); 
    g.fill3DRect(22,0,6,20,true); 
    }
    if(orient == 2){
    g.fill3DRect(15,0,35,10,true);
    g.fill3DRect(25,10,15,30,true);
    g.fill3DRect(15,40,35,10,true);
    g.fillOval(15,15,20,20);
    g.fill3DRect(0,22,20,6,true);
    }
    if(orient == 3){
    g.fill3DRect(0,0,10,35,true);
    g.fill3DRect(10,10,30,15,true);
    g.fill3DRect(40,0,10,35,true);
    g.fillOval(15,15,20,20);
    g.fill3DRect(22,30,6,20,true); 
    }
    if(orient == 4){
    g.fill3DRect(0,0,35,10,true);
    g.fill3DRect(10,10,15,30,true);
    g.fill3DRect(0,40,35,10,true);
    g.fillOval(15,15,20,20);
    g.fill3DRect(30,22,20,6,true); 
    }
    }else{
    g.setColor(Color.black);
    g.fillOval(0,0,10,10);
    }
       }   public void keyPressed(final KeyEvent e){    
    //   t = (new Thread(){
    //   public void run(){
    int x = getLocation().x;
         int y = getLocation().y;
    if (e.getKeyCode()==KeyEvent.VK_LEFT && (strType==1)){
    orient = 2;
    if ( x > 0 ){
    setLocation((int)x-5,(int)y);
    }
    }
    if (e.getKeyCode()==KeyEvent.VK_RIGHT && strType==1){
    orient = 4;
    if (x+(int)getSize().getWidth()<jframe.getSize().getWidth()){
    setLocation((int)x+5,(int)y);
    }
    }
    if (e.getKeyCode()==KeyEvent.VK_UP && strType==1){
    orient = 1;
    if(y > 0){
    setLocation((int)x,(int)y-5);
    }
    }
    if (e.getKeyCode()==KeyEvent.VK_DOWN && strType==1){
    orient = 3;
    if( y + (int)getSize().getHeight() < jframe.getSize().getHeight() ){
    setLocation((int)x,(int)y+5);
    }
    } if (e.getKeyCode()==KeyEvent.VK_A && strType==2){
    orient = 2;
    if ( x > 0 ){
    setLocation((int)x-5,(int)y);
    }
    }
    if (e.getKeyCode()==KeyEvent.VK_D && strType==2){
    orient = 4;
    if (x+(int)getSize().getWidth()<jframe.getSize().getWidth()){
    setLocation((int)x+5,(int)y);
    }
    }
    if (e.getKeyCode()==KeyEvent.VK_W && strType==2){
    orient = 1;
    if(y > 0){
    setLocation((int)x,(int)y-5);
    }
    }
    if (e.getKeyCode()==KeyEvent.VK_S && strType==2){
    orient = 3;
    if( y + (int)getSize().getHeight() < jframe.getSize().getHeight() ){
    setLocation((int)x,(int)y+5);
    }
    }
    try{Thread.sleep(1);}catch(Exception me){}
    // }
    //   });
     // t.start();
       if(e.getKeyCode()==KeyEvent.VK_SPACE && strType==1){
    if (!jframe.shell.isVisible()){
    bt1 = new BulletThread(jframe,orient,wp,jframe.shell);
    bt1.start();
    System.out.println("test");
    }
       }     if(e.getKeyCode()==KeyEvent.VK_J && strType==2){
    if (!jframe.shell2.isVisible()){
    bt2 = new BulletThread(jframe,orient,this,jframe.shell2);
    bt2.start();
    System.out.println("test2");
    }
       }
       repaint();   
       }   public void keyReleased(KeyEvent e){}    public void keyTyped(KeyEvent e) {}}
    class BulletThread extends Thread{ 
    TankThread jframe;
    int orient;
    int x,y;
    Button bullet;

    public BulletThread(TankThread jframe, int orient, Weapon wp,Button bullet){
    this.jframe = jframe;
    this.orient = orient;
    this.bullet = bullet;
    x = wp.getLocation().x;
    y = wp.getLocation().y;
    } public void run(){
    System.out.println("Thread start");
    bullet.setVisible(true);
    if(orient==1){
    bullet.setLocation(x+20,y-10);
    while(true){
    int h = bullet.getLocation().y;
    int w = bullet.getLocation().x;
    if(h<0){
    bullet.setVisible(false);
    break;
    }
    bullet.setLocation(w,h-5);
    try{Thread.sleep(20);}catch(Exception me){}
    }
    }
    if(orient == 3){
    bullet.setLocation(x+20,y+50);
    while(true){
    int h = bullet.getLocation().y;
    int w = bullet.getLocation().x;
    if(h>jframe.getSize().getHeight()){
    bullet.setVisible(false);
    break;
    }
    bullet.setLocation(w,h+5);
    try{Thread.sleep(20);}catch(Exception me){}
    }
    } if(orient == 2){
    bullet.setLocation(x-10,y+20);
    while(true){
    int h = bullet.getLocation().y;
    int w = bullet.getLocation().x;
    if(w < 0){
    bullet.setVisible(false);
    break;
    }
    bullet.setLocation(w-5,h);
    try{Thread.sleep(20);}catch(Exception me){}
    }
    } if(orient == 4){
    bullet.setLocation(x+50,y+20);
    while(true){
    int h = bullet.getLocation().y;
    int w = bullet.getLocation().x;
    if(w > jframe.getSize().getWidth()){
    bullet.setVisible(false);
    break;
    }
    bullet.setLocation(w+5,h);
    try{Thread.sleep(20);}catch(Exception me){}
    }
    }
    }
    }
      

  7.   

    我修改了你的武器类,主要是加了boolean upFlag等一些变量,然后在keyPressed方法里把对应的flag设为true,keyReleased方法里对应的flag设成false,然后开了一个线程,循环调用方法reDraw(),具体的重画都在reDraw()方法里,只不过是判断条件变了。线程的break没有设置,你自己加个条件吧。
    我也是自己编小游戏玩的时候遇到这个问题,自己想的招,我编游戏就是知道了repaint()方法和事件监听这两个方法,原则上游戏就是这两个方法的结合。在一个类里调用另一个类把自己也作为参数,我还没用过,看来很有用。哈哈,我其实也是菜鸟,对于技巧性的东西比较感兴趣。有什么好的创意可以讨论讨论阿。
    我的qq:13781120  email: [email protected] 
    class Weapon
        extends JPanel
        implements KeyListener,Runnable {
      int strType;
      TankThread jframe;
      BulletThread bt1, bt2;
      Thread t;
      static int fkey;
      //Weapon wp;
      boolean upFlag = false;
      boolean downFlag = false;
      boolean leftFlag = false;
      boolean rightFlag = false;
      boolean wFlag = false;
      boolean sFlag = false;
      boolean aFlag = false;
      boolean dFlag = false;
      boolean spaceFlag = false;
      boolean jFlag = false;
      private int orient = 1;
      public Weapon(int strType, TankThread jframe) {
        this.strType = strType;
        this.jframe = jframe;
        if (strType == 1 || strType == 2) {
          this.setSize(50, 50);
        }
        else {
          this.setSize(10, 10);
        }
        t = new Thread(this);
        t.start();
        //wp = this;
        //addKeyListener(this);
      }
      public void run(){
        for( ; ; ){
          reDraw();
          try{
            Thread.sleep(100);
          }catch(InterruptedException e){}
        }
      }  public void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (strType == 1 || strType == 2) {
          g.setColor(new Color(112, 111, 153));
          if (orient == 1) {
            g.fill3DRect(0, 15, 10, 50, true);
            g.fill3DRect(10, 25, 30, 15, true);
            g.fill3DRect(40, 15, 50, 50, true);
            g.fillOval(15, 15, 20, 20);
            g.fill3DRect(22, 0, 6, 20, true);
          }
          if (orient == 2) {
            g.fill3DRect(15, 0, 35, 10, true);
            g.fill3DRect(25, 10, 15, 30, true);
            g.fill3DRect(15, 40, 35, 10, true);
            g.fillOval(15, 15, 20, 20);
            g.fill3DRect(0, 22, 20, 6, true);
          }
          if (orient == 3) {
            g.fill3DRect(0, 0, 10, 35, true);
            g.fill3DRect(10, 10, 30, 15, true);
            g.fill3DRect(40, 0, 10, 35, true);
            g.fillOval(15, 15, 20, 20);
            g.fill3DRect(22, 30, 6, 20, true);
          }
          if (orient == 4) {
            g.fill3DRect(0, 0, 35, 10, true);
            g.fill3DRect(10, 10, 15, 30, true);
            g.fill3DRect(0, 40, 35, 10, true);
            g.fillOval(15, 15, 20, 20);
            g.fill3DRect(30, 22, 20, 6, true);
          }
        }
        else {
          g.setColor(Color.black);
          g.fillOval(0, 0, 10, 10);
        }
      }  public void keyPressed(final KeyEvent e) {
        int code = e.getKeyCode();
        switch(code){
          case KeyEvent.VK_LEFT:
            leftFlag = true;
            break;
          case KeyEvent.VK_RIGHT:
            rightFlag = true;
            break;
          case KeyEvent.VK_UP:
            upFlag = true;
            break;
          case KeyEvent.VK_DOWN:
            downFlag = true;
            break;
          case KeyEvent.VK_A:
            aFlag = true;
            break;
          case KeyEvent.VK_W:
            wFlag = true;
            break;
          case KeyEvent.VK_S:
            sFlag = true;
            break;
          case KeyEvent.VK_D:
            dFlag = true;
            break;
          case KeyEvent.VK_SPACE:
            spaceFlag = true;
            break;
          case KeyEvent.VK_J:
            jFlag = true;
            break;
        }
      }  public void keyReleased(KeyEvent e) {
        int code = e.getKeyCode();
        switch (code) {
          case KeyEvent.VK_LEFT:
            leftFlag = false;
            break;
          case KeyEvent.VK_RIGHT:
            rightFlag = false;
            break;
          case KeyEvent.VK_UP:
            upFlag = false;
            break;
          case KeyEvent.VK_DOWN:
            downFlag = false;
            break;
          case KeyEvent.VK_A:
            aFlag = false;
            break;
          case KeyEvent.VK_W:
            wFlag = false;
            break;
          case KeyEvent.VK_S:
            sFlag = false;
            break;
          case KeyEvent.VK_D:
            dFlag = false;
            break;
          case KeyEvent.VK_SPACE:
            spaceFlag = false;
            break;
          case KeyEvent.VK_J:
            jFlag = false;
            break;
        }
      }  public void keyTyped(KeyEvent e) {}
      public void reDraw(){
        int x = getLocation().x;
        int y = getLocation().y;
        if (leftFlag && (strType == 1)) {
          orient = 2;
          if (x > 0) {
            setLocation( (int) x - 5, (int) y);
          }
        }
        if (rightFlag && strType == 1) {
          orient = 4;
          if (x + (int) getSize().getWidth() < jframe.getSize().getWidth()) {
            setLocation( (int) x + 5, (int) y);
          }
        }
        if (upFlag && strType == 1) {
          orient = 1;
          System.out.println("1");
          if (y > 0) {
            setLocation( (int) x, (int) y - 5);
          }
        }
        if (downFlag && strType == 1) {
          orient = 3;
          System.out.println("3");
          if (y + (int) getSize().getHeight() < jframe.getSize().getHeight()) {
            setLocation( (int) x, (int) y + 5);
          }
        }    if (aFlag && strType == 2) {
          orient = 2;
          if (x > 0) {
            setLocation( (int) x - 5, (int) y);
          }
        }
        if (dFlag && strType == 2) {
          orient = 4;
          if (x + (int) getSize().getWidth() < jframe.getSize().getWidth()) {
            setLocation( (int) x + 5, (int) y);
          }
        }
        if (wFlag && strType == 2) {
          orient = 1;
          if (y > 0) {
            setLocation( (int) x, (int) y - 5);
          }
        }
        if (sFlag && strType == 2) {
          orient = 3;
          if (y + (int) getSize().getHeight() < jframe.getSize().getHeight()) {
            setLocation( (int) x, (int) y + 5);
          }
        }
        try {
          Thread.sleep(1);
        }
        catch (Exception me) {}    if (spaceFlag && strType == 1) {
          if (!jframe.shell.isVisible()) {
            bt1 = new BulletThread(jframe, orient, this, jframe.shell);
            bt1.start();
            System.out.println("test");
          }
        }    if (jFlag && strType == 2) {
          if (!jframe.shell2.isVisible()) {
            bt2 = new BulletThread(jframe, orient, this, jframe.shell2);
            bt2.start();
            System.out.println("test2");
          }
        }
        repaint();  }}
      

  8.   

    Thread.sleep(100);
    当然不会流畅了,你可以调整一下sleep的时间和reDraw()方法里的每次移动的距离
      

  9.   

    ytll(尘缘如梦) 请问你的想法怎么去实现,我现在还没有VIEW这个概念