Pomoc oko JAVA programiranja!

Stale

New Member
Joined
Sep 29, 2006
Messages
2,066
Likes
0
Points
0
#21
Pa nemam pojma ti njemu napomeni da si odradio double buffering i optimizovao kod pa ako se jos bude zalio, pokusaj da ga jos malo restruktuiras moze biti da pomogne.

Da li planiras da izmenis slicice tvog aviona? tj. da ti pri skretanju ucita drugu sliku. jer ako neces taj deo koda ti je nepotreban.
 

master_yoda

on probation
Joined
Dec 23, 2004
Messages
3,646
Likes
0
Points
0
#22
Znaci time sto je u updateu paint(g) a u paintu ono sto je bilo tamo sam ja ustvari odradio double buffering?

U original igri su bile razlicite slicice za levo i desno, ja nisam to radio vec sam stavljao istu sliku za sve, sta da izbacim onda? Nesto sam probao ali onda je umesto aviona bila prikazana eksplozija i nakon slupanja.
 

Stale

New Member
Joined
Sep 29, 2006
Messages
2,066
Likes
0
Points
0
#23
Znaci ovo iz paintFrame
Code:
if(pravac.equals(\"slupan\"))  //Stavlja druge slike za avion.
     mojAvion = getImage(getCodeBase(), \"eksplozija.gif\");
if(pravac.equals(\"stop\") || pravac.equals(\"gorelevo\") || pravac.equals(\"goredesno\"))
     mojAvion = getImage(getCodeBase(), \"avion1.gif\");
if(pravac.equals(\"levo\"))
   mojAvion = getImage(getCodeBase(), \"avion2.gif\");
if(pravac.equals(\"desno\"))
   mojAvion = getImage(getCodeBase(), \"avion3.gif\");
if(pravac.equals(\"dolelevo\"))
   mojAvion = getImage(getCodeBase(), \"avion4.gif\");
if(pravac.equals(\"doledesno\"))
   mojAvion = getImage(getCodeBase(), \"avion5.gif\");
if(pravac.equals(\"dole\"))
{
if(smer < 8)  //Stavlja slike na osnovu smera.
    mojAvion = getImage(getCodeBase(), \"avion6.gif\");
else
{
   mojAvion = getImage(getCodeBase(), \"avion7.gif\");
    if(smer >= 16)
    smer = 0;
  }
}
zameni sa ovim:

Code:
if(pravac.equals(\"slupan\"))  //Stavlja druge slike za avion.
     mojAvion = getImage(getCodeBase(), \"eksplozija.gif\");
else
mojAvion = getImage(getCodeBase(), \"avion1.gif\");

if(smer >= 16) smer = 0;
i slobodno obrisi te slike koje su visak avion2-7.

Double buffering se odnosi na to da se ne iscrtava direktno u output buffer (u tvom slucaju ne crtas direktno po Graphics g objektu apleta) nego se prvo sve iscrtavanje odradi u offscreen bufferu koji se trenutno ne iscrtava pa se onda izvrsi zamena buffera (u tvom slucaju crtas na Graphics objektu vanSlike koji se zove vanGrafike i kada sve iscrtas na njemu vanSlike iscrtas na Graphics-u od apleta).
Nadam se da sam donekle razumljivo objasnio :)

[Edited on 14.6.2011 by Stale]
 

master_yoda

on probation
Joined
Dec 23, 2004
Messages
3,646
Likes
0
Points
0
#24
Uspeo sam i to da promenim, sada nemam te avione viska. :) I mislim da sam te razumeo po kom principu radi double baffering.

Evo ga izmenjeni kod:

https://rapidshare.com/files/3015066382/javaProjekat2.rar

Valjda je to-to sad? I dalje trepere ovi ostali avioni, ptice i oblaci ali to valjda tako mora?

E da, PUNO ti hvala na pomoci. :)
 

Stale

New Member
Joined
Sep 29, 2006
Messages
2,066
Likes
0
Points
0
#25
inicijalizaciju slicica za novcic, oblak i ostalo prebaci u konstruktor od tih klasa. jedino mozda pticu ostavi tu posto njoj menjas slicicu, al i to ti je bolje da napravis tako da u klasi Ptica imas dva Image objekta koja loadujes pri kreiranju same ptice. Pa tamo kad poredis pravac ptice samo pozoves iscrtavanje druge slike.

znaci ovo:
Code:
novcicSlika = getImage(getCodeBase(), \"novcic.gif\");
prebaci u konstruktor od novcica. i tako isto za ostale.

Paint deo mora da ti bude sto rastereceniji, jer ako tu imas previse racunanja, ucitavanja i ostalih cuda seckace ti slika. Primetio si da u vecina igara ima loading deo gde kreiraju vecinu objekata, ucitavaju texture, sprajtove... i ostalo sto ce kasnije iscrtavati, jer je \"skupo\" da se to radi u toku iscrtavanja.

ovo izbaci skroz, jer ovako 2x pozivas iscrtavanje vanSlike:

Code:
			if (vanSlike != null)  //Pravi vanSlike ako ne postoji.
			{
				g.drawImage(vanSlike, 0, 0, null);
			}

			if(vanGrafike == null)
			{
				vanSlike = createImage(500, 500);
				vanGrafike = vanSlike.getGraphics();
			}
Jos uvek nisi odradio pravac kao enumeraciju sto bi trebao da uradis, jer imas dosta poredjenja.



[Edited on 15.6.2011 by Stale]
 

master_yoda

on probation
Joined
Dec 23, 2004
Messages
3,646
Likes
0
Points
0
#26
Code:
	class Novcici
	{
		public int x;  //x i y koordinate za novcice.
		public int y;
		Image novcicSlika;
			
		public Novcici()
		{
			mojiNovcici[i].novcicSlika = getImage(getCodeBase(), \"novcic.gif\");
			
		}
To daje error, negde drugde treba da premestim?

Obrisao sam to drugo pozivanje iscrtavanja slike a enumeraciju nisam bio uspeo da namestim...
 

Stale

New Member
Joined
Sep 29, 2006
Messages
2,066
Likes
0
Points
0
#27
[rquote=622599&tid=34864&author=master_yoda]
Code:
	class Novcici
	{
		public int x;  //x i y koordinate za novcice.
		public int y;
		Image novcicSlika;
			
		public Novcici()
		{
			mojiNovcici[i].novcicSlika = getImage(getCodeBase(), \"novcic.gif\");
			
		}
To daje error, negde drugde treba da premestim?

Obrisao sam to drugo pozivanje iscrtavanja slike a enumeraciju nisam bio uspeo da namestim...[/rquote]

Probaj ovako:
Code:
	class Novcici
	{
		public int x;  //x i y koordinate za novcice.
		public int y;
		Image novcicSlika;
			
		public Novcici()
		{
			novcicSlika = getImage(getCodeBase(), \"novcic.gif\");
			
		}
Pokusaj jos jednom enumeraciju. ne bi trebalo da bude tesko. Bukvalno ce ti sve ostati skoro isto samo ces imati npr. Pravac.stop umesto \"stop\". i promenljiva pravac ce ti biti tipa Pravac, a ne tipa string.

edit: i nemoj odma odustajati ako ti izbacuje gresku. Nije to kraj sveta :D Eclipse je veoma pametno okruzenje i prilicno je lako resiti vecinu problema, a i tako ces najbolje nauciti.

[Edited on 15.6.2011 by Stale]
 

master_yoda

on probation
Joined
Dec 23, 2004
Messages
3,646
Likes
0
Points
0
#28
Opet error i tako, ponudjeno resenje je:

Code:
		private Image getImage(Object codeBase, String string) {
			return null;
		}

		private Object getCodeBase() {
			return null;
		}
Da ostavim sa tim? Onda je bez errora.

Nakon sto sam to uradio ne prikazuje vise slike. :/

[Edited on 15.6.2011 by master_yoda]
 

Stale

New Member
Joined
Sep 29, 2006
Messages
2,066
Likes
0
Points
0
#29
ne ne :D

Code:
class Novcici
	{
		public int x;  //x i y koordinate za novcice.
		public int y;
		Image novcicSlika;
		Applet owner;
			
		public Novcici(Applet owner)
		{
			this.owner = owner;
			novcicSlika = owner.getImage(owner.getCodeBase(), \"novcic.gif\");
		}
		
		public void newNovcici(Random g1)  //Funkcija za generisanje novog novcica.
		{
			...
		}
		
		public void pomeriNovcic(int y1, Random g1)  //Funkcija za pomeranje novcica.
		{
			...
		}
	}

ovako ga kreiras u Avioni klasi:

mojiNovcici[i] = new Novcici(this);

a ovo izbaci: 

mojiNovcici[i].novcicSlika = getImage(getCodeBase(), \"novcic.gif\");
getImage i getCodeBase su metode iz apleta i zato nisi mogao da im pristupis. Zato moras da dodas referencu na aplet u klasu Novcic da bi mogao da ih pozoves. A onda pri pozivu konsturktora prosledis \"this\" sto je ustvari referenca na sam aplet Avioni.

[Edited on 15.6.2011 by Stale]
 

master_yoda

on probation
Joined
Dec 23, 2004
Messages
3,646
Likes
0
Points
0
#30
Radi sad, poslacu veceras profesoru pa se nadam da ce biti zadovoljan sa ovom verzijom. :)

Hvala puno!
 

Stale

New Member
Joined
Sep 29, 2006
Messages
2,066
Likes
0
Points
0
#31
Ma nema na cemu :)
Ako ne uspes da odradis enumeraciju onda bar stavi neke int konstante umesto stringova.
 

master_yoda

on probation
Joined
Dec 23, 2004
Messages
3,646
Likes
0
Points
0
#32
I dalje ima jako mnogo treperenja. Ne znam kako ste implementirali dvostruko baferisanje (nisam analizirao kod),
ali uzasno treperi. Pa, valjda je tako i kod Vas? Molim Vas, popravite to ponovo.
Pa sta vise da radim? :(
 

Stale

New Member
Joined
Sep 29, 2006
Messages
2,066
Likes
0
Points
0
#33
Hm, jesi zamenio stringove sa necim drugim? Sad ces morati da rasteretis onaj paint maksimalno. Probaj i da smanjis dimenzije apleta pa samim tim i broj aviona i novcica. Mada mi nije jasno kako njemu treperi.
 

master_yoda

on probation
Joined
Dec 23, 2004
Messages
3,646
Likes
0
Points
0
#34
Nisam ozbiljnije menjao nista da ne bi promena u jednoj klasi sve pokvarila. :/

Izgooglao sam ovo:

http://www.javacooperation.gmxhome.de/BildschirmflackernEng.html

I odatle iskopirao ovo:

Double buffering: the code

// declare two instance variables at the head of the program
private Image dbImage;
private Graphics dbg;

... other code ...

/** Update - Method, implements double buffering */
public void update (Graphics g)
{
// initialize buffer
if (dbImage == null)
{
dbImage = createImage (this.getSize().width, this.getSize().height);
dbg = dbImage.getGraphics ();
}

// clear screen in background
dbg.setColor (getBackground ());
dbg.fillRect (0, 0, this.getSize().width, this.getSize().height);

// draw elements in background
dbg.setColor (getForeground());
paint (dbg);

// draw image on the screen
g.drawImage (dbImage, 0, 0, this);
}
As I said before you can copy and paste this code into every applet that uses animations!
Mozda to resava problem? Meni i dalje izgleda isto, ali dok sam pokusavao da namestim sam izazvao neko treperenje tako da pretpostavljam da njemu tako izgleda, samo mi nije jasno zasto. :(
 

Stale

New Member
Joined
Sep 29, 2006
Messages
2,066
Likes
0
Points
0
#35
To ti je opet isto kao i ono sto si ti uradio. Ja ne vidim nikakv problem sa tvojom implementacijom double buffering-a.
Kao sto sam ti ranije rekao prva stvar koja mi upada u oci je ono poredjenje stringova koga ima stvarno dosta, a sigurno ti trosi dosta resursa.
 

Stale

New Member
Joined
Sep 29, 2006
Messages
2,066
Likes
0
Points
0
#37
Code:
public enum Pravac {
    start1, usporenje, izlaz, gorelevo, goredesno // i tako nabrojis sve one stringove koje si koristio za pravac
}

umesto :
private String pravac = \"start1\";
imaces:
private Pravac pravac = Pravac.start1; // umesto stringa pravac imao bi ovo
umesto:
private String tempPravac = \"\";
private Pravac tempPravac;
...
kod dodele imaces umesto:
pravac = \"dole\";
imaces:
pravac = Pravac.dole; 

i tako na svakom mestu gde imas dodelu vrednosti pravcu i tempPravcu



dole kod poredjenja
umesto:
if(pravac1.equals(\"izlaz\")) 

imaces:

if(pravac1.equals(Pravac.izlaz)) // ovako bi ga poredio. Ovo ti je puno brze nego kad bi poredio stringove

ovo izmenis svuda gde imas poredjene
 

Stale

New Member
Joined
Sep 29, 2006
Messages
2,066
Likes
0
Points
0
#39
mozes nece da skodi.
Jesi i za ptice i ostale avione stavio da se slika ucitava u konstruktoru?
 
Top