2013-04-11 32 views
2

好的,所以我一直在试图移动我的多边形,所以它在屏幕上弹跳。现在它是这样做的,但整个过程都留下了痕迹。我有一个GUI类,由一个Aquarium类扩展,它用蓝色填充屏幕,创建一个“生物”对象(来自Creature类)并使用更新将其向下移动到屏幕上。但是,当它更新时,会留下一条痕迹。我曾尝试过许多在网站上类似案例中提到的方法,但没有任何效果。有人能帮帮我吗?填充多边形并移动它,但它留下一条线索

GUI类(保存的JPanel等)

package artilife; 

import java.awt.Color; 
import java.awt.Component; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class AquariumGUI { 

    private GooPanel gooPanel; 

    private boolean loop = true; 

    protected int width, height; 

    private int frameTimeInMillis = 300; 

    private RenderingHints renderingHints = new RenderingHints(
      RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 

    @SuppressWarnings("serial") 
    class GooPanel extends JPanel { 

     public void paintComponent(Graphics g) { 

      Graphics2D g2d = (Graphics2D) g; 
      g2d.setRenderingHints(renderingHints); 
      draw(g2d); 
     } 
    } 

    public AquariumGUI() { 

     this(800, 500); 
    } 

    public AquariumGUI(int w, int h) { 

     width = w; 
     height = h; 

     JFrame frame = new JFrame(); 
     frame.setSize(width, height); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     gooPanel = new GooPanel(); 
     gooPanel.setPreferredSize(new Dimension(w, h)); 
     frame.getContentPane().add(gooPanel); 
     frame.pack(); 

     frame.setVisible(true); 
    } 

    public void go() { 

     while (loop) { 

      gooPanel.repaint(); 
      update(); 


      try { 
       Thread.sleep(frameTimeInMillis); 
      } catch (InterruptedException e) { 
      } 
     } 
    } 

    public void draw(Graphics2D g) { 

    } 

    public void update(){ 
    } 

    public void setFrameTime(int millis){ 

     frameTimeInMillis = millis; 
    } 
} 

该延长这一点,并试图着色屏幕和其上放置一个多边形生物水族馆类:

package artilife; 

import java.awt.Color; 
import java.awt.Graphics2D; 
import java.util.ArrayList; 
import java.util.Random; 

public class MyAquarium extends AquariumGUI { 

    Creature tester; 

    public MyAquarium() 
    { 
     tester = new Creature(); 
    } 

    public void draw(Graphics2D g) { 

     // Fill background 
     g.setColor(Color.WHITE); 
     g.fillRect(0, 0, width, height); 
     tester.draw(g); 

    } 

    public void update(){ 


     tester.move(width, height); 

    } 

    public static void main(String[] args) { 

     MyAquarium aquarium = new MyAquarium(); 
     aquarium.go(); 

    } 
} 

而这是生物被吸引,并保持移动方法:

package artilife; 
import java.awt.Color; 
import java.awt.Graphics2D; 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 


public class Creature 
{ 
    // Position and radius of the drop 
    private double x, y, r, Vx, Vy; 
    Polygon p = new Polygon(); 
    int numSides; 

    public Creature() { 

     x = 800/2; 
     r = 10; 
     y = 50; 
     Vx = 10; 
     Vy = 3; 
     numSides = 3; 
     //creatureShape(numSides); 
    } 

    public void creatureShape (int sides) 
    { 
     if (sides <= 10){ 
      for (int i = 0; i < sides; i++){ 
      p.addPoint((int) (x + 50 * Math.cos((i) * 2 * Math.PI/sides)), 
      (int) (y + 50 * Math.sin((i) * 2 * Math.PI/sides))); 
      } 
     } 
     else{ 
      for (int i = 0; i < 360; i++) { 
      double value = i/360.0; 
      p.addPoint((int) (90 + 50 * value * Math.cos(8 * value * Math.PI)), 
      (int) (50 + 50 * value * Math.sin(8 * value * Math.PI))); 
      } 
     } 
    } 


    public void draw(Graphics2D g) { 

     creatureShape(numSides); 
     g.setColor(Color.BLUE); 
     g.fillPolygon(p); 

    } 

    public void move(int width, int height){ 

     // Move the drop 
     x = x + Vx; 
     y = y +Vy; 
     if (y >= height){ 
     Vy = -Vy; 
     y = height; 
     } 
     else if(y <= 0){ 
     Vy = -Vy; 
     y = 0; 
     } 
     if(x >= width){ 
     Vx = -Vx; 
     x = width; 
     } 
     if(x <= 0){ 
     Vx = -Vx; 
     x = 0; 
     } 


    } 
    /* 
    public void attraction() 
    { 
     if ( 



    }*/ 
    /* 
    public boolean check4Creatures() 
    { 
     boolean isThere = false; 
     //if there is an another create object within a 60 point radius 
     isThere = true; 

     return isThere; 
    }*/ 

} 
+0

它似乎暂时清除它,屏幕是白色的,三角形是蓝色的,留下的线索是白色和蓝色的三角形? – 2013-04-11 12:41:28

回答

1

解决方案: 因此,为永恒的感觉,现在它的作品。 在运动中绘制多边形时,一些Java函数存储有关顶点的信息位。干净地移动它们的最好方法是使用translate(),而不是在更新信息时直接操作顶点(通过更新x和y值),然后绘制新的多边形。

感谢大家花时间看看我的问题!

0

您需要清除屏幕补间两次绘图操作。您可以通过调用super.paintComponent()方法将其留在框架中,也可以通过填充屏幕上的某些内容(如拨打g.fillRect())来完成。

第一种方法实际上会使用面板背景色调用fillRect函数。

+0

我不能从水族馆级调用超级bc paintComponent是在AquariumGUI中包含的goopanel类中,我怎么能达到它? – 2013-04-11 12:38:51

+0

我试着添加fillRect(),因为你可以在水族课上看到。我不知道为什么它不会画在过去的三角形上:\,它与椭圆形一起工作? – 2013-04-11 12:39:47