2013-07-11 35 views
0

由於某種原因,當我的精靈擊中左邊時,它不會反彈。該程序運行完美,但後來我改變了一些對它完全沒有影響的東西,並停止了工作。這個錯誤出現在我的Java程序中,看起來沒有理由

//Sprite class 

public class Sprite { 
private String sprite = "sprite-adult.fw.png"; 

private int speed; 
private int dx; 
private int dy; 
private int x; 
private int y; 
private Image image; 

public Sprite() { 
    ImageIcon ii = new ImageIcon(getClass().getResource(sprite)); 
    image = ii.getImage(); 

      speed=6; 
      dx=speed; 
      dy=speed; 

    x = 40; 
    y = 60; 
} 
public void move() { 
    toggleRebound(); 

    x += dx; 
    y += dy; 
} 
public void toggleRebound() { 
    if(x == 1366) 
     dx = negate(dx); 

    if(y == 768) 
     dy = negate(dy); 

    if(x == 0) 
     dx = negate(dx); 

    if(y == 0) 
     dy = negate(dy);  
} 
public int negate(int x) { 
    return x*-1; 
} 
public int getX() { 
    return x; 
} 
public int getY() { 
    return y; 
} 
public Image getImage() { 
    return image; 
} 
} 


//SType class 

public class SType extends JFrame{ 
public SType() { 
    add(new Board()); 

    setDefaultCloseOperation(EXIT_ON_CLOSE); 
    setSize(1366,768); 
    setLocationRelativeTo(null); 
    setTitle("S - Type"); 
    setVisible(true); 
    setResizable(false); 
} 
public static void main(String[] args) { 
    new SType(); 
} 
} 

//Board class 

public class Board extends JPanel implements ActionListener{ 
private Sprite sprite; 
private Timer timer; 

public Board() { 
    setFocusable(true); 
    setBackground(new Color(39,124,36)); 
    setDoubleBuffered(true); 

    sprite = new Sprite(); 

    timer = new Timer(5,this); 
    timer.start(); 
} 
public void paint(Graphics g) { 
    super.paint(g); 

    Random rand = new Random(5398); 
    for(int x=0;x<1000;x++) { 
     g.setColor(new Color(22,98,19)); 
     g.drawOval(rand.nextInt(1368), rand.nextInt(768), 1, 20); 
    } 

    Graphics2D g2d = (Graphics2D)g; 
    g2d.drawImage(sprite.getImage(),sprite.getX(),sprite.getY(),this); 

    Toolkit.getDefaultToolkit().sync(); 
} 
public void actionPerformed(ActionEvent arg0) { 
    sprite.move(); 
    repaint(); 
} 
} 
+0

爲了更快地獲得更好的幫助,請發佈[SSCCE](http://sscce.org/)。 –

+0

當你說「它不反彈」,你能更清楚嗎?它只是坐在那裏嗎?代碼是否會拋出異常?它仍然反彈底部?或者是右邊還是頂部?它曾經嗎? – CPerkins

+0

它穿過「牆」,好像什麼都沒有。 – alexdr3437

回答

1

有兩種吸取教訓這裏

首先,您遇到的真正的問題是,你對反彈零覈對準確平等(或您的硬編碼左/頂部尺寸)。這意味着如果您一次移動多個像素(如上圖所示),您可能會錯過邊界並穿過邊界。

一般來說,以小於等於的方式檢查限制通常是一種很好的做法,尤其是在可能一次移動多個「可能」時。

例如,如果你想寫一個數組類,你不會用((idx == 0) or (idx == length))來做你的邊界檢查。您應該檢查((idx <= 0) or (idx >= length)),而不是。

與精靈位置相同的東西。

其次,檢查您的假設總是有用的,特別是當您的期望被違反時。在這種情況下,你確信一個非常簡單的改變已經破壞了你的程序。

但事實並非如此。這不可能是真的。在任何情況下是這樣的:

從這個
private int dx = 6; 
private int dy = 6; 

不同:

private int speed = 6 
private int dx = speed; 
private int dy = speed; 

所以別的東西你兩個測量點(工作,非工作)之間變化。這種額外的變化完全有可能以某種方式被你屏蔽 - 也許是由於編譯錯誤,或者你只是看着程序的其他方面,而不是讓它反彈。但無論原因如何,其他事情都會改變。

在這種特殊情況下,您可能也改變了您的起點或速度值。

但無論是什麼原因,當你遇到不可能的事情時,你必須回去重新檢查你的假設。

但無論如何,這就是問題所在:你的精靈正在「移動」得太快,以至於目前的反彈難以捉住它。更改爲低於等於測試,將是我的建議。

你錯了。做出這種改變,只有這種改變,並不會導致您報告的行爲發生變化。

最有可能的是,您實際上做了一個以上的更改,但僅測試此點之後的反彈行爲。

+0

我想說的是,在我做出這個改變之後,這個錯誤就出現了。我運行了程序,它很好。我做出了改變,只是改變了,並沒有奏效。 – alexdr3437

+0

你想說的話不可能是真的。我很樂意幫助你,但是你必須正確地去做,並且認爲你所描述的改變是所發生的事情將會阻止你找到真相。 – CPerkins

+0

我添加了其他兩個類。我相當肯定沒有其他改變。我仔細觀察了幾次,發現問題無法解決。 – alexdr3437

2

第一個回答者是正確的,這不應該影響任何東西。雖然在這個例子中它並不真正相關,但在構造函數中初始化私有實例變量而不是聲明它是一種很好的形式。

private int speed; 
private int dx; 
private int dy; 

public Sprite() 
{ 
    speed=6; 
    dx=speed; 
    dy=speed; 
} 
+0

這是有原因嗎?就是想 :) – alexdr3437

相關問題