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