Odkaz na objekt ve 2dGraphics – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Odkaz na objekt ve 2dGraphics – Java – Fórum – Programujte.comOdkaz na objekt ve 2dGraphics – Java – Fórum – Programujte.com

 

Jan Vesely
~ Anonymní uživatel
22 příspěvků
4. 5. 2013   #1
-
0
-

Zdravim, V 2dGraphics bych potřeboval překreslit pouze jediný objekt, čili potřebuji nějak získat jeho odkaz, jak to udělat? V následujícím příkladu chci překreslit jen fillRecet, ne zbytek.

public void paint(Graphics g){
		g.fillRect(560, 50, 50, 50);
		g.drawRect(50, 50, 50, 50);
		g.drawString(text, 50, 50);
	}
Nahlásit jako SPAM
IP: 194.12.42.–
Flowy0
Věrný člen
4. 5. 2013   #2
-
0
-

   

Rectangle rect = new Rectangle(560,50,50,50);
g.fill(rect);
Nahlásit jako SPAM
IP: 85.237.227.–
https://github.com/Flowy
sleepy0
Stálý člen
5. 5. 2013   #3
-
0
-

#2 Flowy
Objekt Graphics nepozna metodu fill(Shape s) na to treba pouzit Graphics2D. A navyse Rectangle ani Shape-om neni treba pouzit Rectangle2D.

#1 Jan Vesely
Prilis malo informacie si zadal, mozes to robit teda, ako Flowy naznacuje, alebo ak mas niekde ulozene ako ma ten rectangle vyzerat, resp co do neho nakreslit, atd... . Mozes to robit nasledovne :

// Nejaky object Canvasu
public void update(Graphics g){
	// nejaky kod
	rectangle.draw(g);
	// iny kod
}

// Tu konci
class MyRectangle{
	// premenne
	

	// konstruktory


	// metody

	public void draw(Graphics g){
		// Ak je fillOnly nastavene na true tak sa pouzije iba metoda g.fillRect
		if(!fillOnly){
			g.drawRect(x, y, w, h);
			g.fillRect(x,y,w,h);
			g.drawText(text, x, y);
		}
		else{
			g.fillRect(x,y,w,h);
		}
		
	}
}

Nahlásit jako SPAM
IP: 213.215.67.–
Jan Vesely
~ Anonymní uživatel
22 příspěvků
5. 5. 2013   #4
-
0
-

Okey díky, svůj problém jsem vyřešil ;).

Nahlásit jako SPAM
IP: 194.12.42.–
Jan Vesely
~ Anonymní uživatel
22 příspěvků
5. 5. 2013   #5
-
0
-

