source: 2010/23/hniemi/ShootEmUp/ShootEmUp/Peli.cs @ 10337

Revision 1017, 24.4 KB checked in by hniemi, 10 years ago (diff)

Lisätty aloitusmenu ja järkevöitetty rakennetta.

Line 
1using System;
2using Jypeli;
3using Jypeli.ScreenObjects;
4using Jypeli.Assets;
5using System.Collections.Generic;
6
7namespace ShootEmUp
8{
9    /// <summary>
10    /// ShootEmUp-peli
11    ///
12    /// Pelin ideana on ampua viholisia niin kauan kuin niitä tulee.
13    /// </summary>
14    public class Peli : PhysicsGame
15    {
16        #region Julistukset
17        //Liikkumisnopeudet
18        private const double NOPEUS = 300;
19        private const int OLETUSASE = 0;
20        private Vector nopeusPysty = new Vector(0,NOPEUS);
21        private Vector nopeusVaaka = new Vector(NOPEUS, 0);
22
23        //Kentän rakenne
24        private Alus pelaajaAlus;
25        private PhysicsObject[] seinat = new PhysicsObject[4];
26        private PhysicsObject exitZone;
27
28        private GameObject[] tahdet;
29
30        //Viholliset (vihollinen1.png, vihollinen2.png...)
31        private const int VIHOLLISKUVIA = 4;
32
33        //Statistiikka
34        private int kentannro = 0;
35        private IntMeter score = new IntMeter(0);
36        private IntMeter lives = new IntMeter(3);
37        private TextDisplay[] aseNimet;
38        private ShmupWeapon[] weapons;
39
40        //Menu
41        private int valittu = 0;
42        private string[] menutekstit;
43        private Action[] menutapahtumat;
44        private TextDisplay[] menu;
45        private Color tekstinVari = Color.White;
46        private Color tekstiValittuVari = Color.Yellow;
47
48        /**
49         * Boss-Mode
50         * Loppuvastuksen testaamista varten. Hyppää normaalien vastusten yli
51         * suoraan loppuvastuksen takaisin. Tarkoituksena myös jossain
52         * vaiheessa olla yhtenä "pelityyppinä"
53         */
54        private bool bossmode = false;
55        #endregion
56
57        /// <summary>
58        /// Aloittaa pelin
59        /// </summary>
60        protected override void Begin()
61        {
62            LataaKentta(kentannro);
63        }
64
65        /// <summary>
66        /// Päivityssilmukka, hoitaa tällä hetkellä manuaalisesti vain
67        /// taustan liikuttamisen
68        /// </summary>
69        /// <param name="time"></param>
70        protected override void Update(Time time)
71        {
72            if (tahdet != null)
73            {
74                for (int i = 0; i < tahdet.Length; i++)
75                {
76                    tahdet[i].Y -= 20;
77                    if (tahdet[i].Y < Level.Bottom - 40) tahdet[i].Y = Level.Top + 100;
78                }
79            }
80            base.Update(time);
81        }
82
83        #region Kentän lataaminen
84
85        /// <summary>
86        /// Tulee lataamaan numeroa vastaavan kentän
87        /// Kentän tiedot siis tallennettaisiin level1.txt, level2.txt...
88        /// </summary>
89        /// <param name="kentanNumero">Ei vielä käytössä</param>
90        void LataaKentta(int kentanNumero)
91        {
92            ClearAll();
93
94            if (kentanNumero == 0)
95            { 
96                NaytaMenu();
97                return;
98            }
99
100            Level.Width = 600;
101            Level.Height = 800;
102
103            Level.BackgroundColor = Color.Black;
104            Camera.Move(new Vector(250, 0));
105            //Camera.Zoom(0.9);
106
107            LuoPelaaja();
108            LataaHUD();
109            LataaKontrollit(pelaajaAlus);
110            LataaSeinat();
111            LataaTausta(kentanNumero);
112            LataaViholliset(20, 4,10);
113           
114        }
115
116        /// <summary>
117        /// Luo näytölle valikon ja kontrollit sen käyttöön
118        /// </summary>
119        void NaytaMenu()
120        {
121            Level.BackgroundColor = Color.Black;
122            menu = new TextDisplay[2];
123            menutapahtumat = new Action[2];
124            menutapahtumat[1] = Exit;
125            menutapahtumat[0] = AloitaPeli;
126            menutekstit = new string[2];
127            menutekstit[0] = "Start";
128            menutekstit[1] = "Exit";
129
130            for (int i = 0; i < menu.Length; i++)
131            {
132                menu[i] = new TextDisplay();
133                menu[i].Text = menutekstit[i];
134                menu[i].AutoSize = true;
135                menu[i].TextColor = tekstinVari;
136               
137               
138                menu[i].Position = new Vector(0, +100 - i*40);
139                Add(menu[i]);
140            }
141            menu[valittu].TextColor = tekstiValittuVari;
142            LataaMenukontrollit();
143        }
144
145        /// <summary>
146        /// Kasvattaa kentän numeroa ja lataa seuraavan kentän
147        /// Tähän tulee myös muut toiminnot (pisteiden säilyttäminen yms);
148        /// </summary>
149        void SeuraavaKentta()
150        {
151            kentannro++;
152            LataaKentta(kentannro);
153        }
154
155        void AloitaPeli()
156        {
157            lives.Value = 3;
158            kentannro = 0;
159            SeuraavaKentta();
160        }
161
162        /// <summary>
163        /// Lataa seinät ja kulmat, sekä ns "tappoalueen";
164        /// Kulmille ei lisätä törmäystunnistusta
165        /// </summary>
166        void LataaSeinat()
167        {
168            //Laitojen tagi
169            LisaData tieto = new LisaData();
170            tieto.Tyyppi = "seina";
171
172            PhysicsObject[] kulmat = new PhysicsObject[4];
173
174            //Lisää samassa silmukassa kulmat ja seinät
175            for (int i = 0; i < kulmat.Length; i++)
176            {
177                kulmat[i] = PhysicsObject.CreateStaticObject(60, 60);
178                kulmat[i].Image = LoadImage("seina/seinaKulma");
179                kulmat[i].Tag = tieto;
180                kulmat[i].Angle = Angle.Degrees(i * 90);
181                Add(kulmat[i]);
182
183                seinat[i] = PhysicsObject.CreateStaticObject(1, 1);
184                seinat[i].Tag = tieto;
185                seinat[i].Image = LoadImage("seina/seinaOikea");
186                seinat[i].Angle = Angle.Degrees(90 * i);
187                seinat[i].Size = new Vector(Level.Height, 60);
188                Add(seinat[i]);
189            }
190
191            //Sijoittaa kulmat ja seinät.
192            kulmat[0].Position = new Vector(Level.Left - 30, Level.Bottom - 30);
193            kulmat[1].Position = new Vector(Level.Right + 30, Level.Bottom - 30);
194            kulmat[2].Position = new Vector(Level.Right + 30, Level.Top + 30);
195            kulmat[3].Position = new Vector(Level.Left - 30, Level.Top + 30);
196            seinat[0].Y = Level.Bottom - (seinat[0].Height / 2);
197            seinat[1].X = Level.Right + (seinat[1].Height / 2);
198            seinat[2].Y = Level.Top + (seinat[2].Height / 2);
199            seinat[3].X = Level.Left - (seinat[3].Height / 2);
200
201            //Exit-alueen tekeminen.
202            exitZone = PhysicsObject.CreateStaticObject(Level.Width, 200);
203            exitZone.Y = Level.Bottom - (exitZone.Height / 2);
204            exitZone.Tag = tieto;
205            exitZone.IsVisible = false;
206            Add(exitZone);
207        }
208
209        /// <summary>
210        /// Luo näytölle tarvittavat mittarit
211        /// </summary>
212        void LataaHUD()
213        {
214            ValueDisplay[] naytot = new ValueDisplay[3];
215            for (int i = 0; i < naytot.Length; i++)
216            {
217                naytot[i] = new ValueDisplay();
218                Add(naytot[i]);
219                naytot[i].TextColor = Color.White;
220                naytot[i].ValueColor = Color.Yellow;
221                naytot[i].Position = new Vector(Level.Right + 40, Level.Top - 80 - (30*i));
222            }
223
224            naytot[0].BindTo(pelaajaAlus.HpMeter);
225            naytot[1].BindTo(score);
226            naytot[2].BindTo(lives);
227            naytot[0].Text = "HP: ";
228            naytot[1].Text = "SCORE: ";
229            naytot[2].Text = "LIVES: ";
230
231            aseNimet = new TextDisplay[3];
232            for (int i = 0; i < aseNimet.Length; i++)
233            {
234                aseNimet[i] = new TextDisplay();
235                aseNimet[i].TextColor = Color.White;
236                aseNimet[i].Position = new Vector(Level.Right + 40, Level.Top - 200 - (30 * i));
237                Add(aseNimet[i]);
238            }
239            aseNimet[OLETUSASE].TextColor = Color.Yellow;
240            aseNimet[0].Text = "Beam";
241            aseNimet[1].Text = "Missile";
242            aseNimet[2].Text = "Photon";
243           
244            Timer purkkaAjastin = new Timer();
245            purkkaAjastin.Interval = 0.01;
246            purkkaAjastin.Trigger += Purkkakorjaus;
247            Add(purkkaAjastin);
248            purkkaAjastin.Start(1);
249           
250        }
251
252        /// <summary>
253        /// Purkkakorjaus aseen vaihtamiseen. Vaihtaa aluksen asetta alussa,
254        /// jotta ampuminen toimii.
255        /// </summary>
256        /// <param name="sender"></param>
257        void Purkkakorjaus(Timer sender)
258        {
259            VaihdaAsetta(OLETUSASE+1);
260        }
261
262        /// <summary>
263        /// Lataa taustalle tähdet
264        /// </summary>
265        /// <param name="kentanNumero"></param>
266        void LataaTausta(int kentanNumero)
267        {
268            tahdet = new GameObject[15];
269            for (int i = 0; i < tahdet.Length; i++)
270            {
271                GameObject tahti = new GameObject(3, 3);
272                tahti.Color = Color.White;
273                tahti.Shape = Shapes.Circle;
274                tahti.Position = new Vector(RandomGen.NextDouble(Level.Left, Level.Right),
275                                            RandomGen.NextDouble(Level.Top +20, Level.Top + 2000));
276                tahdet[i] = tahti;
277                Add(tahti);
278            }
279        }
280
281        /// <summary>
282        /// Luo pelaajan ja sijoittaa sen kentälle.
283        /// Asettaa pelaajalle myös aseen.
284        /// </summary>
285        void LuoPelaaja()
286        {
287            pelaajaAlus = new Alus(60, 55, 10);
288            pelaajaAlus.Shape = Shapes.Triangle;
289            pelaajaAlus.Animation = new Animation(LoadImages("sankarialus/sankarialusThrust1", "sankarialus/sankarialusThrust2"));
290            pelaajaAlus.Animation.Start();
291
292            pelaajaAlus.Data.Rajahtaa = true;
293            pelaajaAlus.Data.Tyyppi = "oma";
294            pelaajaAlus.Data.Damage = 5;
295           
296            pelaajaAlus.Angle += Angle.Degrees(90);
297
298            pelaajaAlus.IgnoresCollisionResponse = false;
299            pelaajaAlus.Y = Level.Bottom + 40;
300
301            weapons = new ShmupWeapon[3];
302            weapons[0] = new Beam(5, 35, LoadImage("sade"));
303            weapons[1] = new Missile(15, 30, LoadImage("ohjus"));
304            weapons[2] = new Photon(15, 15, LoadImage("photon"));
305           
306            for (int i = 0; i < weapons.Length; i++)
307            {
308                weapons[i].ProjectileCollision = AmmusOsuu;
309                weapons[i].IsVisible = false;
310                weapons[i].Position = new Vector(0, -42);
311                pelaajaAlus.Add(weapons[i]);
312            }
313
314            Add(pelaajaAlus);
315            AddCollisionHandler(pelaajaAlus, PelaajaTormaa);
316        }
317
318
319        #endregion
320        #region Kontrollit ja liikkuminen
321        /// <summary>
322        /// Asettaa kontrollit ohjaamaan haluttua alusta
323        /// </summary>
324        /// <param name="pelaaja">Alus, jota halutaan ohjata</param>
325        void LataaKontrollit(Alus pelaaja)
326        {
327            Keyboard.Listen(Key.Escape, ButtonState.Pressed, Exit, "Lopettaa pelin");
328            Keyboard.Listen(Key.Up, ButtonState.Down, Liikuta, "Liikuttaa alusta ylös", pelaaja, nopeusPysty);
329            Keyboard.Listen(Key.Up, ButtonState.Released, pelaaja.StopVertical, null);
330            Keyboard.Listen(Key.Down, ButtonState.Down, Liikuta, "Liikuttaa alusta alas", pelaaja, -nopeusPysty);
331            Keyboard.Listen(Key.Down, ButtonState.Released, pelaaja.StopVertical, null);
332            Keyboard.Listen(Key.Left, ButtonState.Down, Liikuta, "Liikuttaa alusta vasemmalle", pelaaja, -nopeusVaaka);
333            Keyboard.Listen(Key.Left, ButtonState.Released, pelaaja.StopHorizontal, null);
334            Keyboard.Listen(Key.Right, ButtonState.Down, Liikuta, "Liikuttaa alusta oikealle", pelaaja, nopeusVaaka);
335            Keyboard.Listen(Key.Right, ButtonState.Released, pelaaja.StopHorizontal, null);
336            Keyboard.Listen(Key.LeftControl, ButtonState.Down, Ammu, "Lopettaa pelin", pelaajaAlus);
337            Keyboard.Listen(Key.D1, ButtonState.Pressed, VaihdaAsetta, "Valitsee säde-aseen", 1);
338            Keyboard.Listen(Key.D2, ButtonState.Pressed, VaihdaAsetta, "Valitsee ohjuksen", 2);
339            Keyboard.Listen(Key.D3, ButtonState.Pressed, VaihdaAsetta, "Valitsee fotoniaseen", 3);
340        }
341
342        /// <summary>
343        /// Lataa menun kontrollit
344        /// </summary>
345        void LataaMenukontrollit()
346        {
347            Keyboard.Listen(Key.Escape, ButtonState.Pressed, Exit, "Sulkee pelin");
348            Keyboard.Listen(Key.Up, ButtonState.Pressed, MenuMove, "Liikuttaa valintaa ylös", -1);
349            Keyboard.Listen(Key.Down, ButtonState.Pressed, MenuMove, "Liikuttaa valintaa alas", +1);
350            Keyboard.Listen(Key.Enter, ButtonState.Pressed, MenuSelect, "Valitse");
351        }
352
353        /// <summary>
354        /// Liikuttaa menuvalintaa, ja tarkastaa ettei se mene yli menun
355        /// </summary>
356        /// <param name="askelmaara"></param>
357        void MenuMove(int askelmaara)
358        {
359            valittu += askelmaara;
360            if (valittu < 0) valittu = menutekstit.Length - 1;
361            if (valittu >= menutekstit.Length) valittu = 0;
362            for (int i = 0; i < menu.Length; i++)
363            {
364                menu[i].TextColor = tekstinVari;
365            }
366
367            menu[valittu].TextColor = tekstiValittuVari;
368        }
369
370        /// <summary>
371        /// Valitsee valitun toiminnon menusta
372        /// </summary>
373        void MenuSelect()
374        {
375            menutapahtumat[valittu]();
376        }
377
378        /// <summary>
379        /// Liikuttaa alusta haluttuun suuntaan
380        /// </summary>
381        /// <param name="alus">Liikutettava alus</param>
382        /// <param name="suunta">Liikutettava suunta</param>
383        void Liikuta(Alus alus, Vector suunta)
384        {
385            if (-NOPEUS < alus.Velocity.Y && alus.Velocity.Y < NOPEUS && suunta.Y != 0)
386            {
387                alus.Velocity += suunta;
388            }
389            if (-NOPEUS < alus.Velocity.X && alus.Velocity.X < NOPEUS && suunta.X != 0)
390            {
391                alus.Velocity += suunta;
392            }
393        }
394
395        /// <summary>
396        /// Vaihtaa pelaajan asetta.
397        /// </summary>
398        /// <param name="aseenNumero">Aseen numero, johon vaihdetaan</param>
399        void VaihdaAsetta(int aseenNumero)
400        {
401            if (aseenNumero > 0 && aseenNumero < weapons.Length+1)
402            {
403                pelaajaAlus.SetWeapon(weapons[aseenNumero-1]);
404                for (int i = 0; i < aseNimet.Length; i++)
405                {
406                    aseNimet[i].TextColor = Color.White;
407                }
408                aseNimet[aseenNumero-1].TextColor = Color.Yellow;
409            }
410        }
411
412        /// <summary>
413        /// Ampuu aluksella
414        /// </summary>
415        /// <param name="alus">Alus joka ampuu</param>
416        void Ammu(Alus alus)
417        {
418            alus.Shoot();
419        }
420
421        #endregion
422        #region Viholliset
423        /// <summary>
424        /// Lataa viholliset
425        /// TODO: Kentän numeron huomioiminen
426        ///
427        /// Jos bossmode on päällä, lähettää vain loppupomon.
428        /// </summary>
429        void LataaViholliset(int maara, double min, double max)
430        {
431            List<AikaTapahtuma> vihollistenTuloajat = new List<AikaTapahtuma>();
432
433            if (!bossmode)
434            {
435                for (int i = 0; i < maara; i++)
436                {
437                    vihollistenTuloajat.Add(new AikaTapahtuma(2 + (i * 5), LahetaSatunnainenVihollislaivue, 4, 10));
438                }
439                vihollistenTuloajat.Add(new AikaTapahtuma(2 + (maara * 5), LahetaLoppupomo, 1, 20));
440            }
441            else
442            {
443                vihollistenTuloajat.Add(new AikaTapahtuma(0, LahetaLoppupomo, 1, 20));
444            }
445
446            //Lisää jokaiselle muodostelmalle lähettäjän
447            foreach (AikaTapahtuma tapahtuma in vihollistenTuloajat)
448            {
449                Timer ajastin = new Timer();
450                ajastin.Tag = tapahtuma.Lahtopaikka;
451                ajastin.Interval = tapahtuma.Aika;
452                ajastin.Trigger += tapahtuma.Tapahtuma;
453                Add(ajastin);
454                ajastin.Start(1);
455            }
456        }
457
458        /// <summary>
459        /// Luo alukset ja lähettää ne matkaan
460        /// </summary>
461        /// <param name="sender">Timerin tagissa on lähtökoordinaatti</param>
462        /// <param name="lahetysX">X-koordinaatti, josta muodostelma lähtee</param>
463        void LahetaLoppupomo(Timer sender)
464        {
465            double taso = ((Vector)sender.Tag).X;
466
467            List<Alus> alukset = new List<Alus>();
468            Image vihollisenKuva = LoadImage("loppuvastus" + 1);
469            alukset.Add(LuoVihollinen(vihollisenKuva, 400));
470            alukset[0].Position = new Vector(0, Level.Top + 0);
471            alukset[0].Angle = Angle.Degrees(270);
472            Add(alukset[0]);
473
474            Timer Purkkakorjaus = new Timer();
475            Purkkakorjaus.Tag = alukset[0];
476            Purkkakorjaus.Interval = 0.1;
477            Purkkakorjaus.Trigger += Purkkakorjaus2;
478            Add(Purkkakorjaus);
479            Purkkakorjaus.Start(1);
480
481            //Lisää ampuma-ajastimen
482            Timer ampumaAjastin = new Timer();
483            ampumaAjastin.Interval = 0.7;
484            ampumaAjastin.Trigger += alukset[0].Shoot;
485            Add(ampumaAjastin);
486            ampumaAjastin.Start();
487
488            List<Vector> reitti = new List<Vector>();
489            reitti.Add(new Vector(-200, Level.Top - 100 ));
490            reitti.Add(new Vector(200, Level.Top - 100));
491
492            Muodostelma muodostelma = new Muodostelma(alukset, reitti, LuoLahettaja());
493            muodostelma.MovingSpeed = 100;
494            muodostelma.Start();
495        }
496
497        void Purkkakorjaus2(Timer sender)
498        {             
499            //Aseen säätö
500
501            Photon ase = new Photon(10, 10, LoadImage("photon"));
502            Add(ase);
503            ase.Data.Damage = 20;
504            ase.Data.Rajahtaa = false;
505            ase.Data.Tyyppi = "vihollinen";
506            ((Alus)sender.Tag).Add(ase);
507            ((Alus)sender.Tag).SetWeapon(ase);
508        }
509
510        /// <summary>
511        /// Arpoo ja lähettää satunnaisen vihollislaivueen
512        /// Laivueessa on tällä hetkellä 10 alusta
513        /// Aluksen kuva arvotaan tiedostoista, joiden nimi on "vihollinen#.png"
514        /// </summary>
515        /// <param name="sender"></param>
516        void LahetaSatunnainenVihollislaivue(Timer sender)
517        {
518            List<Alus> alukset = new List<Alus>();
519            Image vihollisenKuva = LoadImage("vihollinen" + RandomGen.NextInt(1,VIHOLLISKUVIA));
520
521            int min = (int)((Vector)sender.Tag).X;
522            int max = (int)((Vector)sender.Tag).Y;
523            int koko = RandomGen.NextInt(min, max);
524
525            for (int i = 0; i < koko; i++)
526            {
527                alukset.Add(LuoVihollinen(vihollisenKuva, 40));
528                Add(alukset[i]);
529                Angle alas = new Angle();
530                alas.Degree = 270;
531                alukset[i].Angle = Angle.Degrees(270);
532                alukset[i].Position = new Vector(0, Level.Top + 200);
533                AddCollisionHandler(alukset[i], VihollinenTormaa);
534            }
535
536            IList<Vector> reitti = ArvoReitti(RandomGen.NextInt(0,5));
537            Muodostelma muodostelma = new Muodostelma(alukset, reitti, LuoLahettaja());
538            muodostelma.MovingSpeed = 200;
539            muodostelma.Start();
540        }
541
542        /// <summary>
543        /// Arpoo koneelle reitin, joka lähteee ylhäältä ja päätyy alas
544        /// </summary>
545        /// <param name="valipisteet">Välipisteiden määrä, 0 -></param>
546        /// <returns></returns>
547        List<Vector> ArvoReitti(int valipisteet)
548        {
549            List<Vector> reitti = new List<Vector>();
550            reitti.Add(new Vector(RandomGen.NextDouble(Level.Left + 30, Level.Right - 30),Level.Top + 80));
551            for (int i = 0; i < valipisteet; i++)
552            {
553                reitti.Add(new Vector(RandomGen.NextDouble(Level.Left + 30, Level.Right - 30),
554                                     (RandomGen.NextDouble(Level.Bottom + 30, Level.Top - 100))));
555            }
556            reitti.Add(new Vector(RandomGen.NextDouble(Level.Left + 30, Level.Right - 30), Level.Bottom - 35));
557            return reitti;
558        }
559
560        Alus LuoVihollinen(Image kuva, int hp)
561        {
562           
563            Alus vihollinen = new Alus(kuva.Width/5, kuva.Height/5, hp);
564            vihollinen.Image = kuva;
565            LisaData tieto = new LisaData();
566            tieto.Tyyppi = "vihollinen";
567            tieto.Rajahtaa = true;
568            tieto.Damage = 5;
569            vihollinen.Tag = tieto;
570            return vihollinen;
571        }
572
573        /// <summary>
574        /// Luo ajastimen
575        /// Lisää myös ajastimen, joten voidaan kutsua suoraan Muodostelman muodostajassa.
576        /// </summary>
577        /// <returns></returns>
578        Timer LuoLahettaja()
579        {
580            Timer ajastin = new Timer();
581            ajastin.Interval = 0.5;
582            Add(ajastin);
583            return ajastin;
584        }
585        #endregion
586        #region Tapahtumat
587        /// <summary>
588        /// Pelaajan törmäyksen käsittelijä
589        ///
590        /// Katsoo myös, että pelaaja ei juutu seiniin
591        /// </summary>
592        /// <param name="tormaaja"></param>
593        /// <param name="kohde"></param>
594        void PelaajaTormaa(PhysicsObject tormaaja, PhysicsObject kohde)
595        {
596            if (((LisaData)kohde.Tag).Tyyppi == "vihollinen") 
597            {
598                ((Alus)tormaaja).TakeHit(5);
599                if (kohde is Alus) ((Alus)kohde).TakeHit(20);
600            }
601
602            if (kohde == seinat[3])
603            {
604                tormaaja.X = Level.Left + tormaaja.Height / 2 + 1;
605                tormaaja.StopHorizontal();
606            }
607
608            if (kohde == seinat[1])
609            {
610                tormaaja.X = Level.Right - tormaaja.Height / 2 - 1;
611                tormaaja.StopHorizontal();
612            }
613            if (kohde == seinat[2])
614            {
615                tormaaja.Y = Level.Top - tormaaja.Width / 2 - 1;
616                tormaaja.StopVertical();
617            }
618            if (kohde == seinat[0])
619            {
620                tormaaja.Y = Level.Bottom + tormaaja.Width/2 +1;
621                tormaaja.StopVertical();
622            }
623
624        }
625
626        /// <summary>
627        /// Mitä tapahtuu, kun vihollinen tulee ns. poistumisalueelle
628        /// </summary>
629        /// <param name="tormaaja"></param>
630        /// <param name="kohde"></param>
631        void VihollinenTormaa(PhysicsObject tormaaja, PhysicsObject kohde)
632        {
633            if (kohde == exitZone) Remove(tormaaja);
634           
635        }
636
637        void AmmusOsuu(PhysicsObject ammus, PhysicsObject toinen)
638        {
639
640            if (toinen.Tag.ToString() == "seina" || ((LisaData)toinen.Tag).Tyyppi != ((LisaData)ammus.Tag).Tyyppi)
641            {
642                ammus.Destroy();
643                if (((LisaData)ammus.Tag).Rajahtaa)
644                {
645                    Explosion rajahdys = new Explosion(100);
646                    rajahdys.Position = toinen.Position;
647                    Add(rajahdys);
648                }
649
650                if (((LisaData)toinen.Tag).Tyyppi == "vihollinen")
651                {
652                    if (toinen is Alus) 
653                    {
654                        ((Alus)toinen).TakeHit(((LisaData)ammus.Tag).Damage);
655                        if (toinen.IsDestroyed()) score.Value += 300;
656                    }
657                   
658                }
659            }
660
661
662        }
663        #endregion
664    }
665
666    public class AikaTapahtuma 
667    {
668        public int Aika;
669        public Timer.TriggerHandler Tapahtuma;
670        private Vector lahtopaikka;
671
672        public Vector Lahtopaikka
673        {
674            get{ return lahtopaikka; }
675        }
676
677        public AikaTapahtuma(int aika, Timer.TriggerHandler tapahtuma, double param1, double param2)
678        {
679            this.Aika = aika;
680            this.Tapahtuma = tapahtuma;
681            this.lahtopaikka = new Vector(param1, param2);
682        }
683    }
684}
Note: See TracBrowser for help on using the repository browser.