Pomalé překreslování – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Pomalé překreslování – Java – Fórum – Programujte.comPomalé překreslování – Java – Fórum – Programujte.com

 

Ni3mm4nd
~ Anonymní uživatel
3 příspěvky
21. 11. 2012   #1
-
0
-

Dobrý den,

potřeboval bych pomoci s objasněním a pokud možno vyřešením problému. Udělal jsem si fraktálový strom a chtěl bych ho rozpohybovat. Udělal jsem si Timer nějakou náhodu aby to simulovalo neurčitost větru a pomalu překresluji obraz. Narazil jsem na problém že repaint již namalované čáry nevymaže ale pouze přikreslí nové tudíž jsem musel po každém vykreslení stromu celou oblast vyplnit bíle a zase nakreslit strom ale zdá se, že je vyplňování strašlivě pomalé a když si program pustím téměř nic nevidím.

Zajímavé ovšem je, že když po okně jezdím myší tak se vše vykresluje krásně a plynule ale nesmím přestat jezdit ... Můžete mi tento problém objasnit a pokud možno navrhnout řešení? zde je zdrojový kód zkuste si ho pustit a řekněte, jeslti vám co také dělá já to testoval na 3 PC a dělá to všude.

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.Timer;

/**
 *
 * @author kadlejan
 */
public class FractalTree extends JFrame implements ActionListener{
    Timer timer;
    public double uhel = -90;
    public String vyber = "01";
    Random r = new Random();
    int rychlost = 100;
    
    public FractalTree() {
        super("Fraktálový strom");
        setBounds(100, 100, 800, 600);
        setResizable(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        timer = new Timer(rychlost, this);
        timer.setInitialDelay(1000);
        timer.start();
    }
 
    private void drawTree(Graphics g, int x1, int y1, double uhel, int hloubka) {
        if (hloubka == 0) return;
        int x2 = x1 + (int) (Math.cos(Math.toRadians(uhel)) * hloubka * 10.0);
        int y2 = y1 + (int) (Math.sin(Math.toRadians(uhel)) * hloubka * 10.0);
        g.drawLine(x1, y1, x2, y2);
        drawTree(g, x2, y2, uhel - 20, hloubka - 1);
        drawTree(g, x2, y2, uhel + 20, hloubka - 1);              
    }

    @Override
    public void paint(Graphics g) {
        g.setColor(Color.white);
        g.fillRect(0, 0, 800, 800);
        g.setColor(Color.BLACK);
        g.drawString("Fraktálový strom", 100, 100);
        drawTree(g, 400, 500, uhel, 9);
        
        double nahoda = Math.random();
        if (nahoda < 0.2){
        uhel = uhel - 0.9;
        }
        if(nahoda >= 0.2 && nahoda >=0.8){
            uhel = uhel;
        }
        if(nahoda > 0.8){
            uhel = uhel +0.9;
        }     
    }

    @Override
    public void actionPerformed(ActionEvent e) { 
        repaint();
    }
}

Děkuji za pomoc.

Nahlásit jako SPAM
IP: 88.146.162.–
liborb
~ Redaktor
+18
Guru
22. 11. 2012   #2
-
0
-

A od čeho voláš to překreslení? Jezdíš po tom myší -> volají se překreslení. Pro začátek si to můžeš navázat třeba na  nějaký timer.

Nahlásit jako SPAM
IP: 188.75.135.–
Ni3mm4nd
~ Anonymní uživatel
3 příspěvky
22. 11. 2012   #3
-
0
-

#2 liborb
Však na Timer už to mám ... 

timer = new Timer(rychlost, this);
public void actionPerformed(ActionEvent e) {
        repaint();
    }

zkuste si to spustit a uvidíte :-)

Nahlásit jako SPAM
IP: 88.146.162.–
sleepy0
Stálý člen
22. 11. 2012   #4
-
0
-

#3 Ni3mm4nd
Skus DoubleBuffer, to by malo ist plynulejsie. A kresli najskor do VolatileImagu a ten vykreslis az do Canvasu. VolatileImage ma taku zauimavu metodu ze flush(). Ta by ti mohla pomoct pri prekreslovani.

