Autopeli jossa käytetään gif kuvia karttana ja autona. Autoa ohjataan nuolinäppäimillä. Auto pysähtyy jos se meinaa mennä ulos valkoiselta alueelta joka on tie. Voi kokeilla osoitteessa http://koti.mbnet.fi/nordto/picturerally.html.
Peli perii luokan Applet ja näin ollen on appletti joka toimii selaimessa. Käyttää runnable rajapintaa ja toteuttaa siis säikeen jolla peliä pyöritetään. Ohjelma lukee ainakin gif päätteisiä kuvia (kuvat saa ladattua yllä olevasta osoitteesta) ja varmaan muitakin ja rakentaa niistä autopelin. Toimii myös ilman kuvia.
PictureRally.java
/*Kyseessä on autopeli jossa autolla ajetaan nuolinäppäimiä käyttäen. *Ohjelma toimii applettina internetselaimessa joten tarvitaan tälläinen teksti sivulla *<APPLET code = "PictureRally.class" width = "800"height = "600"></APPLET> *Ohjelma toimii yhdellä säikeellä ja se kuuntelee näppäimistöä. *Perusidea on käyttää BufferedImage luokan getRGB metodia jolla saadaan *kuvasta yhden pisteen väritiedot. Jos väri on oikea saa auto jatkaa siihen *suuntaan jos taas väärä auto ei mene siihen suuntaan. *Ohjelman olisi tarkoitus käyttää kuvia jotka ovat samassa kansiossa Class *tiedoston kanssa, mutta ohjelma toimii ilmankin näitä kuvia. *tjn teki tämän ohjelman*/ import java.awt.*; import java.applet.*; import java.awt.image.*; import java.awt.event.*; public class PictureRally extends Applet implements Runnable { //Kuva on kuva joka piirretään näytölle ja josta katsotaan RGB tietoja //kuva on myös puskuri jolle piirretään ennen kuin piirretään näytölle private BufferedImage kuva; /*Tässä on käytetty Graphics2D tavallisen sijaan. Siitä ei ole ohjelmassa *hyötyä, mutta jos ohjelmaa kehittäisi siinä voisi tarvita joitain 2D *ominaisuuksia*/ private Graphics2D graf; //Seuraavia muuttujia tarvitaan auton ohjaamisessa //Huom tässä ohjelmassa ei ole pyritty aitoon fysiikkaan. private boolean oikealle=false; private boolean vasemmalle=false; private boolean kaasu=false; private boolean jarru=false; private int x=65; private int y=65; private double suunta=0; private double sivuSuunta; private int vauhti=0; //Imaget jotka ladataan //img on ladattava kartta.gif private Image img; //imgB on kartta jos ei ole kartta.giffiä private Image imgB; private Graphics imBg; //auto kuvattuna 16:sta kulmassa private Image a360; private Image a22; private Image a45; private Image a68; private Image a90; private Image a112; private Image a135; private Image a158; private Image a180; private Image a202; private Image a225; private Image a248; private Image a270; private Image a292; private Image a315; private Image a338; //inittiä kutsutaan kun apletti käynnistyy public void init() { //musta tausta this.setBackground(Color.black); //apletin koko this.setSize(800,600); //BufferedImagen konstruktori on eri kuin tavalllisen imagen //TYPE_INT_RGB tarkoittaa RED GREEN BLUE eli tyyppiä jossa jokainen //piste on koodattu punasena vihreänä ja sinisenä. this.kuva=new BufferedImage(800,600,BufferedImage.TYPE_INT_RGB); this.graf = this.kuva.createGraphics(); this.graf.setColor(Color.black); //imgb:tä käytetään jos ei ole kartta.giffiä this.imgB=createImage(800,600); //piirretään vara kartta this.imBg = this.imgB.getGraphics(); this.imBg.setColor(Color.white); this.imBg.fillOval(50,20,180,180); this.imBg.fillOval(50,170,180,180); this.imBg.setColor(Color.black); this.imBg.fillOval(100,70,80,80); this.imBg.fillOval(100,220,80,80); //Apletissa on valmiina getImage komento this.img = getImage(getCodeBase(), "kartta.gif"); //Tässä img piirretään this.kuvaan this.graf.drawImage(this.img,0,0,this); //kaikki autot ladataan //autot ovat gif kuvia joita on piirto ohjelmalla pyöritetty //autojen taustat pitää olla läpinäkyviä this.a360 = getImage(getCodeBase(), "auto360.gif"); this.a22 = getImage(getCodeBase(), "auto22.gif"); this.a45 = getImage(getCodeBase(), "auto45.gif"); this.a68 = getImage(getCodeBase(), "auto68.gif"); this.a90 = getImage(getCodeBase(), "auto90.gif"); this.a112 = getImage(getCodeBase(), "auto112.gif"); this.a135 = getImage(getCodeBase(), "auto135.gif"); this.a158 = getImage(getCodeBase(), "auto158.gif"); this.a180 = getImage(getCodeBase(), "auto180.gif"); this.a202 = getImage(getCodeBase(), "auto202.gif"); this.a225 = getImage(getCodeBase(), "auto225.gif"); this.a248 = getImage(getCodeBase(), "auto248.gif"); this.a270 = getImage(getCodeBase(), "auto270.gif"); this.a292 = getImage(getCodeBase(), "auto292.gif"); this.a315 = getImage(getCodeBase(), "auto315.gif"); this.a338 = getImage(getCodeBase(), "auto338.gif"); /*MediaTrackeriä käytetään joskus internetissä kun halutaan ladata *paljon kuvia tai ääniä johonkin applettiin. Jos tätä ei olisi *kuvat vähän välkkyisivät aluksi*/ MediaTracker mt = new MediaTracker(this); mt.addImage(a360, 0); mt.addImage(a22, 1); mt.addImage(a45, 2); mt.addImage(a68, 3); mt.addImage(a90, 4); mt.addImage(a112, 5); mt.addImage(a135, 6); mt.addImage(a158, 7); mt.addImage(a180, 8); mt.addImage(a202, 9); mt.addImage(a225, 10); mt.addImage(a248, 11); mt.addImage(a270, 12); mt.addImage(a292, 13); mt.addImage(a315, 14); mt.addImage(a338, 15); mt.addImage(this.img, 16); mt.addImage(this.imgB, 17); mt.addImage(this.kuva, 18); try { //odottaa kaikkia kuvia mt.waitForAll(); } catch (InterruptedException e) { } //Luodaan säie joka pyörittää ohjelmaa. Luokka PictureRally toteuttaa //runnablen implements runnable joten Threadia luodessa käytetään this Thread thread =new Thread(this); thread.start(); //Näppäimistön kuuntelija luodaan näin KeyListener kuuntelija=new KeyAdapter(){ //jos jotain nuolinäppäintä painaa sitä vastaava boolean muuttuja //tulee todeksi public void keyPressed(KeyEvent e){ if (e.getKeyCode()==KeyEvent.VK_RIGHT){ oikealle=true; } if (e.getKeyCode()==KeyEvent.VK_LEFT){ vasemmalle=true; } if (e.getKeyCode()==KeyEvent.VK_UP){ kaasu=true; } if (e.getKeyCode()==KeyEvent.VK_DOWN){ jarru=true; } } //Vastaavasti jo jonkun nuolinäppäimen nostaa ylös sitä vastaava //muuttuja menee epätodeksi public void keyReleased(KeyEvent e){ if (e.getKeyCode()==KeyEvent.VK_RIGHT){ oikealle=false; } if (e.getKeyCode()==KeyEvent.VK_LEFT){ vasemmalle=false; } if (e.getKeyCode()==KeyEvent.VK_UP){ kaasu=false; } if (e.getKeyCode()==KeyEvent.VK_DOWN){ jarru=false; } } }; //lopuksi lisätään luotu kuuntelija addKeyListener(kuuntelija); } //run on metodi joka pitää olla aina luokalla jos se toteuttaa runnable //rajapinnan public void run(){ //käydään ikuista lenkkiä while(true){ //odotetaan 50 millisekunttia aikaa menee muuhunkin kuin tähän joten //peli on oikeasti hitaampi try{ Thread.currentThread().sleep(50); }catch(InterruptedException e){ } //Ohjelma käyttää radiaaneja eli 6.28 on ympyrä //suunta on se suunta johon auton nokka osoittaa //sin cos lasku syistä 0 radiaania on pos x akselin suuntaan if(vasemmalle==false&&oikealle==true){ this.suunta+=0.3; } if(vasemmalle==true&&oikealle==false){ this.suunta-=0.3; } //jos suunta menee negatiiviseksi pyöräytetään se positiiviseksi //Math.PI on pii ja se kerrottuna kahdella on ympyrä if(this.suunta<0){ this.suunta+=Math.PI*2; } //jos suunta ylittää yhden ympyrän siitä vähennetään ympyrä //tässä otetaan jakojäännös koko ympyrästä this.suunta=this.suunta%(Math.PI*2); //kaasu on 0-10 ei voi peruuttaa if(this.kaasu&&this.vauhti<10){ this.vauhti++; } if(this.jarru&&this.vauhti>0){ this.vauhti--; } //tässä piirretään kuvan grafiikalle ensin vaihtoehto kartta ja sitten //kansiosta ladattava this.graf.drawImage(this.imgB,0,0,this); this.graf.drawImage(this.img,0,0,this); //kuvasta katotaan auton vieressä olevien kohtien värit jos väri on -1 //eli valkoinen saa mennä if(kuva.getRGB(this.x+15,this.y+5)==-1&&Math.cos(this.suunta)*this.vauhti>0) this.x+=Math.cos(this.suunta)*this.vauhti; if(kuva.getRGB(this.x-5,this.y+5)==-1&&Math.cos(this.suunta)*this.vauhti<0) this.x+=Math.cos(this.suunta)*this.vauhti; if(kuva.getRGB(this.x+5,this.y+15)==-1&&Math.sin(this.suunta)*this.vauhti>0) this.y+=Math.sin(this.suunta)*this.vauhti; if(kuva.getRGB(this.x+5,this.y-5)==-1&&Math.sin(this.suunta)*this.vauhti<0) this.y+=Math.sin(this.suunta)*this.vauhti; //kuva piirretään säikeen lopussa uudestaan repaint(); } } public void update(Graphics g){ paint(g); } public void paint(Graphics g) { //tässä on vaihtoehto auto jos ei ole piirrettyä autoa this.graf.fillRect(this.x+1,this.y+1,8,8); //tässä muutetaan käytännön syistä radiaanit omiksi asteiksi jossa 32 on ympyrä //Autojen kuvien nimet ovat 90 asteen kulmassa auton menosuuntaan nähden //johtuen sin cos tan laskuista this.sivuSuunta=32*this.suunta/(Math.PI*2); //piirretään se autonkuva kuvalle joka vastaa menosuuntaa if(this.sivuSuunta<32&&this.sivuSuunta>=31) this.graf.drawImage(this.a90,this.x-20,this.y-20,this); if(this.sivuSuunta<1&&this.sivuSuunta>=0) this.graf.drawImage(this.a90,this.x-20,this.y-20,this); if(this.sivuSuunta<3&&this.sivuSuunta>=1) this.graf.drawImage(this.a112,this.x-20,this.y-20,this); if(this.sivuSuunta<5&&this.sivuSuunta>=3) this.graf.drawImage(this.a135,this.x-20,this.y-20,this); if(this.sivuSuunta<7&&this.sivuSuunta>=5) this.graf.drawImage(this.a158,this.x-20,this.y-20,this); if(this.sivuSuunta<9&&this.sivuSuunta>=7) this.graf.drawImage(this.a180,this.x-20,this.y-20,this); if(this.sivuSuunta<11&&this.sivuSuunta>=9) this.graf.drawImage(this.a202,this.x-20,this.y-20,this); if(this.sivuSuunta<13&&this.sivuSuunta>=11) this.graf.drawImage(this.a225,this.x-20,this.y-20,this); if(this.sivuSuunta<15&&this.sivuSuunta>=13) this.graf.drawImage(this.a248,this.x-20,this.y-20,this); if(this.sivuSuunta<17&&this.sivuSuunta>=15) this.graf.drawImage(this.a270,this.x-20,this.y-20,this); if(this.sivuSuunta<19&&this.sivuSuunta>=17) this.graf.drawImage(this.a292,this.x-20,this.y-20,this); if(this.sivuSuunta<21&&this.sivuSuunta>=19) this.graf.drawImage(this.a315,this.x-20,this.y-20,this); if(this.sivuSuunta<23&&this.sivuSuunta>=21) this.graf.drawImage(this.a338,this.x-20,this.y-20,this); if(this.sivuSuunta<25&&this.sivuSuunta>=23) this.graf.drawImage(this.a360,this.x-20,this.y-20,this); if(this.sivuSuunta<27&&this.sivuSuunta>=25) this.graf.drawImage(this.a22,this.x-20,this.y-20,this); if(this.sivuSuunta<29&&this.sivuSuunta>=27) this.graf.drawImage(this.a45,this.x-20,this.y-20,this); if(this.sivuSuunta<31&&this.sivuSuunta>=29) this.graf.drawImage(this.a68,this.x-20,this.y-20,this); //lopuksi piirretään kaikki näytölle g.drawImage(this.kuva,0,0,this); } }
ihan jees
Aihe on jo aika vanha, joten et voi enää vastata siihen.