Java-can't a ball move

问题描述:

问题是没有错误,一切正常,即使我在if(keyevent == w)system.out.println(“something”)中写入内容时也是如此。它也可以工作,但由于某种原因球位置不变,请提出任何建议?Java-can't a ball move

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

请勿使用大写字母表示软件包名称。 – davidxxx

+0

好兄弟我是新的java编程soo idk; d – DummyTarget

+1

(a)在Swing中,不要重写'paint',只能'paintComponent'。 (b)不要在'paint'或'paintComponent'里重绘'',也不要在'Graphics'上调用'dispose'作为参数。 (c)我在这里看不到球。 (d)有一个'移动'但没有人叫它。 – RealSkeptic

在你的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); 
    } 

} 

再说了,你不Player类使用move()方法。
你应该删除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()重画,也不是对你有作为参数调用Graphicsdispose()”解释。

你可以通过这种方式覆盖paintComponent()

@Override 
protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    g.setColor(Color.BLACK); 
    g.fillRect(0, 0, getWidth(), getHeight()); 
    player.draw(g); 
} 

并且在检测到移动时,你可以从keyPressed()方法调用repaint()

最后,Player具有从Entity继承的坐标字段,并声明它自己的坐标。这个不成立。
它很容易出错。您在move()方法中设置了Player的坐标字段,但在draw()方法中使用的坐标字段为Entity
请使用Entity中的坐标,并从Player中删除它们,或者不要使用Entity并使用Player的坐标。

+0

感谢您的帮助,我会在3分钟内接受您的答案,非常感谢您解答和解决问题。 – DummyTarget

+0

不客气。我已经添加了一些其他说明来解释其他问题。 RealSkeptic建议也对绘制机制很好。 – davidxxx