问题在于没有错误,一切正常,即使我在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) {
}
}
答案 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
中的坐标。