Autopeli

olotila 15.06.05 18:36

Autopeli joka käyttää gif kuvia hyväksi

 Tekstiversio  Arvo: 22 (38 ääntä)  Äänestä: +  -
/*Kyseessä on autopeli jossa autolla ajetaan nuolinäppäimiä käyttäen.
 *Ohjelma toimii applettina internetselaimessa joten tarvitaan tälläinen sivu
 *<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 astetta vastapäivään auton menosuuntaa
                //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);
               
        }
}
 

olotila 18:37 15.6.05 
Entropia 18:40 15.6.05 
"Todella hyvä autopeli", haha, joo. Eihän tuon auton vauhti edes hidastu vaikka ajaa täysillä nokka edellä seinään? Ja sisäpaisti, onko kokonainen peli (vaikkakin hyvin minimaalinen) mielestäsi koodipätkä?
Grez 08:21 16.6.05 
Colin McRae Rally 4 on mielestäni "hyvä autopeli". Jos halutaan käyttää termiä "todella hyvä autopeli" niin sen pitäisi olla parempi. Tuo ei ihan siis mielestäni vastaa kuvausta.
tkt79 09:24 16.6.05 
Älkääpäs nyt. Kyl tosta voi olla apua monella peliohjelmointia aloittelevalle.
jel 10:19 16.6.05 
Loistava koodinpätkä. Tuosta joku oppii vielä paljon. +1 ehdottomasti.
piisami 18:18 16.6.05 
Jep, samaa mieltä, kyllä tuota voi hyvin kutsua koodinpätkäksi. Tässä yhteydessä itse ainakin ymmärsin "Todella hyvä autopeli" -otsikon ironiseksi. Mutta heti teki mieli alkaa pelata vanhaa kunnon Slicks'n'slidea - täytyykin googlata vieläkö Jukka O. (tms) kehittää sitä.
Akiro 01:56 21.6.05 
Älkääpäs nyt liikoja pilkunnussintaa harrastako, kyllä tämä laadukkaampi on kuin useimmat täältä löytvät koodipätkät. + ehdottomasti, kyllä aloittelijat tuosta voivat oppia ottaa..
editoitu: 19:33 12.7.05
Nesci 19:32 12.7.05 
Hienoa, Kiitos! Opin näin aloittelijana tästä paljon kun oli hyvin kommentoitu :)
rusinax 18:29 8.10.05 
Mitä tarviin et saan ton toimimaan mulla on:
--------------------
- MBNet sivutila.
- Netti.
--------------------
gammagoblin 15:53 3.12.05 
Loistava koodiesimerkki ja pelinäkin vielä ihan mielenkiintoinen. Mutta piru vie että se avaruuspeli, johon löytyi linkki sieltä sivulta, on kerrassaan mahtava!
Jäin koukkuun :D
sprawl 12:04 24.1.06 
Hienoa, tästähän oppii taas jotain uutta kun aika lailla vastaalkaja olen. =)
Teippio 20:33 26.7.06 
Poistakaapa auton kuvat niin pelistä tulee mielenkiintoisampi. Itse muokkaan para aikaa kartaa että peli näyttää jännemmältä :)
Teippio 20:50 26.7.06 
Oho! Kuvan muokkaus ei onnistunut niin hyvin kuin odotin :/
editoitu: 11:10 26.8.06
porzi 11:09 26.8.06 
Eihän tähän tarttis lisätä, kuin että nopeudesta vähennetään aina oltaessa päällekkäin vihreän päällä. Ja että siitä vähennetään jatkuvasti hieman (kitka)
Mutta hyvä esimerkki. Itse en osaa javaa ollenkaan. Ehkä palaan tähän esimerkkiin, jos opin enemmän.
Jonzku 19:55 10.12.06 
olotila kirjoitti:
http://koti.mbnet.fi/nordto/picturerally.html
tossa osoitteessa voi pelata


Pienen bugin huomasin kun ajoin.. Bugia voit katsoa: http://tjaa.dy.fi/~Jonzku/bugikuvia/bugi.PNG (HUOM! Kuvaa ei ole muokattu!)
Maz 09:39 30.4.07 
Hyvin kommentoitu, ei tarvinnut lukea "edes-takas" ja rapsutella päänahkaa, vaan lukiessa koodia pysyi hyvin kärryillä.
Esimerkillistä ja hieno pätkä kaikinpuolin.
Tästä olisi myös helppo lähteä kehittämään esim jotain asteroidi-arcadea. :)