GUI Problem - ovladani klavesou, prekreslovani prvku – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

GUI Problem - ovladani klavesou, prekreslovani prvku – Java – Fórum – Programujte.comGUI Problem - ovladani klavesou, prekreslovani prvku – Java – Fórum – Programujte.com

 

Petr
~ Anonymní uživatel
746 příspěvků
15. 5. 2013   #1
-
0
-

Ahoj,

chci se zeptat. Delam jednoduchou hru s GUI a udelal jsem tam ovladani sipkama. funguje to celkem dobre az na jeden detail. Pri prvnim pohybu (jakoukoliv sipkou) se objekt (ktery kreslim pomoci Graphics) nejprve uskoci asi o 20px dolu a pak uz vse funguje perfektne. Tohle se stane, pokud updatuju 

frame.update(panel.getGraphics()); //frame je okno aplikace

a pokud updatuju panel, tak to sice neuskoci, ale zase tam zustava i starsi poloha objektu, takze se misto plynuleho pohybu kresli jakoby cary.

panel.update(panel.getGraphics()); //panel je objekt ktery to vsechno vykresluje

Diky za rady.

Nahlásit jako SPAM
IP: 81.201.55.–
sleepy0
Stálý člen
15. 5. 2013   #2
-
0
-

A preco nekreslis najskor do backbufferu a az ten vykreslis na obrazovku. Bez toho, aby si sem napisal kod ti asi nikto nepomoze. Tu je asi ako by som to je riesil:

//Casom pochopis preco je pouzivanie af lepsie
AffineTransformation objTransf = new AffineTransformation();
VolatileImage backbuffer = createVolatileImage(w,h);
Shape obj = // nejaky Shape s nejakou poziciou
int velocity = 3;
// Treba ich sinchronizovat lebo ich volas eventami a zaroven
// pouzivas Timer
public synchronized void moveDown(){
	objTransf.move(-velocity,0);
}

public synchronized void moveUp(){
	objTransf.move(velocity,0);
}

public synchronized void moveLeft(){
	objTransf.move(0,-velocity);
}

public synchronized void moveRight(){
	objTransf.move(0, velocity);
}


new Timer(20, new ActionListener(){
	public void actionPerformed(ActionEvent e){
		obj = objTransf.getTransformedShape(obj);
		// overenie toho ci volatileImage nestratils svoj obsah
		Graphics2D g = backbuffer.createGraphics();
		g.draw(obj);
		// tu skonci overovanie a uz len vykreslis do Canvasu
		canvas.repaint();
	}
});

DoubleBuffering sa pouziva na to aby si sa zbavil tearingu. Cize precitaj si nieco o tom ako sa pouziva Grafika, VolatileImage, Timer, ako funguje Shape a Affinna Transformacia.

Nahlásit jako SPAM
IP: 158.195.204.–
Petr
~ Anonymní uživatel
746 příspěvků
16. 5. 2013   #3
-
0
-

hm, to si nemyslim... navic kdyby sis alespon precetl muj problem, asi bys mi dokazal odpovedet jednou vetou. Jde o to, ze sem pouzival metodu update() misto repaint... to o cem mluvis ty jsem nepouzil proto, ze zkratka ani nevim ze to existuje. Libi se mi jak vy "ó velci programatori" delate z cloveka kazdou vetou blbce...

Nahlásit jako SPAM
IP: 81.201.55.–
sleepy0
Stálý člen
17. 5. 2013   #4
-
0
-

1.) Niesom programator

2.) Nerobim z teba blbca

3.) Nevidim tvoj kod, takze neviem preco ti stvorec uskakuje, resp. zostava stara poloha (toto viem to je zrejme preto ze za kazdym kreslis a obsah sa nemaze, takze musis prekrit ten object co tam bol znova pozadim a az potom nakreslit novy).

4.) Bol to navod ako by som to robil ja, taky ze sa vyhnes zmienenym problemom. Lebo za kazdym kreslis, cely obrazok na obrazovku a nie len stvorec, cize tvoj povodny obrazok sa prekryje novym s rovnakou velkostou.

Ospravedlnujem sa ti, ak ta moj koment urazil. Tak teraz to skusim inak:

class MyCanvas extends JPanel{
// Ta affina transformacia sa hodi lebo mozes pouzivat zlozitejsie objekty,
// alebo presuvat viacero objektou, preto by som ju na tvojom mieste pouzil
	
	Shape object;
	Color objColor;
	Dimension windowSize;
	AffineTransform af;
	Timer timer;

	public MyCanvas(){
		// kod
		timer = new Timer(20, this);
		timer.start();
	}

	@Override
	public void paint(Graphics g){
		update(g);
	}

	@Override
	public void update(Graphics g){
		Graphics2D g2d = (Graphics2D) g;
		// Prekreslis cele okno napriklad na bielo, pripadne mozes len objekt
		g2d.setColor(Color.WHITE);
		g2d.drawRect(0,0, windwSize.width, windowSize.height);
		// Nastavis farbu na farbu objektu
		g2d.setColor(objColor);
		g2d.draw(object);
	}
	
	// Event Timeru
	public void actionPerformed(ActionEvent e){
		object = af.createTransformedShape(object);
		repaint();
	}
}

Takze, asi budes musiet prekreslit za kazdym stary objekt pozadim a potom len updatnut JPanel. Na updatovanie existuje metoda repaint(), nemusis volat update(Graphics g).

Nahlásit jako SPAM
IP: 158.195.204.–
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, 4 hosté

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ý