[Java] Rotacija slike oz. sprita

Za vse novince v izdelovanju iger.

[Java] Rotacija slike oz. sprita

OdgovorNapisal/-a JanNovak » Ne Jul 22, 2012 11:18 am

Pozdravljeni,

izdelujem svojo 2D igrico in sem naletel na težavo. Trenutno lahko premikam svojega igralca po terenu oz. na panelu z želenimi tipkami, sedaj bi pa hotel da bi se obrnil v smeri miškinega kazalca, vendar je težava v tem, da ga ne znam niti obrniti za nekaj stopinj kaj šele, da bi gledal v smeri kazalca. Nekaj sem se igral z "AffineTransform", vendar mi ni uspelo. Ve kdo kako bi rešil ta problem? :?

Lep pozdrav
Jan Novak
www.androidek.si <- Moja android aplikacija :D
Uporabniški avatar
JanNovak
novinec
novinec
 
Prispevkov: 6
Pridružen: Ne Apr 29, 2012 3:41 pm
Kraj: Ljubljana

Re: [Java] Rotacija slike oz. sprita

OdgovorNapisal/-a Retro » Ne Jul 22, 2012 1:07 pm

Seveda ti znamo pomagati, bos pa moral povedati malce vec, predvsem s cim delas svojo igro. AffineTransform ... kaj je to, html5+css3+javascript? Flash? Kaj drugega?

Lahko prilepis tudi kodo, ki jo trenutno uporabljas za izris igralca, da ti lazje pomagamo.
Uporabniški avatar
Retro
SGD Admin
SGD Admin
 
Prispevkov: 1008
Pridružen: Če Sep 04, 2003 10:14 pm
Kraj: ZX Spectrum 48k+

Re: [Java] Rotacija slike oz. sprita

OdgovorNapisal/-a JanNovak » Ne Jul 22, 2012 3:40 pm

Mislil sem, da je iz naslova razvidno, da gre za Javo oz. javanski programski jezik. :)

No torej koda, ki zagotavlja sliko oz. sprite igralca:

Koda: Izberi vse
        public BufferedImage slika;
       
        ps = null;
        try {
            ps = ImageIO.read(this.getClass().getResource("images/" + "modri_igralec.png"));
        } catch (IOException ex) {}


In pa koda metode, ki ga izrisuje:

Koda: Izberi vse
public void paint(Graphics g) {
        super.paint(g);
        Graphics2D g2d = (Graphics2D)g;
       
        RenderingHints rh = new RenderingHints(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setRenderingHints(rh);

        AffineTransform tx = new AffineTransform();
        tx.rotate(kot, Player.getImageWidth(), Player.getImageHeight());

        AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_BICUBIC);
        ps = op.filter(ps, null);

        g2d.drawImage(teren, 0, 0, this);
        g2d.drawImage(ps,Player.getX(),Player.getY(),this);

}


Player je konstruktor istoimenskega razreda.Metodi getX() in getY(), povesta kam naj Java nariše igralca, ki ga vodim s smernimi tipkami.

To je koda s katero uspešno vrtim igralca, vendar ga malo obreže.

Koda: Izberi vse
        AffineTransform tx = new AffineTransform();
        tx.rotate(kot, Player.getImageWidth(), Player.getImageHeight());

        AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_BICUBIC);
        ps = op.filter(ps, null);


Opis javine metode rotate:

Koda: Izberi vse

rotate(double theta, double x, double y)
Concatenates this transform with a transform that rotates coordinates around an anchor point.


Torej če prav razumem stvar zavrti okoli x in y koordinate. Internetni primeri kažejo, da bi moja koda morala izgledati takole:

Koda: Izberi vse
tx.rotate(kot, Player.getImageWidth()/2, Player.getImageHeight()/2);


Torej, da zavrti mojega igralca v središču slike. No če to storim mi izrisuje le polovico igralca. Brez "/2" polovičk pa mi ga izriše dokaj lepo, vendar mu manjka nekoliko hrbta.


! EDIT
.<(14)> Sem odpravil napako, namreč sprite je bil nepravilne oblike (pravokotnik). Slika je sedaj kvadratna in deluje. Zanima me še kako bi se Vi lotili tega, da bi se igralec zavrtel v smeri miškinega kazalca. Z javo lahko dobim obe koordinati torej X in Y pozicije kazalca, nevem pa kako to potem spremenit v kot kamor naj se obrne igralec.
www.androidek.si <- Moja android aplikacija :D
Uporabniški avatar
JanNovak
novinec
novinec
 
