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