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) {
}
}
在你的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()
重画,也不是对你有作为参数调用Graphics
dispose()
”解释。
你可以通过这种方式覆盖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
的坐标。
感谢您的帮助,我会在3分钟内接受您的答案,非常感谢您解答和解决问题。 – DummyTarget
不客气。我已经添加了一些其他说明来解释其他问题。 RealSkeptic建议也对绘制机制很好。 – davidxxx
请勿使用大写字母表示软件包名称。 – davidxxx
好兄弟我是新的java编程soo idk; d – DummyTarget
(a)在Swing中,不要重写'paint',只能'paintComponent'。 (b)不要在'paint'或'paintComponent'里重绘'',也不要在'Graphics'上调用'dispose'作为参数。 (c)我在这里看不到球。 (d)有一个'移动'但没有人叫它。 – RealSkeptic