2015-11-20 54 views
1

当我运行该程序时,一切都显示出来,但是当我尝试移动键没有任何反应,如果有人知道这是为什么或如何解决它,它将不胜感激。我的Keylistener dosn't工作,我想知道为什么

我的主要游戏窗口类

public class GameWindow extends JFrame { 
    private static final long serialVersionUID = 1L; 
    public int WIDTH = 160, HEIGHT = WIDTH/12 * 9, SCALE = 3; 
    public boolean running = false; 
    BackGround bg = new BackGround(); 
    Ranger R = new Ranger(); 
    TimerClass T = new TimerClass(); 
    public static void main(String[] args) { 
     new GameWindow(); 
    } 
    public GameWindow() { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setSize(WIDTH * SCALE, HEIGHT * SCALE); 
     setResizable(false); 
     running = true; 
     add(bg); 
     bg.add(R); 
     bg.setFocusable(true); 
     R.setFocusable(true); 
     setFocusable(true); 
     setVisible(true); 
     bg.repaint(); 
     run(); 
    } 
    public void run() { 
     while (running) { 
      render(); 
     } 
    } 
    public void render() { 
     bg.setLocation(Ranger.bgX, Ranger.bgY); 
     R.setLocation(Ranger.X, Ranger.Y); 
     R.setIcon(Ranger.rangerA[Ranger.I]); 
     R.repaint(); 
     bg.repaint(); 
    } 
} 

我的游侠(我想移动精灵)类

public class Ranger extends JLabel implements KeyListener { 
    private static final long serialVersionUID = 1L; 
    public static int X, Y, dX, dY, bgX, bgY, I = 0, jumpTime = 100; 
    public static boolean moving = false, movingLeft = false, movingRight = false, onFloor = false, jumping = false, movingUp = false, movingDown = false; 
    public int totalImages = 6; 
    public BufferedImage ranger1, ranger2, ranger3, ranger4, ranger5, ranger6; 
    public static ImageIcon[] rangerA; 
    static TileMap TileMap = new TileMap(); 
    public Ranger() { 
     try { 
      ranger1 = ImageIO.read(getClass().getResource("/Images/Sprites/ranger/Ranger0.png")); 
      ranger2 = ImageIO.read(getClass().getResource("/Images/Sprites/ranger/Ranger1.png")); 
      ranger3 = ImageIO.read(getClass().getResource("/Images/Sprites/ranger/Ranger2.png")); 
      ranger4 = ImageIO.read(getClass().getResource("/Images/Sprites/ranger/Ranger3.png")); 
      ranger5 = ImageIO.read(getClass().getResource("/Images/Sprites/ranger/Ranger4.png")); 
      ranger6 = ImageIO.read(getClass().getResource("/Images/Sprites/ranger/Ranger5.png")); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     array(); 
    } 
    public void array() { 
     rangerA = new ImageIcon[6]; { 
      rangerA[0] = new ImageIcon(ranger1); 
      rangerA[1] = new ImageIcon(ranger2); 
      rangerA[2] = new ImageIcon(ranger3); 
      rangerA[3] = new ImageIcon(ranger4); 
      rangerA[4] = new ImageIcon(ranger5); 
      rangerA[5] = new ImageIcon(ranger6); 
     } 
    } 
    public static void move() { 
     X += dX; 
     Y += dY; 
     System.out.println("X =" + X + " Y= " + Y + " dX = " + dX + " dY= " + dY + " jumpTime= " + jumpTime + " "); 
     dX = 0; 
     dY = 0; 
     if (movingRight || movingLeft) { 
      moving = true; 
     } 
    }@Override 
    public void keyPressed(KeyEvent e) { 
     int keyCode = e.getKeyCode(); 
     if (keyCode == KeyEvent.VK_RIGHT) { 
      movingRight = true; 
     } 
     if (keyCode == KeyEvent.VK_LEFT) { 
      movingLeft = true; 
     } 
     if (keyCode == KeyEvent.VK_UP) { 
      jumping = true; 
      movingUp = true; 
     } 
     if (keyCode == KeyEvent.VK_DOWN) { 
      movingDown = true; 
     } 
     if (keyCode != KeyEvent.VK_RIGHT) { 
      movingRight = false; 
     } 
     if (keyCode != KeyEvent.VK_LEFT) { 
      movingLeft = false; 
     } 
     if (keyCode != KeyEvent.VK_UP) { 
      jumping = false; 
      movingUp = false; 
     } 
     if (keyCode != KeyEvent.VK_DOWN) { 
      movingDown = false; 
     } 
     if (keyCode == KeyEvent.VK_RIGHT) dX += 1; 
     if (movingRight) bgX -= 1; 
     if (keyCode == KeyEvent.VK_LEFT) dX += -1; 
     if (movingLeft) bgX += 1; 
     if (keyCode == KeyEvent.VK_DOWN) dY += 1; 
     if (movingUp) bgY += 1; 
     if (keyCode == KeyEvent.VK_UP) dY += -1; 
     if (movingDown) bgY += -1; 
    }@Override 
    public void keyReleased(KeyEvent e) {} 
    public void keyTyped(KeyEvent arg0) {} 
} 

我公司将提供所有的课,如果他们requred和感谢任何帮助,即使它是在编程约定。

+4

您没有添加keylistener(类似于'Ranger'类中的'this.addKeyListener(this);'),所以这就是为什么它不起作用。但我会建议1)使用[Key Bindings](https://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html),2)将Key绑定(或KeyListener)添加到面板,而不是标签。 –

+3

你疯狂的'while-loop'不会帮助 – MadProgrammer

+0

谢谢你的帮助,我不能承认它是如此简单的事情。 – jack

回答

1

不知道这是否可行,但尝试将addKeyListener(this);添加到GameWindow() 并让它实现KeyListener。然后将所有KeyListeners从Ranger移到GameWindow类。

此外,请确保KeyCode是正确的。 您可以通过在KeyPressed下添加System.out.println(e.getKeyCode); System.out.println(KeyEvent.VK_Whatever);并按下该键并确保它们匹配。

+0

感谢您的帮助,但LuxxMiner在评论中给出了解决方案,您有点迟到。 – jack

相关问题