Java - 游戏代码在Mac和Windows之间的行为不同

时间:2017-03-01 22:42:49

标签: java

import java.awt.*;
import java.awt.event.*;
import javax.swing.JFrame;



public class Game extends JFrame implements KeyListener
{
    private int charX;
    private int charY;

    public Game()
    {
        charX = 250;
        charY = 450;
        this.setSize(500, 500);
        addKeyListener(this);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }


    public void keyTyped(KeyEvent event)
    {
        if(event.getKeyChar() == 'a')
            charX-=5;
        else if(event.getKeyChar() == 'd')
            charX+=5;
        else if(event.getKeyChar() == 'w')
            charY-=5;
        else if(event.getKeyChar() == 's')
            charY+=5;
        if(charX > 485)
            charX-=6;
        else if(charX < 10)
            charX+=6;
        if(charY > 485)
            charY-=6;
        else if(charY < 30)
            charY+=6;
        repaint();
    }

    public void keyPressed(KeyEvent event)
    {
    }

    public void keyReleased(KeyEvent event)
    {
    }

    public void paint(Graphics g)
    {
        super.paint(g);
        g.setColor(Color.BLACK);
        g.fillRect(charX, charY, 10, 10);
    }

    public static void main(String args[])
    {
        Frame frm = new Game();
        frm.setVisible(true);
        frm.repaint();
    }
}

在学校我使用Mac,在家里我使用带有Windows 10的PC。在Mac上,此代码的行为与Windows版本不同。在Mac版本中,事情按预期进行,字符(方形)仅在每次按键时移动一点。但是在Windows上,如果按任意方向(如d),角色将继续向右移动,即使它只应该被调用一次。不仅如此,绘画时框架也不断闪烁。所以我想知道为什么Mac和Windows之间的版本之间存在差异,以及我如何解决Windows上的闪烁问题。我打算稍后添加keyPressed和keyReleased方法,所以我不认为我会有不好的时间。

2 个答案:

答案 0 :(得分:5)

操作系统之间的关键事件不同。当Mac OS可能只创建一个密钥时,Windows可能会在密钥关闭时快速创建类型化事件。

解决方案是使用key bindings代替关键事件,尽管您可能会找到适用于这两种操作系统的keyPressedkeyReleased组合的运气(但仍建议使用只需使用键绑定)。

答案 1 :(得分:2)

AWT的行为可能会有所不同,具体取决于操作系统,请参阅this post

  

AWT是操作系统中存在的本机系统GUI代码的Java接口。它在每个系统上都不会起作用,尽管它会尝试。