Prispevkov: 6
Pridružen: Ne Apr 29, 2012 3:41 pm
Kraj: Ljubljana

Re: [Java] Rotacija slike oz. sprita

OdgovorNapisal/-a Grandy » Po Jul 23, 2012 8:48 am

Kot se zracuna po naslednjem principu: najprej zracunas razdaljo med kurzorjem in igralcem po x in y osi (dx = mx - ix, dy = my - iy) . Kot zracunas z Math.atan(dy/dx), samo je treba mal prilagodit za vse stiri kvadrante. Mal pobrskej po netu, kode na to temo je cel kup.
Grandy
wannabe
wannabe
 
Prispevkov: 118
Pridružen: Po Sep 22, 2003 9:29 am

Re: [Java] Rotacija slike oz. sprita

OdgovorNapisal/-a Retro » Po Jul 23, 2012 8:33 pm

JanNovak napisal/-a:Mislil sem, da je iz naslova razvidno, da gre za Javo oz. javanski programski jezik. :)


Ja, se opravicujem, sem cisto spregledal Java v naslovu.

Glede problemov s porezavo zal ne poznam detajlov sistema za izris, ki ga uporabljas, bi pa se nekaj dodal k izracunu rotacije kot ti je povedal Grandy. Da se ne zajebavas s kvadranti je lazje kot Atan uporabiti funkcijo Atan2, ki ji podas loceno dy in dx in sama poskrbi, da vrne pravi kot:

Koda: Izberi vse
kot = Math.atan2(dy, dx)
Uporabniški avatar
Retro
SGD Admin
SGD Admin
 
Prispevkov: 1008
Pridružen: Če Sep 04, 2003 10:14 pm
Kraj: ZX Spectrum 48k+

Re: [Java] Rotacija slike oz. sprita

OdgovorNapisal/-a JanNovak » So Jul 28, 2012 4:19 pm

Hvala Vam za odgovore. Razmišljal sem,da bi naredil celozaslonsko igro. To, da bo igra prikazana celozaslonsko nebi smelo biti težav, vendar kako je z grafiko? Oziroma kako so sploh celozaslonske 2D igre zasnovane? Za vsako resolucijo menda niso narejene posebej slike ustreznih velikost ali pač? Pomislil sem na to, da so narejene na najvišji ločljivosti potem pa se jih pomanjša na zaslonsko resolucijo uporabnika? Samo če pomanjšaš v nekem razmerju moraš praznini okoli napolniti in to ni videti preveč lepo, saj želim,da bi bila igra videti vsepovsod isto. Ali je kakšna druga rešitev? Ima kdo izkušnje s tem in bi mi lahko svetoval kaj je najboljša rešitev. .<(5)>
www.androidek.si <- Moja android aplikacija :D
Uporabniški avatar
JanNovak
novinec
novinec
 
Prispevkov: 6
Pridružen: Ne Apr 29, 2012 3:41 pm
Kraj: Ljubljana

Re: [Java] Rotacija slike oz. sprita

OdgovorNapisal/-a Retro » So Avg 04, 2012 12:25 am

Ko gres v polnozaslonski nacin ponavadi dolocis tudi v katero resolucijo gres. Torej ni nujno, ce imas monitor 1440x900, da gres v fullscreen s to velikostjo. Lahko gres tudi v 800x600 in ponavadi ze sam gonilnik doda crne robove pri strani/na vrhu.

Po drugi strani lahko v dolocenih primerih, recimo za igre, kjer je svet igre vecji kot za en ekran, enostavno na vecji resoluciji izrises vec sveta (za primer side-scrollerji/platforme ali pa top-down shooterji/dirkanje).

Ni najboljse resitve - glavno je kaj ti hoces dosezt, oziroma vsak primer ima svojo resitev. Verjetno je zate najboljsa hkrati najbolj enostavna, da se kar omejis na neko fiksno velikost in vse zasnujes okoli tega. Konec koncev tudi flash igre velikokrat delajo znotraj takih okvirov.
Uporabniški avatar
Retro
SGD Admin
SGD Admin
 
Prispevkov: 1008
Pridružen: Če Sep 04, 2003 10:14 pm
Kraj: ZX Spectrum 48k+


Vrni se na Začetniki

Kdo je na strani

Po forumu brska: 0 registriranih uporabnikov in 1 gost

cron