Nahlásit jako SPAM
IP: 158.195.195.–
sleepy0
Stálý člen
22. 11. 2012   #5
-
0
-

Tu je to co som s tym postvaral ja ;) :

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.Timer;

import java.awt.image.VolatileImage;

/**
 *
 * @author kadlejan
 */
public class FractalTree extends JFrame implements ActionListener{
    Timer timer;
    public double uhel = -90;
    public String vyber = "01";
    Random r = new Random();
    int rychlost = 20;
    
    public VolatileImage vim;
    
    public FractalTree() {
        super("Fraktálový strom");
        setBounds(100, 100, 800, 600);
        setResizable(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
        timer = new Timer(rychlost, this);
        timer.setInitialDelay(1000);
        timer.start();
    }
    
    public static void main(String[] args){
    	new FractalTree();	    
    }
 
    private void drawTree(Graphics g, int x1, int y1, double uhel, int hloubka) {
        if (hloubka == 0) return;
        int x2 = x1 + (int) (Math.cos(Math.toRadians(uhel)) * hloubka * 10.0);
        int y2 = y1 + (int) (Math.sin(Math.toRadians(uhel)) * hloubka * 10.0);
        g.drawLine(x1, y1, x2, y2);
        drawTree(g, x2, y2, uhel - 20, hloubka - 1);
        drawTree(g, x2, y2, uhel + 20, hloubka - 1);              
    }
    
    @Override
	public void update(Graphics g) {
		do {
			int returnCode = vim.validate(getGraphicsConfiguration());
			if (returnCode == VolatileImage.IMAGE_RESTORED) {
				vim.flush();
			}
			renderOffscreen();
			g.drawImage(vim, 0, 0, this);

		} while (vim.contentsLost());
	}
    
    public void renderOffscreen(){
    	if (vim.validate(getGraphicsConfiguration()) == VolatileImage.IMAGE_INCOMPATIBLE) {
				vim.flush();
				vim = createVolatileImage(800, 800);
	}
    	Graphics g = vim.getGraphics();
        g.setColor(Color.BLACK);
        g.drawString("Fraktálový strom", 100, 100);
        drawTree(g, 400, 500, uhel, 9);
        
        double nahoda = Math.random();
        if (nahoda < 0.2){
        uhel = uhel - 0.9;
        }
        if(nahoda >= 0.2 && nahoda >=0.8){
            uhel = uhel;
        }
        if(nahoda > 0.8){
            uhel = uhel +0.9;
        }  	    
    }

    @Override
    public void paint(Graphics g) {
        vim = createVolatileImage(800, 800);
	update(g);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
    	vim.flush();
        repaint();
    }
}
Nahlásit jako SPAM
IP: 158.195.195.–
Ni3mm4nd
~ Anonymní uživatel
3 příspěvky
22. 11. 2012   #6
-
0
-

#5 sleepy
Tyyyyyjo ten VolatileImage je fakt super :-D jakto, že jsem ho nikdy predtim nevidel? :-D Je to fakt super dík chlape :-)

Nahlásit jako SPAM
IP: 88.146.162.–
sleepy0
Stálý člen
22. 11. 2012   #7
-
0
-

#6 Ni3mm4nd
Jo a zabudol som za drawTree(g) v renderOffscreen() napis g.dispose(). Som rad ze sa ti moje riesenie paci. Pohladaj si nejake tutorialy, Graphics, Graphics2D, Double(Triple)Bufferingu, BufferStrategy, VolatileImage, PageFlipping, atd..., tu je nieco: http://docs.oracle.com/javase/tutorial/extra/fullscreen/doublebuf.html, na zvysok staci troska pogooglit. Teda ak sa tomu chces troska viac povenovat. 

Nahlásit jako SPAM
IP: 158.195.195.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 9 hostů

Podobná vlákna

Překreslovani — založil Drake

Pygame překreslování — založil kuba

XNA - překreslování dělá vlny — založil Matěj Andrle

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý