import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.Random; import javax.imageio.ImageIO; /** * Luokka Otokka, joka luo ötökät, tallettaa kunkin ötökän * tiedot, määrittelee skaalaussuhteen ja arpoo neliön, jonka * ötökän kuva kattaa Ötökkäpaneelissa. Luokan metodit määrittelevät * myös ötökän liikkumistavan ja sen, näkyykö ötökkä enää * ötökkäpaneelissa. * * @author Karoliina Tiuraniemi * @version 1.0, 18.1.2009 * */ public class Otokka { private int x; private int y; private BufferedImage kuva = null; private Otokkapaneeli otokkapaneeli; private Rectangle nelio; private static final Random rand = new Random(); private Peli peli; private float xSkaalaus = 1; private float ySkaalaus = 1; /** * Konstruktori, joka luo ötökän. * @param otokkapaneeli johon ötökkä piirretään * @param lista johon ötökkä kuuluu */ public Otokka(Otokkapaneeli otokkapaneeli, int lista){ this.otokkapaneeli = otokkapaneeli; this.peli = this.otokkapaneeli.annaIkkuna().annaPeli(); try { if (peli.annaTaso() == 1){ // tasolla 1 ötökän kuva on leppäkerttu this.kuva = ImageIO.read(new File("src/img/leppakerttu.png")); } else if (peli.annaTaso() == 2){ // tasolla 2 ötökän kuva on koppakuoriainen this.kuva = ImageIO.read (new File("src/img/koppakuoriainen.png")); } this.arvoNelio(lista); } catch (IOException e){ System.err.println("IOException"); e.printStackTrace(); } } /** * Metodi, joka määrittelee ötököiden kuvien skaalaussuhteen * annetun tason ja ötökkälistan koon mukaan. * @param taso annettu taso * @param otokoidenMaara ötökkälistan koko */ public void skaalausSuhde(int taso, int otokoidenMaara){ // jos tasolla 2 ötököiden määrä > 20, skaalataan. if (taso == 2 && otokoidenMaara > 20){ // kuvan skaalaus 20% this.xSkaalaus = 0.6f; this.ySkaalaus = 0.6f; } else if (taso == 1 && otokoidenMaara > 25 || taso == 2 && otokoidenMaara > 15){ // kuvan skaalaus 40% this.xSkaalaus = 0.7f; this.ySkaalaus = 0.7f; } else if (taso == 1 && otokoidenMaara > 20 || taso == 2 && otokoidenMaara > 10){ // kuvan skaalaus 60% this.xSkaalaus = 0.8f; this.ySkaalaus = 0.8f; } // tasolla 1 skaalataan, jos samalla listalla olevien ötököiden // määrä > 15. tasolla 2 skaalataan, jos ötököiden määrä > 5. else if (taso == 1 && otokoidenMaara > 15 || taso == 2 && otokoidenMaara > 5){ //kuvan skaalaus 80% this.xSkaalaus = 0.9f; this.ySkaalaus = 0.9f; } } /** * Metodi, joka antaa ötökän x-koordinaatin * @return this.x */ public int annaX(){ return this.x; } /** * Metodi, joka antaa ötökän y-koordinaatin * @return this.y */ public int annaY(){ return this.y; } /** * Metodi, joka antaa ötökän x-skaalauksen * @return this.xSkaalaus */ public float annaXSkaalaus(){ return this.xSkaalaus; } /** * Metodi, joka antaa ötökän y-skaalauksen * @return this.ySkaalaus */ public float annaYSkaalaus(){ return this.ySkaalaus; } /** * Metodi, joka arpoo koordinaatit ja niiden myötä * neliön, jonka ötökän kuva täyttää. * @param lista */ public void arvoNelio(int lista){ if (lista == 0){ // tasolla 1 käytetään ötökkälistaa 0 ja ötökät saavat // täyttää koko alueen this.x = rand.nextInt(this.otokkapaneeli.annaLeveys() - this.kuva.getWidth()); } else if (lista == 1){ // tason 2 ensimmäisessä luvussa käytetään ötökkälistaa 1 ja // ötökät saavat täyttää alueen ensimmäisen puolikkaan this.x = rand.nextInt(this.otokkapaneeli.annaLeveys()/2 - this.kuva.getWidth()); } else if (lista == 2){ // tason 2 toisessa luvussa käytetään ötökkälistaa 1 ja // ötökät saavat täyttää alueen toisen puolikkaan this.x = this.otokkapaneeli.annaLeveys()/2 + rand.nextInt(this.otokkapaneeli.annaLeveys()/2 - this.kuva.getWidth()); } this.y = rand.nextInt(this.otokkapaneeli.annaKorkeus() - this.kuva.getHeight()); this.nelio = new Rectangle(this.x, this.y, this.kuva.getWidth(), this.kuva.getHeight()); } /** * Metodi, joka antaa ötökän kuvan. * @return this.kuva */ public BufferedImage annaKuva(){ return this.kuva; } /** * Metodi, joka antaa neliön, jonka ötökän kuva täyttää. * @return this.nelio */ public Rectangle annaNelio(){ return this.nelio; } /** * Metodi, joka liikuttaa ötökkää koordinaatistossa. * Luonnollisen parveilevan liikkeen illuusion aikaansaamiseksi * ötökät liikkuvat satunnaisia askelia ylöspäin, pysähtelevät * välillä ja liikkuvat satunnaisia pienempiä askelia molemmille * sivuille. */ public void liiku(){ // 30% todennäköisyydellä tapahtuu liikettä if (rand.nextDouble() < 0.3){ // liikutaan korkeussuuntaan satunnaisesti this.y = this.y - rand.nextInt(80); if (rand.nextDouble() < 0.1){ // liikutaan leveyssuuntaan satunnaisesti this.x = this.x + rand.nextInt(10); } else if (rand.nextDouble() < 0.2) this.x = this.x - rand.nextInt(10); } // muuten pysytään paikallaan eli ei tapahdu mitään } /** * Metodi, joka tarkistaa vieläkö ötökän kuva näkyy * ötökkäpaneelissa. * @return false, jos ötökän y-koordinaatti on korkeuden * vastaluku. true muulloin */ public boolean nakyy(){ if (this.y < -this.kuva.getHeight()){ return false; } return true; } }