所以我为短片游戏写了一个基础,这里是添加到我的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()
也不起作用。
感谢。
答案 0 :(得分:0)
public void keyPressed(...)
只会被称为一次。此外,您的播放器每次点击仅移动一个像素。
您需要使用keyPressed
来标记密钥已关闭,并使用keyReleased
标记密钥已关闭,从而管理密钥状态。
当您的密钥关闭时,您需要不断添加到playerX
和/或playerY
。
答案 1 :(得分:0)
问题是在修改了玩家的X或Y值之后我没有调用repaint()
!