2017-04-13 53 views
1

問題是沒有錯誤,一切正常,即使我在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

回答

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); 
    } 

} 

再說了,你不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