Pardon nevyřešil :(, Udělala jsem si třídu ShapeMover, která mi pohybuje s obrazcem. Ježe já jí chtěl udělat multifunkční, že bych do ní přidal odkaz na objekt, třeba čtverec a ona by mi ho posunula na nějaké souřadnice.
 

 Hlavní ovládací třída

package ShapeMover;

import java.awt.Graphics;

import javax.swing.JComponent;
import javax.swing.JFrame;
// Třída v níž se bude náchazet programy hry

public class gameClass {
	
	public JFrame frame=new JFrame();
	public paintClass paintC=new paintClass();
	private Thread ThreadShapeMover2;
	private int souradniceX2=0;
	private int souradniceY2=0;
	
	
	public gameClass(){
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(400, 400);
		frame.getContentPane().add(paintC);
		frame.setVisible(true);
		posunObjektu(souradniceX2, souradniceY2);
	}
	//metoda, která volá posun objektu;
	public void posunObjektu(int souradniceX2, int souradniceY2){
		//Zavolání třídy ShapeMover v novám vlákně.
		ThreadShapeMover2=new ShapeMover(this, souradniceX2, souradniceY2);
		ThreadShapeMover2.start();
	
	}
}
//vykreslovací třída
class paintClass extends JComponent{
	//pozice objektu musí být typu double, protože se v counteru se nepříčítají celá čísla
	public double poziceObjektuX=200;
	public double poziceObjektuY=200;
	
	public void paint(Graphics g){
		g.fillRect((int)poziceObjektuX, (int)poziceObjektuY, 50, 50);
	}

}

třída, která posouvá objekt

package ShapeMover;

//třída ShapeMover, která posouvá objekt
public class ShapeMover extends Thread {
	private gameClass gameC=null;
	private int souradniceX2;
	private int souradniceY2;
	private int souradnicovyDelitel=150;
	
	//konstruktor, 3 parametry: odkaz na kmenovou přídu a souřadníce na níž se má onjekt přesunout
	public ShapeMover(gameClass gameC, int souradniceX2, int souradniceY2) {
		this.gameC=gameC;
		this.souradniceX2=souradniceX2;
		this.souradniceY2=souradniceY2;
	}
	
	//mnové vlákno volá metodu run
	public void run(){
		double counterY=souradniceX2-gameC.paintC.poziceObjektuX; counterY/=souradnicovyDelitel;
		double counterX=souradniceY2-gameC.paintC.poziceObjektuY; counterX/=souradnicovyDelitel;
		for(int x=0;x<souradnicovyDelitel;x++){
			gameC.paintC.poziceObjektuX+=counterX;
			gameC.paintC.poziceObjektuY+=counterY;
			gameC.paintC.repaint();
			try {
				Thread.sleep(25);
			} catch (InterruptedException e) {
	
				e.printStackTrace();
			}
		
		}
		
	}
	
}
Nahlásit jako SPAM
IP: 194.12.42.–
sleepy0
Stálý člen
6. 5. 2013   #6
-
0
-

Pozri si AffineTransforamtion, to robi presne to co tvoj ShapeMover a este ovela viac. Pripadne ak pouzivas ine objekty ako <? extends Shape>. Tak budes nieco podobne muste naprogramovat sam. Ako uz bolo vyssie navrhovane, pouzi kniznicu Graphics2D a objekty z nej. Alebo si vytvor vlastne, ako som pisal vyssie, ale budes musit vytvorit aj vlastny ShapeMover podobne ako AffineTransoframtion:

public abstract class MyShape{
	Point position = null; // Kazdy objekt ma nejaku poziciu
	
	// konstruktor

	public void abstract draw(Graphics g);

	public void getPosition(){
		return position;
	}

	public void setPostition(Point p){
		this.position = p;
	}
// dalsie metody
}

public class ShapeMover{
	int dx=0, dy=0;

	// Metoda ktora nastavy posuv o dx a dy	
	public void move(int dx, int dy){
		dx = 0;
		dy = 0;
	}

	public void move(Point dp){
		dx = dp.x;
		dy = dp.y;
	}

	public MyShape transofrm(MyShape obj){
		Point p = obj.getPosition();
		p.setLocation(p.x + dx, p.y + dy);
		obj.setPosition( p ) // tato medota tu zhodou okolnosti v tomto priklade 
					// nemusi byt to pisem iba ak by si sa rozhodol 
					// pouzit nieco co si premenne x a y udrziava ako 
					// final.
	}
}

public class Canvas extends JPanel{
	// Metody ako vyssie
}
// Na toto vznikol Timer v jave ale urobim to inak
public class Animation implements Runnable{
	
	// Napriklad zadas cestu po ktorej sa bude pohybovat, tu si musis vytovrit
	// Moze to byt napriklad List<Point> -ov cez ktore pojdes, alebo este lepsie
	// List diferencii pointov lebo tej je v skutocnosti nezavysli od toho kde
	// sa aktualne objekt nachadza
	public Animation(Path p, long sleep, Canvas c, List<MyShape> shapes){
		
	}
	// Toto vytvori path polpriamku
	public Animation(int dx, int dy, long sleep, Canvas c, List<MyShape> shapes){

	}
	// Tu bude urcite treba zachytit vynimky InterruptedException
	public void run(){
		for(Point p : path){
			shapeMover.move(p)
			for(MyShape shape : shapes){
				shape = shapeMover.transform(shape);
			}
			c.repaint();
			Thread.sleep(sleep); // V tomto mieste
		}
	}
}

Vseky objekty v classe Animation sa volaju rovnako ako parametre konstruktoru a musis v nome este vytvorit Objekt ShapeMover.

Nahlásit jako SPAM
IP: 158.195.204.–
Jan Vesely
~ Anonymní uživatel
22 příspěvků
7. 5. 2013   #7
-
0
-

Díkes, ještě jedna otázka, je dobré hromadit odkazy na objekty za sebe, jako například:  

gameC.paintC.poziceObjektuX
Nahlásit jako SPAM
IP: 194.12.42.–
sleepy0
Stálý člen
9. 5. 2013   #8
-
0
-

Vacsinou sa to nerobi. Druha vec je ze je dobre mat objekty nastavena ako privatne a pozivat gettery a settery.

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, 41 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ý