【问题标题】:Java - Game code acts differently between Mac and WindowsJava - Mac 和 Windows 之间的游戏代码行为不同
【发布时间】:2017-07-21 11:26:05
【问题描述】:
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 方法,所以我认为我不会有不好的时间。

【问题讨论】:

标签: java


【解决方案1】:

关键事件因操作系统而异。当 Mac OS 可能只创建一个键时,Windows 可能会在按下某个键时快速创建类型化事件。

解决方案是使用key bindings 而不是键事件,尽管您可能会幸运地找到适用于两种操作系统的keyPressedkeyReleased 的组合(仍然建议只使用键绑定)。

【讨论】:

    【解决方案2】:

    AWT 的行为可能因操作系统而异,请参阅 this post

    AWT 是操作系统中存在的本机系统 GUI 代码的 Java 接口。尽管它会尝试,但它不会在每个系统上都以相同的方式工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-19
      • 2012-11-25
      相关资源
      最近更新 更多