[2844] | 1 | using System; |
---|
| 2 | using System.Collections.Generic; |
---|
| 3 | using Jypeli; |
---|
| 4 | using Jypeli.Assets; |
---|
| 5 | using Jypeli.Controls; |
---|
| 6 | using Jypeli.Effects; |
---|
| 7 | using Jypeli.Widgets; |
---|
| 8 | /// <summary> |
---|
| 9 | /// Pelaajan luokka -> Pelihahmon asetuksia voi lisätä tänne. |
---|
| 10 | /// </summary> |
---|
| 11 | class PeliUkko : PhysicsObject |
---|
| 12 | { |
---|
| 13 | public IntMeter Elamat; //Antaa PeliUkko luokalle mittarin nimellä elmät. |
---|
| 14 | public Explosion ViimeisinRajahdys = null; //Estää monen räjähdyksen tulemisen samaan aikaan bugin takia. |
---|
| 15 | public bool aseValmiina = true; //->Ei supersarjatulta. |
---|
| 16 | public bool naattiValmiina = true; //->Ei naattispämmiä |
---|
| 17 | public PeliUkko(double leveys, double korkeus) //double = desimaaliluku |
---|
| 18 | : base(leveys, korkeus) //ottaa PeliUkon koon desimaaleina |
---|
| 19 | { |
---|
| 20 | Elamat = new IntMeter(50, 0, 100); //Default HP, Min HP, Max HP |
---|
| 21 | } |
---|
| 22 | } |
---|
| 23 | public class FPS : PhysicsGame |
---|
| 24 | { |
---|
| 25 | |
---|
| 26 | PeliUkko pelaaja1, pelaaja2, pelaaja3, pelaaja4; //määrittää pelaajat attribuuteiksi jotta niitä voi käyttää kaikissa aliohjelmissa |
---|
| 27 | double ampumisnopeus = 450; //<- |
---|
| 28 | ExplosionSystem NaattiPoks; //räjähdyksen partikkelit |
---|
| 29 | IntMeter Pelaajat = new IntMeter(4); //Hengissä olevien pelaajien lukumäärä. |
---|
| 30 | ExplosionSystem veri; //veripartikkelit |
---|
[2898] | 31 | Dictionary<Color, Label> PlayerX = new Dictionary<Color, Label>(); |
---|
[2844] | 32 | bool onkoPeliFullS = false; //fullscreen, 0 false, 1 true. |
---|
[3011] | 33 | |
---|
| 34 | |
---|
[2844] | 35 | void ResetPelaajat() //resetoi pelaajien määrän neljään uuden pelin aloituksessa. |
---|
| 36 | { |
---|
| 37 | Pelaajat = new IntMeter(4); |
---|
| 38 | } |
---|
| 39 | |
---|
[3011] | 40 | |
---|
[2844] | 41 | /// <summary> |
---|
| 42 | /// ylikirjoittaa oletus PhysicsGame:n Begin metodin |
---|
| 43 | /// </summary> |
---|
| 44 | public override void Begin() |
---|
| 45 | { |
---|
| 46 | NaattiPoks = new ExplosionSystem(LoadImage("naattishard"), 1500); //määritetään räjähdyksen partikkelikuva ja niiden maximi määrä |
---|
| 47 | Add(NaattiPoks); //lisätään räjähdys peliin (ei näkyviin, mutta niin että se on olemassa) |
---|
[2897] | 48 | if (onkoPeliFullS == false) |
---|
| 49 | { |
---|
| 50 | SetWindowSize(1024, 768, false); //false=ei Full, true = full |
---|
| 51 | } |
---|
[2898] | 52 | |
---|
[3011] | 53 | PlayerX.Remove(Color.Blue); |
---|
| 54 | PlayerX.Remove(Color.Yellow); |
---|
| 55 | PlayerX.Remove(Color.Red); |
---|
| 56 | PlayerX.Remove(Color.Purple); |
---|
[2898] | 57 | |
---|
[3011] | 58 | addcolorlib(); |
---|
[2844] | 59 | LuoKentta(); //kutsutaan kentänluonti |
---|
| 60 | Veri(); //kutsutaan veripartikkelit |
---|
[2888] | 61 | |
---|
| 62 | MediaPlayer.Play(RandomGen.SelectOne<string>("music\\M1","music\\M2", "music\\M3", "music\\M4", "music\\M5", "music\\M6", "music\\M7", "music\\M8")); |
---|
| 63 | MediaPlayer.Volume = 0.5; |
---|
| 64 | |
---|
[2898] | 65 | MessageDisplay.Add(" F1 - Näytä Ohjaimet"); //lisätään viestilaatikkoon ohje. |
---|
[2844] | 66 | Keyboard.Listen(Key.F1, ButtonState.Pressed, Ohjeet, "Näytä ohjaimet"); //Kutsutaan Ohjeet |
---|
| 67 | Keyboard.Listen(Key.F11, ButtonState.Pressed, Fullscreen,null); |
---|
| 68 | Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli"); |
---|
| 69 | } |
---|
[3011] | 70 | void addcolorlib() |
---|
| 71 | { |
---|
| 72 | PlayerX.Add(Color.Blue, new Label()); |
---|
| 73 | PlayerX.Add(Color.Yellow, new Label()); |
---|
| 74 | PlayerX.Add(Color.Red, new Label()); |
---|
| 75 | PlayerX.Add(Color.Purple, new Label()); |
---|
| 76 | } |
---|
| 77 | //void removecolorlib() |
---|
| 78 | //{ |
---|
| 79 | // PlayerX.Remo(Color.Blue, new Label()); |
---|
| 80 | // PlayerX.Add(Color.Yellow, new Label()); |
---|
| 81 | // PlayerX.Add(Color.Red, new Label()); |
---|
| 82 | // PlayerX.Add(Color.Purple, new Label()); |
---|
| 83 | //} |
---|
[2888] | 84 | |
---|
[2844] | 85 | void Fullscreen() |
---|
| 86 | { |
---|
| 87 | if (onkoPeliFullS) // jos on koko ruutu |
---|
| 88 | { |
---|
| 89 | SetWindowSize(1024, 768, false); onkoPeliFullS = false; |
---|
[2898] | 90 | Camera.ZoomToLevel(); |
---|
| 91 | UpdateAllHP(); |
---|
[2844] | 92 | return; |
---|
| 93 | } |
---|
[2858] | 94 | int w = Microsoft.Xna.Framework.Graphics.GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Width; |
---|
| 95 | int h = Microsoft.Xna.Framework.Graphics.GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Height; |
---|
| 96 | SetWindowSize(w, h, true); onkoPeliFullS = true; |
---|
[2898] | 97 | Camera.ZoomToLevel(); |
---|
| 98 | UpdateAllHP(); |
---|
[2844] | 99 | } |
---|
[2898] | 100 | void LuoHPNaytot() |
---|
| 101 | { |
---|
| 102 | LuoHPNaytto(Screen.Left + 10, Screen.Top - 10, pelaaja1.Elamat, Color.Blue); |
---|
| 103 | LuoHPNaytto(Screen.Right - 10, Screen.Top - 10, pelaaja2.Elamat, Color.Yellow); |
---|
| 104 | LuoHPNaytto(Screen.Right - 10, Screen.Bottom + 10, pelaaja3.Elamat, Color.Red); |
---|
| 105 | LuoHPNaytto(Screen.Left + 10, Screen.Bottom + 10, pelaaja4.Elamat, Color.Purple); |
---|
| 106 | |
---|
| 107 | } |
---|
| 108 | void UpdateAllHP() |
---|
| 109 | { |
---|
| 110 | UpdateHP(Screen.Left + 10 , Screen.Top - 10, Color.Blue); |
---|
| 111 | UpdateHP(Screen.Right - 10, Screen.Top - 10, Color.Yellow); |
---|
| 112 | UpdateHP(Screen.Right - 10, Screen.Bottom + 10, Color.Red); |
---|
| 113 | UpdateHP(Screen.Left + 10, Screen.Bottom + 10, Color.Purple); |
---|
| 114 | |
---|
| 115 | } |
---|
[2844] | 116 | void Ohjeet() |
---|
| 117 | { |
---|
| 118 | MessageDisplay.Add("Pelaaja 1 - WASD - Q ampuminen - E Kranaatti"); |
---|
| 119 | MessageDisplay.Add("Pelaaja 2 - Nuolet - Numpad0 ampuminen - CTRL Kranaatti"); |
---|
| 120 | MessageDisplay.Add("Pelaaja 3 - TFGH - R ampuminen - Y Kranaatti"); |
---|
| 121 | MessageDisplay.Add("Pelaaja 4 - IJKL - U ampuminen - O Kranaatti"); |
---|
[2898] | 122 | MessageDisplay.Add("F11 -> Fullscreen/Windowed"); |
---|
[2844] | 123 | } |
---|
| 124 | void LuoKentta() |
---|
| 125 | { |
---|
| 126 | TileMap ruudut = TileMap.FromLevelAsset("level"); //ladataan kenttä level.txt tiedostosta. |
---|
| 127 | ruudut.SetTileMethod('=', LuoPalikka); //säädetään mitä mikäkin merkki tekstissä on pelissä |
---|
| 128 | ruudut.SetTileMethod('s', LuoPalikka); // | |
---|
| 129 | ruudut.SetTileMethod('1', LuoPelaaja1);// | |
---|
| 130 | ruudut.SetTileMethod('2', LuoPelaaja2);// | |
---|
| 131 | ruudut.SetTileMethod('3', LuoPelaaja3);// | |
---|
| 132 | ruudut.SetTileMethod('4', LuoPelaaja4);// V |
---|
| 133 | ruudut.Execute(25, 25); //Kutsutaan ruudut 25x25 kokoisina. |
---|
| 134 | |
---|
| 135 | Level.Background.Image = LoadImage("bg"); //Määritetään taustakuva. |
---|
| 136 | Camera.ZoomToLevel(); |
---|
[2898] | 137 | LuoHPNaytot(); |
---|
[2844] | 138 | } |
---|
| 139 | void LuoPalikka(Vector paikka, double leveys, double korkeus) |
---|
| 140 | { |
---|
| 141 | PhysicsObject palikka = PhysicsObject.CreateStaticObject(leveys, korkeus); //staattinen objekti->ei liiku. |
---|
| 142 | palikka.Position = paikka; |
---|
| 143 | palikka.Image = LoadImage("seinaTekstuuri"); |
---|
| 144 | palikka.Tag = "Seinä"; |
---|
| 145 | palikka.Restitution = 0; //kimmoisuus 0 |
---|
| 146 | palikka.Shape = Shape.Rectangle; |
---|
| 147 | palikka.Color = Color.White; |
---|
| 148 | Add(palikka); |
---|
| 149 | } |
---|
| 150 | void LuoPelaaja1(Vector paikka, double leveys, double korkeus) |
---|
| 151 | { |
---|
| 152 | |
---|
| 153 | pelaaja1 = LuoPelaaja(paikka); |
---|
| 154 | pelaaja1.Image = LoadImage("Pelaaja1"); |
---|
| 155 | pelaaja1.CollisionIgnoreGroup = 1; //omat luodit eivät osu -> tämän pelaajan luodit ovat collisonignoregroup 1:ssä myös + kranaatit. |
---|
[2898] | 156 | //LuoHPNaytto(Level.Left - 125, Level.Top + 100, pelaaja1.Elamat, Color.Blue); |
---|
[2844] | 157 | |
---|
| 158 | //Kontrollit: |
---|
| 159 | Keyboard.Listen(Key.A, ButtonState.Down, Liike, null, pelaaja1, new Vector(-200, 0)); |
---|
| 160 | Keyboard.Listen(Key.A, ButtonState.Released, Liike, null, pelaaja1, new Vector(0, 0)); |
---|
| 161 | Keyboard.Listen(Key.D, ButtonState.Down, Liike, null, pelaaja1, new Vector(200, 0)); |
---|
| 162 | Keyboard.Listen(Key.D, ButtonState.Released, Liike, null, pelaaja1, new Vector(0, 0)); |
---|
| 163 | Keyboard.Listen(Key.S, ButtonState.Down, Liike, null, pelaaja1, new Vector(0, -200)); |
---|
| 164 | Keyboard.Listen(Key.S, ButtonState.Released, Liike, null, pelaaja1, new Vector(0, 0)); |
---|
| 165 | Keyboard.Listen(Key.W, ButtonState.Down, Liike, null, pelaaja1, new Vector(0, 200)); |
---|
| 166 | Keyboard.Listen(Key.W, ButtonState.Released, Liike, null, pelaaja1, new Vector(0, 0)); |
---|
| 167 | Keyboard.Listen(Key.Q, ButtonState.Down, Ammu, null, pelaaja1); |
---|
| 168 | Keyboard.Listen(Key.E, ButtonState.Down, Heita, null, pelaaja1); |
---|
| 169 | } |
---|
| 170 | void LuoPelaaja2(Vector paikka, double leveys, double korkeus) |
---|
| 171 | { |
---|
| 172 | |
---|
| 173 | pelaaja2 = LuoPelaaja(paikka); |
---|
| 174 | pelaaja2.Image = LoadImage("Pelaaja2"); |
---|
| 175 | pelaaja2.CollisionIgnoreGroup = 2; |
---|
[2898] | 176 | //LuoHPNaytto(Level.Right + 125, Level.Top + 100, pelaaja2.Elamat, Color.Yellow); |
---|
[2844] | 177 | |
---|
| 178 | |
---|
| 179 | Keyboard.Listen(Key.Left, ButtonState.Down, Liike, null, pelaaja2, new Vector(-200, 0)); |
---|
| 180 | Keyboard.Listen(Key.Left, ButtonState.Released, Liike, null, pelaaja2, new Vector(0, 0)); |
---|
| 181 | Keyboard.Listen(Key.Right, ButtonState.Down, Liike, null, pelaaja2, new Vector(200, 0)); |
---|
| 182 | Keyboard.Listen(Key.Right, ButtonState.Released, Liike, null, pelaaja2, new Vector(0, 0)); |
---|
| 183 | Keyboard.Listen(Key.Down, ButtonState.Down, Liike, null, pelaaja2, new Vector(0, -200)); |
---|
| 184 | Keyboard.Listen(Key.Down, ButtonState.Released, Liike, null, pelaaja2, new Vector(0, 0)); |
---|
| 185 | Keyboard.Listen(Key.Up, ButtonState.Down, Liike, null, pelaaja2, new Vector(0, 200)); |
---|
| 186 | Keyboard.Listen(Key.Up, ButtonState.Released, Liike, null, pelaaja2, new Vector(0, 0)); |
---|
| 187 | Keyboard.Listen(Key.NumPad0, ButtonState.Down, Ammu, null, pelaaja2); |
---|
| 188 | Keyboard.Listen(Key.RightControl, ButtonState.Down, Heita, null, pelaaja2); |
---|
| 189 | } |
---|
| 190 | void LuoPelaaja3(Vector paikka, double leveys, double korkeus) |
---|
| 191 | { |
---|
| 192 | |
---|
| 193 | pelaaja3 = LuoPelaaja(paikka); |
---|
| 194 | pelaaja3.Image = LoadImage("Pelaaja3"); |
---|
| 195 | pelaaja3.CollisionIgnoreGroup = 3; |
---|
[2898] | 196 | //LuoHPNaytto(Level.Right + 125, Level.Bottom - 100, pelaaja3.Elamat, Color.Red); |
---|
[2844] | 197 | |
---|
| 198 | |
---|
| 199 | Keyboard.Listen(Key.F, ButtonState.Down, Liike, null, pelaaja3, new Vector(-200, 0)); |
---|
| 200 | Keyboard.Listen(Key.F, ButtonState.Released, Liike, null, pelaaja3, new Vector(0, 0)); |
---|
| 201 | Keyboard.Listen(Key.H, ButtonState.Down, Liike, null, pelaaja3, new Vector(200, 0)); |
---|
| 202 | Keyboard.Listen(Key.H, ButtonState.Released, Liike, null, pelaaja3, new Vector(0, 0)); |
---|
| 203 | Keyboard.Listen(Key.G, ButtonState.Down, Liike, null, pelaaja3, new Vector(0, -200)); |
---|
| 204 | Keyboard.Listen(Key.G, ButtonState.Released, Liike, null, pelaaja3, new Vector(0, 0)); |
---|
| 205 | Keyboard.Listen(Key.T, ButtonState.Down, Liike, null, pelaaja3, new Vector(0, 200)); |
---|
| 206 | Keyboard.Listen(Key.T, ButtonState.Released, Liike, null, pelaaja3, new Vector(0, 0)); |
---|
| 207 | Keyboard.Listen(Key.R, ButtonState.Down, Ammu, null, pelaaja3); |
---|
| 208 | Keyboard.Listen(Key.Y, ButtonState.Down, Heita, null, pelaaja3); |
---|
| 209 | } |
---|
| 210 | void LuoPelaaja4(Vector paikka, double leveys, double korkeus) |
---|
| 211 | { |
---|
| 212 | |
---|
| 213 | pelaaja4 = LuoPelaaja(paikka); |
---|
| 214 | pelaaja4.Image = LoadImage("Pelaaja4"); |
---|
| 215 | pelaaja4.CollisionIgnoreGroup = 4; |
---|
[2898] | 216 | //LuoHPNaytto(Level.Left - 125, Level.Bottom - 100, pelaaja4.Elamat, Color.Purple); |
---|
[2844] | 217 | |
---|
| 218 | |
---|
| 219 | |
---|
| 220 | |
---|
| 221 | Keyboard.Listen(Key.J, ButtonState.Down, Liike, null, pelaaja4, new Vector(-200, 0)); |
---|
| 222 | Keyboard.Listen(Key.J, ButtonState.Released, Liike, null, pelaaja4, new Vector(0, 0)); |
---|
| 223 | Keyboard.Listen(Key.L, ButtonState.Down, Liike, null, pelaaja4, new Vector(200, 0)); |
---|
| 224 | Keyboard.Listen(Key.L, ButtonState.Released, Liike, null, pelaaja4, new Vector(0, 0)); |
---|
| 225 | Keyboard.Listen(Key.K, ButtonState.Down, Liike, null, pelaaja4, new Vector(0, -200)); |
---|
| 226 | Keyboard.Listen(Key.K, ButtonState.Released, Liike, null, pelaaja4, new Vector(0, 0)); |
---|
| 227 | Keyboard.Listen(Key.I, ButtonState.Down, Liike, null, pelaaja4, new Vector(0, 200)); |
---|
| 228 | Keyboard.Listen(Key.I, ButtonState.Released, Liike, null, pelaaja4, new Vector(0, 0)); |
---|
| 229 | Keyboard.Listen(Key.U, ButtonState.Down, Ammu, null, pelaaja4); |
---|
| 230 | Keyboard.Listen(Key.O, ButtonState.Down, Heita, null, pelaaja4); |
---|
| 231 | } |
---|
| 232 | PeliUkko LuoPelaaja(Vector paikka) |
---|
| 233 | { |
---|
| 234 | PeliUkko pelaaja = new PeliUkko(18, 18); |
---|
| 235 | pelaaja.Restitution = 0; |
---|
| 236 | pelaaja.AngularDamping = Double.Epsilon; //pelaaja ei pyöri törmätessään kulmiin, 0 ei toimi, joten Double.Epsilon on pienin mahdollinen luku. |
---|
| 237 | pelaaja.Position = paikka; //Vector paikka -> katsoo ketä pelaajaa luodaan ja pistää sen sen pelaajan sijaintiin level.txt:ssä. |
---|
| 238 | pelaaja.Shape = Shape.Circle; //pelaaja on pallo tekstuurin alla :P |
---|
| 239 | Add(pelaaja); |
---|
| 240 | AddCollisionHandler<PeliUkko, PhysicsObject>(pelaaja, "bullet", Osuma); //jos pelaajaan osuu luoti, kutsutaan osuma, joka vähentää pelaajan HP. |
---|
| 241 | |
---|
| 242 | return pelaaja; //palautetaan luotu pelaaja LuoPelaajaX:lle |
---|
| 243 | |
---|
| 244 | } |
---|
| 245 | void KukaKuoli(PeliUkko ukko) |
---|
| 246 | { |
---|
| 247 | int PelaajanNumero = 1337; //noh, niin :D |
---|
| 248 | Pelaajat.Value -= 1; //vähennetään yksi pelaajien lukumäärästä kun joku kuolee. Tämä siksi että peli tietää katsoa kuka on viimeinen hengissä ja ilmoittaa voitosta. |
---|
| 249 | if (ukko == pelaaja1) |
---|
| 250 | { |
---|
| 251 | MessageDisplay.Add("Pelaaja 1 kuoli!"); //Jos ukko (tässä tapauksessa kuolija -> määritetty kuolintapahtumassa) on pelaaja 1, Se ilmoitetaan. |
---|
| 252 | } |
---|
| 253 | else if (ukko == pelaaja2) |
---|
| 254 | { |
---|
| 255 | MessageDisplay.Add("Pelaaja 2 kuoli!"); |
---|
| 256 | } |
---|
| 257 | else if (ukko == pelaaja3) |
---|
| 258 | { |
---|
| 259 | MessageDisplay.Add("Pelaaja 3 kuoli!"); |
---|
| 260 | } |
---|
| 261 | else if (ukko == pelaaja4) |
---|
| 262 | { |
---|
| 263 | MessageDisplay.Add("Pelaaja 4 kuoli!"); |
---|
| 264 | } |
---|
| 265 | else MessageDisplay.Add("WTF?"); //älkää kysykö ;) |
---|
| 266 | |
---|
| 267 | //jos pelaajia on 1 tai vähemmän... |
---|
| 268 | if (Pelaajat.Value <= 1) |
---|
| 269 | { |
---|
| 270 | if (!pelaaja1.IsDestroyed) PelaajanNumero = 1; //tarkistetaa onko pelaaja "EI" tuhottu-> |
---|
| 271 | else if (!pelaaja2.IsDestroyed) PelaajanNumero = 2; //else tarkistetaan onko se pelaaja 2. |
---|
| 272 | else if (!pelaaja3.IsDestroyed) PelaajanNumero = 3; |
---|
| 273 | else if (!pelaaja4.IsDestroyed) PelaajanNumero = 4; |
---|
| 274 | Label Voitto = new Label("Pelaaja" + PelaajanNumero + "Voittaa!"); //teksti keskelle ruutua. "Pelaaja" + Sen pelaajan numero joka ei ollut tuhottu + "Voittaa!" |
---|
| 275 | Voitto.TextColor = Color.Crimson; |
---|
| 276 | Add(Voitto); //lisätään se viellä näytölle. |
---|
| 277 | Timer.SingleShot(2.5, delegate { UusiPeli(); }); //ajastin ennenkuin promptataan uuden pelin alkua. delegate -> saadaan ns. aliohjelma ilman aliohjelmaa, yhdelle riville. |
---|
| 278 | |
---|
| 279 | } |
---|
| 280 | } |
---|
| 281 | void UusiPeli() |
---|
| 282 | { |
---|
| 283 | MultiSelectWindow UusiPeli = new MultiSelectWindow("Pelataanko uusi peli?", "Kyllä", "Ei"); |
---|
| 284 | UusiPeli.ItemSelected += PainettiinValikonNappia; //mitä painettiin? Lisätään muuttujaan monesko nappi. 1 nappi = 0. 2 nappi on 1. |
---|
| 285 | Add(UusiPeli); |
---|
| 286 | } |
---|
| 287 | void PainettiinValikonNappia(int valinta) |
---|
| 288 | { |
---|
| 289 | switch (valinta) |
---|
| 290 | { |
---|
| 291 | case 0: //Jos muuttuja oli 0, eli ensimmäinen nappi, aloitetaan uusi peli |
---|
| 292 | ClearAll(); //puhdistetaan "melkein kaikki |
---|
| 293 | ResetPelaajat(); //nollataan pelaajat takaisin neljään, koska muuten heitä olisi enään 1 |
---|
| 294 | Begin(); //aloitetaan peli |
---|
| 295 | break; |
---|
| 296 | case 1: //poistutaan jos toinen nappi. |
---|
| 297 | Exit(); |
---|
| 298 | break; |
---|
| 299 | } |
---|
| 300 | } |
---|
| 301 | void LuoHPNaytto(double x, double y, IntMeter sidottavaMittari, Color taustavari) |
---|
| 302 | { |
---|
[2898] | 303 | Label hp = PlayerX[taustavari]; |
---|
[2844] | 304 | hp.Color = taustavari; |
---|
| 305 | hp.BindTo(sidottavaMittari); |
---|
| 306 | hp.Position = new Vector(x, y); |
---|
| 307 | Add(hp); |
---|
| 308 | } |
---|
[2898] | 309 | void UpdateHP(double x, double y, Color taustavari) |
---|
| 310 | { |
---|
| 311 | Label hp = PlayerX[taustavari]; |
---|
| 312 | hp.Position = new Vector (x,y); |
---|
| 313 | } |
---|
[2844] | 314 | void Osuma(PeliUkko tormaaja, PhysicsObject ammus) |
---|
| 315 | { |
---|
| 316 | tormaaja.Elamat.Value -= 3; //kun tormaaja (pelaaja) osuu luotiin, vähennetään 3hp. |
---|
| 317 | if (tormaaja.Elamat.Value <= 0) |
---|
| 318 | { |
---|
| 319 | tormaaja.Destroy(); //jos hp 0 tai pienempi, tuhotaan pelaaja |
---|
| 320 | KukaKuoli(tormaaja); //ja tarkistetaan kuka kuoli +ilmoitetaan siitä |
---|
| 321 | } |
---|
| 322 | veri.AddEffect(tormaaja.Position, 15); //osumasta lentää myös verta, pelaajan kohdalta. |
---|
| 323 | ammus.Destroy(); //tuhotaan panos. (ei hylsyjä ;___;) |
---|
| 324 | } |
---|
| 325 | void Veri() |
---|
| 326 | { |
---|
| 327 | veri = new ExplosionSystem(LoadImage("blood"), 500); //luodaan veri "räjähdys" ja ladataan kuva, säädetään maksimi määrä partikkeleita(verta) |
---|
| 328 | veri.MaxScale = 1.5; |
---|
| 329 | veri.MaxLifetime = 0.4; //ei veri lennä liian kauas. |
---|
| 330 | veri.MaxVelocity = 0.8; //eikä liian nopeaa ettei se ehdi liian kauas. |
---|
| 331 | Add(veri); //lisätään se. |
---|
| 332 | |
---|
| 333 | } |
---|
| 334 | void Ammu(PeliUkko pelaaja) |
---|
| 335 | { |
---|
[2849] | 336 | if (pelaaja.IsDestroyed) return; //Ei kuolleet saa ampua! |
---|
[2844] | 337 | if (pelaaja.aseValmiina) //jos aseella ei ole cd menossa |
---|
| 338 | { |
---|
| 339 | PhysicsObject bullet = new PhysicsObject(LoadImage("bullet")); |
---|
| 340 | Add(bullet); |
---|
| 341 | bullet.Tag = "bullet"; |
---|
| 342 | bullet.Restitution = 0; //eipä kimpoile luoti, bugien varalta tämä tässä, ei mitään järkevää syytä ottaa poiskaan. |
---|
| 343 | AddCollisionHandler(bullet, "Seinä", CollisionHandler.DestroyObject); //luoti katoaa maagisesti seinään osuessaan. |
---|
| 344 | bullet.Position = pelaaja.Position; |
---|
| 345 | bullet.Angle = pelaaja.Angle; //luoti lähtee pelaajan katsomaaan suuntaan. |
---|
| 346 | bullet.CollisionIgnoreGroup = pelaaja.CollisionIgnoreGroup; //pistetään luoti samaan collision ignoreen kuin sen ampunut pelaaja, ettei ammuta itseään. |
---|
| 347 | Vector suunta = Vector.FromLengthAndAngle(ampumisnopeus, pelaaja.Angle + Angle.RightAngle); //käännellään luotia viellä että sen tekstuurikin on oikenpäin. |
---|
| 348 | bullet.Hit(suunta); //tökkäistään luoti liikkeelle. |
---|
| 349 | SoundEffect pistolshot = LoadSoundEffect("pistol1"); //mahtava ääni!! |
---|
| 350 | pistolshot.Play(); //aivan uskomaton ;D |
---|
| 351 | pelaaja.aseValmiina = false; //pistetään cd käyntiin |
---|
| 352 | Timer.SingleShot(0.4, delegate { pelaaja.aseValmiina = true; }); //poistetaan cd |
---|
| 353 | } |
---|
| 354 | } |
---|
| 355 | void Heita(PeliUkko pelaaja) |
---|
| 356 | { |
---|
[2849] | 357 | if (pelaaja.IsDestroyed) return; |
---|
[2844] | 358 | if (pelaaja.naattiValmiina) //jos ei ole naatti cd active. |
---|
| 359 | { |
---|
| 360 | PhysicsObject naatti = new PhysicsObject(LoadImage("naatti")); |
---|
| 361 | Add(naatti); |
---|
| 362 | naatti.Tag = "naatti"; |
---|
| 363 | naatti.Restitution = 0.8; //naatti saa kimpoilla vähän |
---|
| 364 | naatti.Position = pelaaja.Position; |
---|
| 365 | naatti.Angle = pelaaja.Angle; |
---|
| 366 | naatti.CollisionIgnoreGroup = pelaaja.CollisionIgnoreGroup; |
---|
| 367 | Vector suunta = Vector.FromLengthAndAngle(ampumisnopeus, pelaaja.Angle + Angle.RightAngle); |
---|
| 368 | naatti.Hit(suunta); |
---|
[2888] | 369 | SoundEffect naattiheitto = LoadSoundEffect("Naattiheitto"); |
---|
| 370 | naattiheitto.Play(); |
---|
[2844] | 371 | pelaaja.naattiValmiina = false; |
---|
| 372 | Timer.SingleShot(1.5, delegate { KranaattiRajahti(naatti.X, naatti.Y, 375); naatti.Destroy(); }); //räjähdys<-aika heitosta |
---|
| 373 | Timer.SingleShot(8, delegate { pelaaja.naattiValmiina = true; }); |
---|
| 374 | } |
---|
| 375 | |
---|
| 376 | } |
---|
| 377 | void KranaattiRajahti(double x, double y, int numberOfParticles) |
---|
| 378 | { |
---|
| 379 | NaattiPoks.X = x; //pistetään räjähdysefetki naatin sijaintiin |
---|
| 380 | NaattiPoks.Y = y; |
---|
| 381 | NaattiPoks.MinScale = 1; //partikkeleiden min/max koot |
---|
| 382 | NaattiPoks.MaxScale = 10; |
---|
| 383 | NaattiPoks.AddEffect(x, y, numberOfParticles); |
---|
| 384 | Explosion e = new Explosion(65); //pakko käyttää myös tätä koska ExplosionSystemistä ei saa paineaaltoa. |
---|
| 385 | Add(e); |
---|
| 386 | e.Position = new Vector(x, y); |
---|
| 387 | |
---|
| 388 | //IPhysicsObject = Kohde johon paineaalto osuu. vektori suuntaa ei tarvita missään, mutta se on silti pakollinen. sitten kutsutaan shockhit näillä arvoilla. |
---|
| 389 | e.ShockwaveReachesObject += delegate(IPhysicsObject kohde, Vector suunta) { ShockHit(kohde, suunta, e); }; |
---|
| 390 | } |
---|
| 391 | void ShockHit(IPhysicsObject kohde, Vector suunta, Explosion rajahdys) |
---|
| 392 | { |
---|
| 393 | if (!(kohde is PeliUkko)) return; //jos paineaalto osuu johonkin muuhun kuin pelaajaan, poistutaan. |
---|
| 394 | PeliUkko ukko = kohde as PeliUkko; //jos kohde oli pelaajaluokkaa, jatketaan. |
---|
| 395 | if (ukko.ViimeisinRajahdys == rajahdys) return; //tarkistetaan että tämä paineealto ei ole osunut ukkoon juuri äsken. Peli bugasi niin että paineaalto osu monta kertaa. |
---|
| 396 | |
---|
| 397 | double etaisyys = Vector.Distance(ukko.Position, rajahdys.Position); //katsotaan kuinka kaukana pelaaja on räjähdyksen keskipisteestä. Pistetään tämä desimaalilukuna muutujaan |
---|
| 398 | ukko.Elamat.Value -= (int)Math.Floor(1500 / etaisyys); //pyöristetään etäisyys kokonaislukuihin, int ei ota desimaaleja. Base dmg räjähdyksestä 1500. se jaetaan etäisyydellä. |
---|
| 399 | if (ukko.Elamat.Value <= 0) |
---|
| 400 | { |
---|
| 401 | ukko.Destroy(); |
---|
| 402 | KukaKuoli(ukko); |
---|
| 403 | } |
---|
| 404 | ukko.ViimeisinRajahdys = rajahdys; //pistetään viimeisin räjähdys olemaan juuri tämä räjähdys (paineaalto) |
---|
| 405 | } |
---|
| 406 | void Liike(PeliUkko pelaaja, Vector nopeus) |
---|
| 407 | { |
---|
| 408 | pelaaja.Velocity = nopeus; //nopeus=tässä käytetään osoittamaan pelaajan liikkumissuuntaa, joten pelaajan tekstuuri kääntyy liikesuuntaan. |
---|
| 409 | if (nopeus.Magnitude != 0) //jos pelaaja ei liiku |
---|
| 410 | { |
---|
| 411 | pelaaja.Angle = nopeus.Angle - Angle.RightAngle; //ei käännetä pelaajaa takaisin oletussuuntaan. |
---|
| 412 | } |
---|
| 413 | } |
---|
| 414 | } |
---|