Java-游戏代码在Mac和Windows之间的作用不同 import java.awt.*; 导入java.awt.event.*; 导入javax.swing.JFrame; 公共类游戏扩展JFrame实现KeyListener { 私有整数字符; 私家车; 公共游戏() { charX=250; charY=450; 这个。设置大小(500500); addKeyListener(此); 此.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public void keyTyped(KeyEvent事件) { 如果(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; 如果(字符数>485) charX-=6; 否则如果(字符485) charY-=6; 否则如果(charY

Java-游戏代码在Mac和Windows之间的作用不同 import java.awt.*; 导入java.awt.event.*; 导入javax.swing.JFrame; 公共类游戏扩展JFrame实现KeyListener { 私有整数字符; 私家车; 公共游戏() { charX=250; charY=450; 这个。设置大小(500500); addKeyListener(此); 此.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public void keyTyped(KeyEvent事件) { 如果(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; 如果(字符数>485) charX-=6; 否则如果(字符485) charY-=6; 否则如果(charY,java,Java,在学校我使用Mac电脑,在家我使用装有Windows10的电脑。在Mac上,此代码的行为往往与Windows版本不同。在Mac版本中,字符(正方形)在每次按键时只移动一点,一切都如预期的那样进行。但是,在Windows上,如果按任意方向(如d),角色将继续向右移动,即使它本应只被调用一次。不仅如此,画框在绘画时也会不断闪烁。所以我想知道为什么Mac和Windows之间的版本会有差异,我该如何解决Windows上的闪烁问题。我计划稍后添加keyPressed和KeyRelease方法,这样我就不会

在学校我使用Mac电脑,在家我使用装有Windows10的电脑。在Mac上,此代码的行为往往与Windows版本不同。在Mac版本中,字符(正方形)在每次按键时只移动一点,一切都如预期的那样进行。但是,在Windows上,如果按任意方向(如d),角色将继续向右移动,即使它本应只被调用一次。不仅如此,画框在绘画时也会不断闪烁。所以我想知道为什么Mac和Windows之间的版本会有差异,我该如何解决Windows上的闪烁问题。我计划稍后添加keyPressed和KeyRelease方法,这样我就不会对它们感到不快了。

AWT的行为可能会因操作系统而异,请参见:

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


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


解决方案是使用而不是键事件,尽管您可能会幸运地发现
keyPressed
keyreased
的组合对两种操作系统都有效(仍然建议只使用键绑定)。

这可能有助于解决闪烁问题。闪烁是常见的,最好的策略是使用缓冲图像,以便屏幕上始终有图像,而不是在重新绘制之前删除场景。
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();
    }
}