/********************************************************************* matopeli.java Matopeli-appletti, johon on lisätty grafiikan kaksoispuskurointi Tekijä: Pekka Malmirae 2/1999 *********************************************************************/ import java.applet.*; import java.awt.*; import java.awt.event.*; import java.util.Random; /*********************************** **** class kultaharkko ***********************************/ class kultaHarkko { private Random sat = new Random(); private int x, y; private boolean nakyvissa; public kultaHarkko() { x = java.lang.Math.abs(sat.nextInt() % 466); y = java.lang.Math.abs(sat.nextInt() % 290); nakyvissa = false; } public boolean onkoSyoty(int matoX, int matoY) { if (nakyvissa) if ((matoX+13 >= x) && (matoX <= x+26) && (matoY+13 >= y) && (matoY <= y+37)) return true; return false; } public int annaX() { return x; } public int annaY() { return y; } public boolean onkoNakyvissa() { return nakyvissa; } public void asetaNakyvyys(boolean nakyyko) { nakyvissa = nakyyko; } } /******************************************************* Appletin pääluokka -> class matopeli ********************************************************/ public class matopeli extends Applet implements Runnable { private volatile Thread Saie = null; private Image Tausta, harkko, puskuriKuva; private Graphics puskuri; MediaTracker md; private mato Mato = new mato(27,1,5); private int laskuri = 0; private boolean alku = true; private int pisteet = 0; private int t = 110; private kultaHarkko kulta = new kultaHarkko(); private AudioClip nam; private boolean pysaytetty = false; public void init() { Tausta = getImage(getCodeBase(), "tausta.jpg"); harkko = getImage(getCodeBase(), "kulta.jpg"); nam = getAudioClip(getCodeBase(), "drop.au"); md = new MediaTracker(this); md.addImage(Tausta,0); md.addImage(harkko,1); try { md.waitForAll();} catch(InterruptedException e) {}; puskuriKuva = createImage(getSize().width,getSize().height); puskuri = puskuriKuva.getGraphics(); addKeyListener(new MatoKuuntelee()); addMouseListener(new HiiriKuuntelee()); } public String getAppletInfo() // Tietoja appletista { return "TeknoWorm\n" + "Pekka Malmirae, Teknolit Oy 1999"; } private String toString(int nro) { return (""+nro); } public void start() { Saie = new Thread(this); Saie.start(); } public void run() { Thread tamaSaie = Thread.currentThread(); while (Saie == tamaSaie) { // ollaanko ensimmaista pelia aloittamassa? if (alku) { pysaytetty = true; } if (!pysaytetty) { // liikutetaan matoa Mato.liiku(); // osuiko mato seinään tai itseensä? if (Mato.onkoKuollut()) { pysaytetty = true; } // söikö mato kultaharkon? if (kulta.onkoSyoty(Mato.annaX(), Mato.annaY())) { nam.play(); kulta = new kultaHarkko(); pisteet+=200; Mato.kasva(); } // tutkitaan onko mato syönyt: int lisays = Mato.syo(); if (lisays>0) { nam.play(); pisteet+=lisays; Mato.kasva(); } // hoidetaan harkon tuonti näyttöön ja sen poisto: if ((laskuri % 350 == 0) && laskuri != 0) kulta.asetaNakyvyys(true); if ((laskuri % 380 == 0) && laskuri != 0) { kulta = new kultaHarkko(); laskuri = 0; } laskuri++; if (pisteet > 2000) t = 95; if (pisteet > 4000) t = 70; if (pisteet > 6000) t = 60; if (pisteet > 8000) t = 50; } repaint(); // tämän täytyy olla if-lauseen ulkopuolella, muuten näyttöä ei päivitetä alussa try { tamaSaie.sleep(t); } catch (InterruptedException e){} } } public void stop() { Saie = null; } public void update(Graphics g) { puskuri.drawImage(Tausta, 0,0,this); if (kulta.onkoNakyvissa()) puskuri.drawImage(harkko, kulta.annaX(), kulta.annaY(),this); Mato.piirraMato(puskuri); puskuri.setColor(new Color(251,219,157)); puskuri.drawString(toString(pisteet), 232, 348); paint(g); } public void paint(Graphics g) { if (puskuriKuva != null) g.drawImage(puskuriKuva, 0,0,this); } class HiiriKuuntelee extends MouseAdapter { public void mousePressed(MouseEvent me) { int x = me.getX(); int y = me.getY(); if (Mato.onkoKuollut() || alku == true) { if ((x >= 313) && (x <= 375) && (y >= 332) && (y <= 351)) { Mato = new mato(27,1, 5); kulta= new kultaHarkko(); alku = false; pisteet = 0; laskuri =0; t = 110; pysaytetty = false; } } } } class MatoKuuntelee extends KeyAdapter { public void keyPressed(KeyEvent ke) { switch(ke.getKeyCode()) { case KeyEvent.VK_LEFT: if (Mato.osat[0].annaSuunta() != Mato.OIKEA) Mato.kaanny(Mato.VASEN); break; case KeyEvent.VK_RIGHT: if (Mato.osat[0].annaSuunta() != Mato.VASEN) Mato.kaanny(Mato.OIKEA); break; case KeyEvent.VK_UP: if (Mato.osat[0].annaSuunta() != Mato.ALAS) Mato.kaanny(Mato.YLOS); break; case KeyEvent.VK_DOWN: if (Mato.osat[0].annaSuunta() != Mato.YLOS) Mato.kaanny(Mato.ALAS); break; } } } } // matopeli-class päättyy