2012-09-02 68 views
0

對不起,不斷提問有關我的程序的問題,但我認爲我幾乎在那裏,我自學java,所以請忍受我。我正在創建一個小程序,當狗對象靠近綿羊時,隨意移動羊物體越過屏幕。讓羊隨意移動需要一些工作,並且在這裏你們的幫助下,它現在可以工作(有點),但是現在我想要做的就是阻止它在屏幕上拖動對象時閃爍。我已經讀過關於雙緩衝的內容,我可以將它用於在主類的paint方法中繪製的項目,但無法將它應用於我的綿羊和狗對象,這些對象在單獨的類中定義爲單獨的對象。任何幫助都感激不盡。這裏是我的代碼:停止小程序閃爍與雙緩衝Java小程序

package mandAndDog; 

import java.applet.Applet; 
import java.awt.*; 
import java.awt.event.*; 
import java.util.Random; 


public class SheepDog extends Applet implements ActionListener, MouseListener, MouseMotionListener 
{ 
    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
    /** 
    * 
    */ 

    Dog dog; 
    Sheep sheep; 
    int[] directionNumbersLeft = {0, 1, 3}; 
    int[] directionNumbersUp = {0, 1, 2}; 
    int x; 
    int selection; 
    int xposR; 
    int yposR; 
    int sheepx; 
    int sheepy; 
    int sheepBoundsx; 
    int sheepBoundsy; 
    int MAX_DISTANCE = 50; 
    int direction; 
    int distance; 
    Boolean sheepisclosetodog; 


    public void init() 
    { 
     addMouseListener(this); 
     addMouseMotionListener(this); 
     dog = new Dog(10, 10); 
     sheepx = 175; 
     sheepy = 75; 
     sheep = new Sheep(sheepx, sheepy); 
     sheepBoundsx = 30; 
     sheepBoundsy = 30; 
     direction = (int)(Math.random()*4); 
     distance = (int) (Math.random() * MAX_DISTANCE) % MAX_DISTANCE; 
     sheepisclosetodog = false; 
     Random rand = new Random(); 
     x = rand.nextInt(3); 
     selection = directionNumbersLeft[x]; 

    } 
    public void paint(Graphics g) 
    { 
     dog.display(g); 
     sheep.display(g); 
     g.drawString(Integer.toString(distance), 85, 100); 
     g.drawString(Integer.toString(direction), 85, 125); 
     g.drawString(Integer.toString(selection), 85, 140); 

    } 
    public void actionPerformed(ActionEvent ev) 
    {} 
    public void mousePressed(MouseEvent e) 
    {} 
    public void mouseReleased(MouseEvent e) 
    {} 
    public void mouseEntered(MouseEvent e) 
    {} 
    public void mouseExited(MouseEvent e) 
    {} 
    public void mouseMoved(MouseEvent e) 
    { 
    } 
    public void mouseClicked(MouseEvent e) 
    {} 
    public void mouseDragged(MouseEvent e) 
    { 
     dog.setLocation(xposR, yposR); 
     sheep.setLocation(sheepx, sheepy); 
     if (xposR > (sheepx - 20)&& xposR < (sheepx - 20)+(sheepBoundsx - 20) && yposR > (sheepy - 20) 
       && yposR < (sheepy - 20)+(sheepBoundsy - 20) && direction == 0){ 
      sheepx = sheepx + 50; 
      direction = (int)(Math.random()*4); 
     } 
     if (xposR > (sheepx - 20)&& xposR < (sheepx - 20)+(sheepBoundsx - 20) && yposR > (sheepy - 20) 
       && yposR < (sheepy - 20)+(sheepBoundsy - 20) && direction == 1){ 
      sheepy = sheepy + 50; 
      direction = (int)(Math.random()*4); 
     } 

     if (xposR > (sheepx - 20)&& xposR < (sheepx - 20)+(sheepBoundsx - 20) && yposR > (sheepy - 20) 
       && yposR < (sheepy - 20)+(sheepBoundsy - 20) && direction == 2){ 
      sheepx = sheepx - 50; 
      direction = (int)(Math.random()*4); 
     } 
     if (sheepx <= 5){ 
      direction = directionNumbersLeft[x]; 
     } 


     if (xposR > (sheepx - 20)&& xposR < (sheepx - 20)+(sheepBoundsx - 20) && yposR > (sheepy - 20) 
       && yposR < (sheepy - 20)+(sheepBoundsy - 20) && direction == 3){ 
      sheepy = sheepy - 50; 
      direction = (int)(Math.random()*4); 
     } 
     if (sheepy <=5){ 
      direction = directionNumbersUp[x]; 
     } 

     xposR = e.getX(); 
     yposR = e.getY(); 
     repaint(); 

    } 
} 

class Dog 
{ 
    int xpos; 
    int ypos; 
    int circleWidth = 30; 
    int circleHeight = 30; 

    public Dog(int x, int y) 
    { 
     xpos = x; 
     ypos = y; 

    } 

    public void setLocation(int lx, int ly) 
    { 
     xpos = lx; 
     ypos = ly; 
    } 

    public void display(Graphics g) 
    { 
     g.setColor(Color.blue); 
     g.fillOval(xpos, ypos, circleWidth, circleHeight); 
    }  
} 
class Sheep 
{ 
    int xpos; 
    int ypos; 
    int circleWidth = 10; 
    int circleHeight = 10; 

    public Sheep(int x, int y) 
    { 
     xpos = x; 
     ypos = y; 

    } 

    public void setLocation(int lx, int ly) 
    { 
     xpos = lx; 
     ypos = ly; 
    } 

    public void display(Graphics g) 
    { 
     g.setColor(Color.green); 
     g.fillOval(xpos , ypos, circleWidth, circleHeight); 
     g.drawOval(xpos - 20, ypos - 20, 50, 50); 
    } 


} 
+4

最簡單的方式:改變你的Applet到Swing的JApplet的,畫在JPanel的'的paintComponent(...)'方法,並充分利用Swing的自動雙緩衝。 –

+2

請參閱[*初始線程*](http://download.oracle.com/javase/tutorial/uiswing/concurrency/initial.html)。 – trashgod

回答

0

首先,我不明白爲什麼你有一個顯示方法在你的羊和狗類。我建議你在SheepDog課堂上展示羊和狗,而不是這樣做。

而不是使用圖形,你應該使用Graphics2D。爲了使用這一簡單地做

public void paint(Graphics g) { 
    Graphics2D g2 = (Graphics2D) g; 
} 

這是可能的,因爲Graphics2D的是顯卡的一個子類。一旦你這樣做,我會做的是重寫update()方法,併爲此

public void update(Graphics g) { 
    if (image == null) { 
     image = createImage(this.getWidth(), this.getHeight()); 
     graphics = image.getGraphics(); 
    } 
    graphics.setColor(getBackground()); 
    graphics.fillRect(0, 0, this.getWidth(), this.getHeight()); 
    graphics.setColor(getForeground()); 
    paint(graphics); 
    g.drawImage(image, 0, 0, this); 
} 

當你調用重繪(),它實際上首先調用update()方法,這反過來又調用paint( ) 方法。在課程上,你應申報

Image image; 
Graphics graphics;