Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: Java: Autopeli

TJN [01.06.2005 16:48:32]

#

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);

    }
}

temu92 [08.06.2005 17:21:50]

#

ihan jees

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta