Java,我的图像不会更新/移动

标签 java image swing repaint keylistener

我是 Java 方面的新手,但是.. 在网上阅读了大量内容后,我一直在尝试开发这款游戏并开始使用,我正在处理一些图像。我正在尝试更新他们的位置,以展示当然是通过 KeyListener 的移动,我相信。不幸的是,图像仍然在同一个地方并且拒绝移动 D:

我确信我把这段代码的某些部分复杂化了,但这里是:\

public class Game extends javax.swing.JPanel implements ActionListener, KeyListener{

    private Vladimir vlad;
    private Timer timer;

    public Game() {
        addKeyListener(this);
        setPreferredSize(new Dimension(1024,768));
        setDoubleBuffered(true);

        vlad = new Vladimir();
        timer = new Timer(15,this);
        timer.start();
    }

    public void actionPerformed (ActionEvent e){
        repaint();
    }

    private void toggleKey(int keyCode, boolean pressed){
        if (keyCode == 87){ // W
             vlad.move("UP", pressed);
        }

        if (keyCode == 83){ // S
            vlad.move("DOWN", pressed);
        }

        if (keyCode == 65) // A
        {
            vlad.move("LEFT", pressed);
        }

        if (keyCode == 68) // D
        {
            vlad.move("RIGHT", pressed);
        }
    }

    public void keyPressed(KeyEvent e)
    {
        toggleKey(e.getKeyCode(), true);
    }

    public void keyReleased(KeyEvent e)
    {
        toggleKey(e.getKeyCode(), false);
    }

    public void keyTyped(KeyEvent e){

    }

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        Graphics g2d = (Graphics2D)g;
        g2d.drawImage(vlad.getGrassMap(),0,0,this);
        g2d.drawImage(vlad.getCharOne(),vlad.getX(),vlad.getY(),this);

        repaint();


      }
}

然后..

public class Vladimir{

    private int x;
    private int y;
    private Image grassMapOne;
    private Image charOne;
    private String gMapLocate = "/phantasma/resources/GrassMap1.png";
    private String charOneLocate = "/phantasma/resources/moveright1.png";

    public Vladimir(){
        ImageIcon gMap1 = new ImageIcon(this.getClass().getResource(gMapLocate));
        ImageIcon char1 = new ImageIcon(this.getClass().getResource(charOneLocate));
        grassMapOne = gMap1.getImage();
        charOne = char1.getImage();
        x = 512;
        y = 350;
    }

    public void move(String direction, boolean keyHeld){
        if (direction == "UP"){
            y += 12;
        }

        if (direction == "DOWN"){
            y -= 12;
        }

        if (direction == "LEFT"){
            x -= 12;
        }

        if (direction == "RIGHT"){
            x += 12;
        }
    }

    public int getX(){
        return x;
    }

    public int getY(){
        return y;
    }

    public Image getGrassMap(){
        return grassMapOne;
    }

    public Image getCharOne(){
        return charOne;
    }
}

最佳答案

首先,您需要先知道问题出在哪里,然后才能修复它,因此您应该首先问问自己,不是为什么图像不动,而是关键的听众是否在听?如果您添加像这样的 println 语句:

public void keyPressed(KeyEvent e) {
    System.out.println("in keyPressed. keyCode is: " + e.getKeyCode());
    toggleKey(e.getKeyCode(), true);
}

您会发现它不是,它需要一个能够接收焦点并且实际上具有焦点的组件。

您需要将 JPanel 的 focusable 属性设置为 true,然后在它呈现后让它 acceptFocusInWindow()

更好的是——使用key bindings ,因为它们在关注焦点问题时更加灵活,并且是更高层次的结构。它们实际上是 Swing 本身用来让组件对按键使用react的东西。

接下来,不要使用 == 来比较 String,因为这只会检查两个 String 对象是否相同,你不关心的事情。相反,您想知道一个 String 是否具有与另一个 String 相同顺序的相同字符,为此您想使用 String' s equals(...) 方法或其 equalsIgnoreCase(...) 方法。

关于Java,我的图像不会更新/移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8529698/

相关文章:

java - 我应该如何创建 Java 应用程序,在哪里放置类?

java - 为什么我运行这段代码时永远不会死锁?

java - 如何对 Eclipse 项目使用非 URLClassLoader 类加载器,或者以其他方式检测我正在 Eclipse 中运行?

java - 打印数组/反转数组

python - 将 RGBA numpy 数组转换为二进制 2d numpy 数组

java - 如何插入图像 .gif 文件而不是 filloval?

java - 悬停时图像变化 Java

Java swing鼠标悬停弹出小框显示详情怎么办

java - 以正确的方式更新 jLabel 和 jTextField

java - 为 ProgressBar Java 添加容器监听器