簡體   English   中英

填充多邊形並移動它,但留下痕跡

[英]Filling polygon and moving it, but its leaving a trail

好吧,所以我一直在嘗試移動多邊形,使其在屏幕周圍反彈。 現在這樣做了,但整個過程都留下了痕跡。 我有一個GUI類,由Aquarium類擴展,它用藍色填充屏幕,創建了一個“ creature”對象(來自Creature類),並使用update將其向下移動到屏幕上。 但是,更新時會留下痕跡。 我已經嘗試過在網站上類似情況下提到的許多方法,但是沒有任何效果。 有人能幫幫我嗎?

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

水族館類對此進行了擴展,並嘗試為屏幕着色並在其上放置Polygon生物:

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

    }
}

以及正在繪制並持有move方法的生物:

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;
    }*/

}

SOLUTION:弄弄永遠的感覺,現在就可以使用。 在運動中繪制多邊形時,某些Java函數會存儲有關頂點的信息。 干凈地移動它們的最佳方法是在更新信息時使用translate()而不是直接操縱頂點(通過更新x和y值),然后繪制新鮮的多邊形。

謝謝大家花時間來看我的問題!

您需要清除兩次繪圖操作之間的屏幕。 您可以通過調用super.paintComponent()方法將其留在框架中,也可以通過用g.fillRect()調用等內容填充屏幕來實現。

第一種方法實際上將使用面板背景色來調用fillRect函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM