当我添加我的关键听众时,为什么我的角色不会移动

时间:2016-06-25 17:19:00

标签: java swing

所以我为短片游戏写了一个基础,这里是添加到我的JFrame的面板类:

package io.ryanshah;

import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;
import javax.swing.JPanel;

import io.ryanshah.entity.player.EntityPlayer;
import io.ryanshah.util.TextureResource;

public class GamePanel extends JPanel implements KeyListener
{
    protected JFrame parentWindow;
    protected EntityPlayer player;

    private TextureResource playerImg;
    private TextureResource platformBg = new TextureResource("res/platform.png");

    private int playerX, playerY;

    public GamePanel(GameWindow parentWindow) {
        super();

        addKeyListener(this);
        setFocusable(true);

        this.parentWindow = parentWindow;
        player = parentWindow.mainPlayer;

        playerImg = player.getEntityTexture();

        playerX = (parentWindow.getWidth() / 2) - (player.getEntityTexture().getImage().getWidth() / 2);
        playerY = parentWindow.getHeight() - 150 - player.getEntityTexture().getImage().getHeight();
    }

    public void keyPressed(KeyEvent e) {
        if(e.getKeyCode() == KeyEvent.VK_A) {
            playerX--;
        }
        if(e.getKeyCode() == KeyEvent.VK_D) {
            playerX++;
        }
        if(e.getKeyCode() == KeyEvent.VK_SPACE
                || e.getKeyCode() == KeyEvent.VK_W) {
            playerY++;
        }
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        g.drawImage(platformBg.getImage(), 0, parentWindow.getHeight() - 150, null);
        g.drawImage(playerImg.getImage(), playerX, playerY, null);
    }

    public void keyTyped(KeyEvent e) {
    }
    public void keyReleased(KeyEvent e) {
    }
}

我之前已经完成了KeyListener,所以我不知道这里的问题是什么!希望有人可以解释为什么它不工作:)

编辑:我使用setContentPane()将我的面板添加到框架中,但使用add()也不起作用。

感谢。

2 个答案:

答案 0 :(得分:0)

当您按下某个键时,

public void keyPressed(...)只会被称为一次。此外,您的播放器每次点击仅移动一个像素。

您需要使用keyPressed来标记密钥已关闭,并使用keyReleased标记密钥已关闭,从而管理密钥状态。

当您的密钥关闭时,您需要不断添加到playerX和/或playerY

答案 1 :(得分:0)

问题是在修改了玩家的X或Y值之后我没有调用repaint()