我是 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/