/// <summary> /// Tapahtumankäsittelijä aktivoi metodin kun vihollisolion PelaajaOsui-tapahtuma aktivoituu. /// Lisää pelaajalle pisteitä ja mahdolisen bonuksen osumakohdan perusteella. Poistaa vihollisen hengissä olevien listalta. /// Tarkistaa myös oliko vihollinen tason viimeinen ja käynnistää tällöin seuraavan tason. /// </summary> /// <param name="vihu">Viite viholliseen, johon on osuttu.</param> /// <param name="hitbox">Enum-tyyppinen muuttuja, joka kertoo mihin vihollista on osunut.</param> private void KasitteleOsumaViholliseen(Vihollinen vihu, Vihollinen.Hitbox hitbox) { Console.WriteLine("Käsitellään osuma viholliseen: " + vihu.Id); int saadutPisteet; if (hitbox == Vihollinen.Hitbox.Paa) { saadutPisteet = 100; } else { saadutPisteet = 50; } Pisteet.Value += saadutPisteet; ArvoBonus(saadutPisteet); //Poistetaan vihollinen hengissä olevien listalta ja aloitetaan seuraava taso, jos vihollisia ei enää ole vihollisetHengissa.Remove(vihu); if (vihollisetHengissa.Count == 0) { PysaytaKello(); SeuraavaTaso(); } }
/// <summary> /// Luo kaikkiin sijainnit[] taulukossa määriteltyihin koordinaatteihin vihollisoliot ja lisää ne peliin. /// Kaikki viholliset lisätään myös listalle 'viholliset', josta arvotaan jokaisen tason alussa kuusi vihollista listalle vihollisetHengissa. /// </summary> private void LisaaViholliset() { //Ladataan vihollisten peligrafiikka Image[] vihuKuvat = new Image[7]; vihuKuvat[0] = LoadImage("vihu_pose"); vihuKuvat[1] = LoadImage("vihu_perus"); vihuKuvat[2] = LoadImage("vihu_tahtaa"); vihuKuvat[3] = LoadImage("vihu_ampuu"); vihuKuvat[4] = LoadImage("vihu_ampui"); vihuKuvat[5] = LoadImage("vihu_headshot"); vihuKuvat[6] = LoadImage("vihu_kuollut"); //Ladataan vihollisten peliäänet SoundEffect[] vihuAanet = new SoundEffect[4]; vihuAanet[0] = LoadSoundEffect("enemy_gunshot_miss"); vihuAanet[1] = LoadSoundEffect("enemy_gunshot_1"); vihuAanet[2] = LoadSoundEffect("enemy_gunshot_2"); vihuAanet[3] = LoadSoundEffect("enemy_gunshot_3"); //Lisätään vihollisia varten tyhjä lista. Listan avulla helpotetaan oikean kokoisten esteiden piirtämistä ja se toimii reservinä, josta uuden tason alkaessa kopioidaan viitteet henkiin herätettyihin vihollisiin. viholliset = new List <Vihollinen>(); //Loopataan sijainnit sisältävän taulukon läpi ja lisätään viholliset sekä esteet vastaaviin kohtiin //Tällä hetkellä kerros määräytyy taulukon indeksin mukaan, jatkossa esim. if (sijainit[i].Y < -200) jne for (int i = 0; i < sijainnit.Length; i++) { int kerros = 1; if (i > 2) { kerros = -1; } if (i > 5) { kerros = -3; } Vihollinen vihu = new Vihollinen(id: i, sijainti: sijainnit[i], kerros, vihuKuvat, vihuAanet, peli: this); //Lisätään tapahtumankäsittelijät reagoimaan vihollisen VihollinenOsui() sekä PelaajaOsui()-tapahtumiin vihu.VihollinenOsui += KasitteleOsumaPelaajaan; vihu.PelaajaOsui += KasitteleOsumaViholliseen; Add(vihu, kerros); viholliset.Add(vihu); } //Arvotaan ensimmäiseen tasoon osallistuvat kuusi vihollista vihollisetHengissa = ArvoTasonViholliset(6, viholliset); //Pelin kehitysvaiheen attribuutteja debugHitboksit = false; }
/// <summary> /// Metodi arpoo sattumanvaraiset viholliset parametrina annetulta listalta ja palauttaa ne uudella listalla. /// </summary> /// <param name="kaikkiVihut">Lista, jolta viholliset arvotaan</param> /// <returns>Palauttaa listan, joka sisältää sattumanvaraiset kuusi vihollista</returns> private List <Vihollinen> ArvoTasonViholliset(int maara, List <Vihollinen> kaikkiVihut) { List <Vihollinen> arvotutVihut = new List <Vihollinen>(); arvotutVihut.AddRange(kaikkiVihut); while (arvotutVihut.Count > maara) { Vihollinen seuraavaVihu = RandomGen.SelectOne <Vihollinen>(arvotutVihut); arvotutVihut.Remove(seuraavaVihu); } return(arvotutVihut); }
/// <summary> /// Aktivoituu peliajastimen toimesta määräajoin. Käynnistää vihollisen hyökkäyssekvenssin. /// </summary> private void ArvoSeuraavaAmpuja() { //Arvotaan hengissä olevien vihollisten listalta seuraava ampuja Vihollinen ampuja = RandomGen.SelectOne <Vihollinen>(vihollisetHengissa); Console.WriteLine(ampuja.Id + " valittu"); //Tarkistetaan onko valittu vihollinen valmiina ampumaan. Tällä hetkellä jättää hyökkäysvuoron väliin jos ei ole. //Rekursiivinen metodikutsu kaatoi pelin korkeammilla tasoilla kun jäljellä oli enää yksi vihollinen. //Muokataan kutsua mahdollisesti myöhemmässä versiossa. if (!ampuja.OnkoPiilossa) { Console.WriteLine(ampuja.Id + " ei piilossa, arvotaan seuraava"); return; } ampuja.Hyokkaa(); }