2014-11-02 19 views
1

我正在爲學校做一個項目,我選擇重新創建Duck Hunt。到目前爲止,這種情況相當不錯,除了一個問題,飛出的鴨子移動得太快,我把它設置爲如下,x和y顯然是鴨子的x和y座標,而且我有一個循環,這是y--。但就像我說的那樣,速度太快了,我不能使用圖形類的雙打,只有一個int。下面是我寫的代碼。我的動畫在屏幕上移動得太快(圖形)(初學者)

(第一篇文章,我認爲我正確地發佈的代碼,對不起,如果我沒有)

import java.applet.Applet; 
import java.awt.*; 
import java.awt.event.*; 
import java.awt.TextField; 
import java.awt.MouseInfo; 
public class duck extends Applet implements ActionListener, MouseListener{ 

boolean start= true; 
int x; 
int y=400; 
int bx=350; 
int by= 285; 
int counter=1; 
int c=2;// (int) (Math.random()*4)+1; 
boolean dog=true; 
boolean dog3=false; 
boolean bird=false; 
public void init(){ 
} 
public void paint(Graphics g){ 
    //BackGround 
    this.resize (612,574); 
    g.drawImage(getImage(getCodeBase(), "background.png"), 0, 0, this); 
    g.drawString("" +c, 10, 300); 


    //Crosshair Follow 
    g.drawOval (MouseInfo.getPointerInfo().getLocation().x-24, MouseInfo.getPointerInfo().getLocation().y-63, 50, 50); 
    g.drawLine (MouseInfo.getPointerInfo().getLocation().x-24, MouseInfo.getPointerInfo().getLocation().y-37, MouseInfo.getPointerInfo().getLocation().x+24, MouseInfo.getPointerInfo().getLocation().y-37); 
    g.drawLine (MouseInfo.getPointerInfo().getLocation().x, MouseInfo.getPointerInfo().getLocation().y-64, MouseInfo.getPointerInfo().getLocation().x, MouseInfo.getPointerInfo().getLocation().y-15); 
    g.drawString ("" +MouseInfo.getPointerInfo().getLocation().x +" " +MouseInfo.getPointerInfo().getLocation().y, 100, 100); 
    //this.repaint(); 





    //Dog 
    if (dog==true) 
     g.drawImage(getImage(getCodeBase(), "dog.gif"), x, y, this); 
     x++; 
     this.repaint(); 

     if (x>200){ 
      dog=false; 
      dog3=true; 
     } 

     if (y<285){ 
      dog3=false; 
     //this.repaint(); 
     } 

     if (dog3==true){ 
      y=y-1; 

     bird=true; 
     } 

     //Bird 
     if (bird==true){ 



      //Start Path 1 (Right Then Left at y 100) 
      if (c==1){ 
      g.drawImage(getImage(getCodeBase(), "birdleft.gif"), bx, by, 75, 75, this); 
      bx++; 
      by--; 
      counter++; 

      if (by>200){ 
       bx=bx-3; 
       by--; 
      } 
      } 
      //End Path 1 

      //Start Path 2 
      if (c==2){ 
       g.drawImage(getImage(getCodeBase(), "birdleft.gif"), bx-100, by, 75, 75, this); 
       bx--; 
       by--; 
       counter++; 

       if (by<200){ 
        bx++; 
        by--; 
       } 
       } 
      //End Path 2 


     } //End Bird True 

     } //End Graphics 



public void mouseClicked(MouseEvent me) { 
//this.repaint(); 

} 
public void mousePressed(MouseEvent me) {} 
public void mouseReleased(MouseEvent me) {} 
public void mouseEntered(MouseEvent me) {}public void mouseExited(MouseEvent me) {} 
public void actionPerformed(ActionEvent e){ 

} 

} 
+0

繪畫應該繪畫,它應該包含儘可能少的邏輯,而不是更新UI的狀態。您可能還想了解一下[如何編寫鼠標監聽程序](http://docs.oracle.com/javase/tutorial/uiswing/events/mouselistener.html) – MadProgrammer 2014-11-02 04:05:38

回答

1

,因爲你有過的動畫無法控制,不要通過調用repaint()繪畫方法的內部動畫那樣。相反,要麼使用Swing Timer,即使在AWT程序中也應該可以工作,或者使用自己的後臺線程Timer,兩者都可以設置粗略的幀速率,從而減慢動畫速度。


編輯
與您的代碼的其他問題:

  • 你在圖像的畫法中讀取。請理解,在一個動畫程序中,我們會重複執行批次,並且不受您的控制。繪畫必須儘可能快地完成,而任何減慢速度的東西都會減慢GUI的響應速度。爲什麼在繪圖完成後隨時在圖像中閱讀圖像時,在程序啓動時讀取圖像一次更簡單,更高效?
  • 您正在使用AWT,這是一個非常古老而笨重的GUI庫,在15年前被Swing取代(它本身似乎正在被JavaFX取代)。
  • 您正在創建一個小程序,這是一種很難在當今時代創建或使用的程序類型。
  • 您通過在向後繪畫方法中輪詢它來獲取鼠標信息。相反,使用MouseListener和MouseMotionListener監聽更改。
  • 請勿使用if (something == true)if (someOtherThing == false),因爲這很容易出錯。相反,只需使用if (something)if (!someOtherThing)即可。
  • 請記住遵循Java命名約定。您的班級名稱應以大寫字母開頭,並以小寫字母開頭。雖然這似乎是一件小事,抱怨,程序的編寫是爲了讓人類和機器都能理解它們。如果你的代碼遵循慣例,其他人(我們和你的導師或老闆)將能夠更好地理解它並幫助你。
  • 與其繪製自己的十字線,不如考慮設置光標(如果是Swing GUI)。
+0

'MouseListener'而不是'MouseInfo.getPointerInfo ()',但我猜你正在那個;) – MadProgrammer 2014-11-02 04:04:56

+0

@MadProgrammer:其實我沒有。我太累了,無法詳細查看代碼,實際上正在睡覺。我想你應該發佈一個更好的答案。 – 2014-11-02 04:06:28

+0

我試圖刪除重繪,如果我刪除那些沒有註釋掉整個動畫將無法正常工作。你想介紹一下如何在我的程序中使用擺動計時器。 – Jeremy 2014-11-02 04:06:40