Java-can不会让球移动

时间:2017-04-13 19:49:00

标签: java eclipse

问题在于没有错误,一切正常,即使我在if(keyevent == w)system.out.println(" something")中写一些东西;它也可以,但由于某些原因,球的位置没有变化,有什么建议吗?

Entity.Java

package FirstGame;

 import java.awt.Graphics;

public abstract class Entity {
protected int x,y,w,h;
protected boolean removed=false;

public Entity(int x,int y){
    this.x=x;
    this.y=y;

}
public void draw(Graphics g){

}
public int getX(){return x;}
public int getY(){return y;}
public int getW(){return w;}
public int getH(){return h;}

}

Player.Java

package FirstGame;

import java.awt.Color;
import java.awt.Graphics;

public class Player extends Entity {
public int xd,yd;
public Player(int x, int y) {
    super(x, y);
    w=16;
    h=16;
}
@Override
public void draw(Graphics g){
    g.setColor(Color.orange);
    g.fillOval(x, y, w, h);
}
private void move(){
    this.x+=xd;
    this.y+=yd;

}
public void setXD(int value){
    xd=value;
}
public void setYD(int value){
    yd=value;
}

}

Dodge.java

package FirstGame;

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

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

public class Dodge extends JPanel implements KeyListener{
private int x=5,y=5;
private static String title="Dodge Game";
private static int WIDTH=500;
private static int HEIGHT=400;

private Player player;

// Constructor //
public Dodge(){
    setSize(new Dimension(WIDTH,HEIGHT));
    setPreferredSize(new Dimension(WIDTH,HEIGHT));
    setFocusable(true);
    setBackground(Color.BLACK);
    addKeyListener(this);
    player=new Player(200,200);
}
@Override
public void update(Graphics g){
    paint(g);

}
public void paint(Graphics g){
    g.setColor(Color.BLACK);
    g.fillRect(0, 0,getWidth(), getHeight());
    player.draw(g);
    g.dispose();
    repaint();
}
public static void main(String[] args){
    Dodge game=new Dodge();
    JFrame frame=new JFrame();
    frame.setTitle(title);
    frame.add(game);
    frame.pack();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
    frame.setResizable(false);
}
@Override
public void keyPressed(KeyEvent e) {
    int c=e.getKeyCode();
    if(c==KeyEvent.VK_W){
        player.setYD(-1);

    }
    if(c==KeyEvent.VK_S){
        player.setXD(-1);
    }
    if(c==KeyEvent.VK_A){
        player.setYD(1);
    }
    if(c==KeyEvent.VK_D){
        player.setXD(1);
    }

}
@Override
public void keyReleased(KeyEvent e) {


}
@Override
public void keyTyped(KeyEvent e) {


}
}

1 个答案:

答案 0 :(得分:2)

在KeyListener中,不移动播放器坐标。您只需将它们设置为相同的值即可。所以,它不动。

@Override
public void keyPressed(KeyEvent e) {
    int c = e.getKeyCode();
    if (c == KeyEvent.VK_W) {
        player.setYD(-1);

    }
    if (c == KeyEvent.VK_S) {
        player.setXD(-1);
    }
    if (c == KeyEvent.VK_A) {
        player.setYD(1);
    }
    if (c == KeyEvent.VK_D) {
        player.setXD(1);
    }

}

此外,您不在move()课程中使用Player方法 您应该删除move()并重构setXD()setYD()方法以增加坐标。例如incrementX(int xValue)incrementY(int yValue)

public void incrementX(int value) {
    xd += value;
}

public void incrementY(int value) {
    yd += value;
}

你还有其他问题。

正如@RealSkeptic所解释的那样,“在Swing中,永远不会覆盖paint(),只覆盖paintComponent()。永远不要在内部重绘或paintComponent()重绘,也不要在{{1}上调用dispose()你得到一个参数“。

您可以通过以下方式覆盖Graphics

paintComponent()

当检测到移动时,您可以从@Override protected void paintComponent(Graphics g) { super.paintComponent(g); g.setColor(Color.BLACK); g.fillRect(0, 0, getWidth(), getHeight()); player.draw(g); } 方法拨打repaint()

最后,keyPressed()具有从Player继承的坐标字段,并且还声明了自己的坐标。没有意义。
而且它容易出错。您在Entity方法中设置Player坐标字段的证明,但在move()方法中使用Entity的坐标字段。
使用draw()中的坐标并将其从Entity中移除或不使用Player并使用Entity中的坐标。