600 likes | 839 Views
3 dalis : Greenfoot objektų valdymas, efektai, animacija , atsitiktinumai. James Brucker Kasetsart University 2010 Lietuvi ška (KTU) versija – 2011 Tomas Blažauskas , Eimutis Kar čiauskas. Nagrinėjamos t emos. Kaip groti gars ą ? Kaip įvertinti klaviatūros paspaudimus ?
E N D
3 dalis: Greenfoot objektų valdymas, efektai, animacija, atsitiktinumai James Brucker Kasetsart University 2010 Lietuviška (KTU) versija – 2011 Tomas Blažauskas, Eimutis Karčiauskas
Nagrinėjamos temos • Kaip groti garsą ? • Kaip įvertinti klaviatūros paspaudimus ? • Kaip animuoti veikėjus ? • Naudoti atsitiktinumus • Sukurti įdomų žaidimą su animacija Demostracinė medžiaga • Krabų žaidimas iš pamokų 1-2
Kaip groti garsą Greenfootklasė turistatinįmetodągarsinių failų grojimui. Greenfoot 1.5 gali groti WAV, AU, ir AIFF formatus. Greenfoot 2.0 gali groti ir MP3. Greenfoot "play Sound" metodas: Greenfoot.playSound( "slurp.wav" ); Garso failas Klasėspavadinimas (ne objektas)
Kur yra garso failai? • Scenarijaus garsai yra "sounds" kataloge. • Crabgame scenarijus naudoja du failus: slurp.wavirau.wav. soundskatalogas
Pratimas: Pagrokite garsą Užduotis: Pakeiskite Crab klasę, kad būtų grojamas "slurp.wav" tuo metu, kai krabas suvalgo slieką. act( ) { move if canSee( Worm ) eat Worm playSound "slurp.wav" else if atWorldEdge turn 15 degrees }
Groti "slurp" garsą public void act() { move( ); // jei matome ką suvalgyti... if ( canSee( Worm.class ) ) { eat( Worm.class ); } // if at edge of world, then turn else if ( atWorldEdge() ) turn( 15 ); } Groti garsą Į bloką
Hakeriams: parašykite metodą ADVANCED Tikslas:norime paprasto kodo. Jei kodas tampa sudėtingu, išskaidykite jį į kelis metodus. • Sukurkite naują metodąslieko suvalgymuiirgarso grojimui. public void act() { move( ); // jei matome ką suvalgyti... if ( canSee( Worm.class ) ) eatWithSound( Worm.class ); // jei krašte, tuomet pasisukti else if ( atWorldEdge() ) ... Naujas metodassuvalgymui irgarsui
Hakeriams: parašyti metodą • Sukurkite naują metodą pavadinimueatWithSound • Jis turiparametrą, kuris nusako ką suvalgyti. Parametrasmetodui. /** * Kažką suvalgyti ir pagroti garsą. * @param maistas yra tai kas suvalgoma */ public void eatWithSound( Class food ) { super.eat( food ); Greenfoot.playSound( "slurp.wav" ); } Naudokite parametrą.
Padarykite žaidimą smagesniu Mes norimežaistiKrabų žaidimą. KAIP? Kokios jūsų idėjos?
Klaviatūros paspaudimų naudojimas Mes norimepajudinti krabąnaudodami klaviatūros rodykles. Rodyklė į viršųjudėti pirmyn Rodyklė į kairę Pasisukti kairėn Rodyklė į dešinę Pasisukti dešinėn Rodyklė žemynjudėti atgal
Niekas nepaspausta? Jei žmodus nieko nedaro,Krabasjudapats.. move( )
Kaip gauti klaviatūros paspaudimus (1) Greenfootklasė turi2 metoduspaspaustiems klavišams nustatyti: (1) Greenfoot.isKeyDown( "a" ) patikrintiarklavišas "a" yra paspaustas – jei taip, grąžinamatrue if ( Greenfoot.isKeyDown("up") ) /* Rodyklė į viršų paspausta */;
Kaip gauti klaviatūros paspaudimus (2) (2)String key = Greenfoot.getKey(); grąžinapaskutinį paspaustą klavišą. String key = Greenfoot.getKey(); if ("up".equals(key)) /* Rodyklė į viršų paspausta */; • Jei klavišas nebuvo paspaustas, getKey()grąžinanull. • Kai iškviečiategetKey(), Greenfoot pamirštaklavišą. • Pagrindinis būdas eilučių lyginimui: "up".equals(key)
Kvizas: Koks metodotipas? isKeyDown()ir getKey()įgyvendintiGreenfoot. Jie nėra objekto dalis. Kaip vadiname tokius metodus? (2atsakymai) 1. _________________ 2. _________________
Mygtukų pavadinimai Mygtukų, kuriuos naudosime, pavadinimai yra: "up" Rodyklė "down" Rodyklė "left" Rodyklė "right" Rodyklė "a" 'a' mygtukas Norite žinoti daugiau? PeržvelkiteGreenfoot Class Documentationsusipažinimui suGreenfootklasėmis.
Klaviatūros apdorojimo logika Jei paspausta "left" pasisuktikairėn kitaipjei paspausta "right" pasisuktidešinėn kitaipjei paspausta "up" judėti pirmyn kitaipjei paspausta "down" judėti atgal kitaip judėti normaliai
isKeyDown( ) isKeyDown("key")grąžinatrue,jei klavišas tuo momentu yra paspaustas. if ( Greenfoot.isKeyDown("left") ) turn( -30 ); // pasisukti kairėn else if ( Greenfoot.isKeyDown("right") ) ... // pasisukti dešinėn else if ( Greenfoot.isKeyDown("up") ) ... // judėti pirmyn
Kaip judėti pirmyn? Judėtipirmynnėra lengva. Mes turime žinoti,kokia kryptisyra “pirmyn". Jei iškviesimemove( )Krabas pajudės dešinėn. ? Kaippanaudotimoveirturn metodus judėjimuipirmyn?
Kaip judėti pirmyn? moveForward: turn -90 degrees (left) move turn 90 degrees (right) • Kombinuokite elgseną, kurią jūs jau turite tam, kad sukurti naują elgseną. po prieš
Tampa sudėtinga. Ką daryti? Jei paspausta "left" pasisuktikairėn kitaipjei paspausta "right" pasisuktidešinėn kitaipjei paspausta "up" judėti pirmyn kitaipjei paspausta "down" judėti atgal kitaip judėti normaliai Norime apdoroti klaviatūrą metode act( ). Bet šis kodas yra ganėtinaiilgas. Ką galime padaryti?
Kur padėti paspaudimų apdorojimo logiką? Kur turėtume padėti klaviatūros apdorojimo logiką? • act( ) • move( ) • naujame metode? Programos kūrimas turi daugiau nei vieną “teisingą" kelią! PROGRAMINĖS ĮRANGOS PROJEKTAVIMAS Programų inžinieriaitaip patprojektuojaprogramas. Tai yraprojektavimoklausimas: “kur sudėti elgseną?"
1-as pasirinkimas: įdėti į metodą act( ) public void act( ) { if ( Greenfoot.isKeyDown("left") ) turn( -30 ); // kairėn else if ( ... ) ... // dešinėn else if ( ... ) moveForward(); else if ( ... ) moveBackward(); else move( ); // nepaspausta if ( canSee( Worm.class ) ) eatWithSound( Worm.class ); Pernelyg sudėtinga
Pasirinkimas: Sukurti move( ) metodą Klaviatūros apdorojimas susijęs sujudėjimo elgsena. Taigi, move( )yra geras pasirinkimas. public void act( ) { move( ); if ( canSee(Worm.class) ) eat( Worm.class ); else if ... } public void move( ) { if ( Greenfoot.isKeyDown("left") ) turn( 30 ); else if ( ... ) ... else super.move( ); } Iškviečiame move( ) metodąpriklausantį Animal
Pasirinkimas: Sukurti naują metodą Klaviatūros apdorojimas yranauja elgsena. Taigi, naujas metodastaip pat yra geras pasirinkimas. public void act( ) { moveWithKeyboard( ); if ( canSee(Worm.class) ) eat( Worm.class ); else if ... } public void moveWithKeyboard( ) { if ( Greenfoot.isKeyDown("left") ) turn( 30 ); else if ( ... ) ... } else { move( ); } Iškviečiame move( ) metodąpriklausantį Animal
Pratimas: Įgyvendinkite klaviatūros apdorojimą • Sukurkite naują metodą moveWithKeyboard • Apdorokite visų 4 rodyklių mygtukus. • Jei nepaspausta, judėti normaliai • Pasisuktipasaulio krašte. Rodyklė į viršųjudėti pirmyn Rodyklė į kairę Pasisukti kairėn atWorldEdge Pasisukti -15 Rodyklė į dešinę Pasisukti dešinėn Rodyklė žemynjudėti atgal
Dažnai testuokite savo programą • Parašykitenedaugkodo... • Ištestuokitejį... • Parašykitedar truputįkodo... • Ištestuokitejį...
Actor’iaus animacija Norime, kad krabas atrodytų gyvesnis. Krabas turijudėtisavo kojomis ir žnyplėmis.
Kaip sukurti animaciją • Naudoti paveikslėliųseką, kurioje paveikslėliai truputį skiriasi. • Kas kelias milisekundes pakeisti paveikslėlį. image0 image1 image2 image3 image4 image5
Crabgame scenarijus turi 2 krabų pav. • Dešiniu mygtukuspauskite ant krabo klasės ir pasirinkite "set image". Greenfootrodys du paveiksliukus: "crab.png" "crab2.png"
Crab eat( ) move( ) setImage( ) turn( ) Actor’iusturi paveiksliuką Kiekvienas aktorius turi paveiksliuką, kurio tipas yraGreenfootImage. Galitepakeistipaveiksliukąnaudojant: actor.setImage( image ) Pav. 1 : GreenfootImage setImage setImage Pav. 2 : GreenfootImage
"animate" elgsena animate: jeirodomas pav. yraimage1tuomet rodyti paveiksliukąimage2 kitaip rodyti paveiksliukąimage1 setImage( image2 ) "crab2.png" "crab.png" setImage( image1 )
Kaip sužinoti rodomąpaveiksliuką? ? animate: if rodomas pav. yraimage1tai rodyti pav.image2 Actor’iusturigetImage( ) metodą Jis grąžinanuorodąį rodomą paveiksliuką. "==" palyginair nustato ar lyginamos reikšmėsvienodos. if ( getImage()== image1 ) setImage( image2 );
Sukurkite paveikslėlių objektus • Redaguokite Crab klasę. • Sukurkite GreenfootImage objektus: image1irimage2. public class Crab extends Animal { private GreenfootImageimage1 = new GreenfootImage("crab.png"); private GreenfootImageimage2 = new GreenfootImage("crab2.png"); Tai yra Crab klasėsatributai
animate() elgsena Java kalboje • Parašykite animate() metodą Crab klasėje. • Tegul jis bus prieinamas(public), kad mes jį galėtume kviesti iš kitų klasių. /** Animuoti actor’ių */ public void animate( ) { if ( getImage() == image1 ) setImage( image2 ); else setImage( image1 ); }
Patestuokite interaktyviai! • Sukurkite krabo objektą. • Dešiniu mygtukuiškvieskiteanimate( ). Ar veikia?
Naudokite animaciją Kiekvieną kartą, kai krabaspajuda, iškvieskiteanimate( ). public void act( ) { moveWithKeyboard( ); animate( ); if ( canSee( Worm.class ) ) eatWithSound( Worm.class ); ... }
Sukompiliuokite ir patestuokite programą Ar krabas atrodogyvesnis?
Sliekų animacija Sliekai kraiposi, bet nedaug. Dažniausiai sliekai yra tingūs.
Kaip animuoti slieką • Sliekas turi 1 paveiksliuką. • Norėtume, kad sliekas krypuotųapie savo vertikalią centro ašį. Idėja: Gal galimehorizontaliai “apversti" slieko paveiksliuką tam, kad sukurtume naują? flip
Greenfoot dokumentacijos naudojimas • Pasirinkite Help → Greenfoot Class Documentation Paspauskite GreenfootImage Pasirinkite Methods
GreenfootImage metodai • Dokumentacija rodoma naršyklėje Jėga! Tai ko mums reikia.
Sukurti 2 sliekų paveikslus Padarysime slieko kopiją, o tuomet jį apversime. image1 = getImage() // gauti slieko pav. image2 = image1kopija // apversti hor. image2 image2.mirrorHorizontally( )
Sukurti 2 sliekų paveikslus Turime tai suprogramuotiKonstruktoriuje public class Worm extends Animal { private GreenfootImage image1; private GreenfootImage image2; /** Slieko konstruktorius */ public Worm( ) { image1 = getImage(); image2 = new GreenfootImage(image1); // apverčiame paveiksliuką image2.mirrorHorizontally(); } Padarome sliekokopiją
Pratimas: animuokite slieką • Worm klasėje sukurkite metodą animate. • Pratestuokite savo sliekus. /** Animuoti slieką */ public void animate( ) { } Kodas toks pats kaip animuojant krabą.
Naudokite Animate metodą Iškvieskiteanimate,paspausdamiact( ). /** animuoti */ public void act( ) { animate( ); } Išmėginkite programą, paleiskite žaidimą
Ooops! • Sliekai per daug juda. • Visi sliekai judavienu metu – tai nenatūralu. Koks sprendimas?
AtsiTiktiNnumai • Žaidimai tampa įdomesni, kai negalimenumatyti elgsenos. • Naudokite atsitiktinius skaičius norėdami paįvairintižaidimą. Norint gautiatsitiktinį skaičiųtarp 0 ir 5: // atsitiktiniai sk. 0, 1, 2, 3, or 4 int rand = Greenfoot.getRandomNumber( 5 ); Atsitiktinis skaičius tarp 0 ir 10: int rand = Greenfoot.getRandomNumber( 10);
Atsitiktinis sliekų judėjimas animate( ) { parinkti atsitiktinį skaičių jei atsitiktinis skaičius 0 animuoti kitaip nieko nedaryti } • Pamėginkite patys parašyti tokį kodą nežiūrėdami į kitą skaidrę.
Atsitiktinė Animacijasliekams /** animuoti sliekus atsitiktinai */ public void animate( ) { int rand = Greenfoot.getRandomNumber(5); if ( rand == 0 ) { // animuoti if ( getImage() == image1 ) setImage( image2 ); else setImage( image1 ); } } Tikimybė: 1/5.
Kaip aktoriai juda? Krabe mes naudojome move( ). Aktoriai gali pakeisti savo poziciją ir kitais būdais.