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

Revision 922, 15.9 KB checked in by hniemi, 11 years ago (diff)

Photoniase ja loppupomo lisätty.
Ampuminen ja törmäyksentunnistus kaataa, palataan asiaan ruokailun jälkeen.

Line 
1using System;
2using Jypeli;
3using Jypeli.ScreenObjects;
4using Jypeli.Assets;
5using System.Collections.Generic;
6
7
8namespace ShootEmUp
9{
10    public class Peli : PhysicsGame
11    {
12        #region Julistukset
13       
14       
15        //Liikkumisnopeudet
16        private const double NOPEUS = 300;
17        private Vector nopeusPysty = new Vector(0,NOPEUS);
18        private Vector nopeusVaaka = new Vector(NOPEUS, 0);
19
20        //Kentän rakenne
21        private Alus pelaajaAlus;
22        private PhysicsObject vasenLaita;
23        private PhysicsObject oikeaLaita;
24        private PhysicsObject pohja;
25        private PhysicsObject katto;
26        private PhysicsObject exitZone;
27
28        //Viholliset
29        private const int VIHOLLISKUVIA = 3;
30
31        //Statistiikka
32        private int kentannro = 0;
33        private IntMeter score = new IntMeter(0);
34        private Weapon[] weapons;
35
36        #endregion
37
38        protected override void Begin()
39        {
40            LataaKentta(kentannro);
41        }
42
43        #region Kentän lataaminen
44
45        /// <summary>
46        /// Tulee lataamaan numeroa vastaavan kentän
47        /// Kentän tiedot siis tallennettaisiin level1.txt, level2.txt...
48        /// </summary>
49        /// <param name="kentanNumero">Ei vielä käytössä</param>
50        void LataaKentta(int kentanNumero)
51        {
52            ClearAll();
53            Level.Width = 600;
54            Level.Height = 800;
55
56            Camera.Move(new Vector(250, 0));
57
58            //Laidat
59            LisaData tieto;
60            tieto.Tyyppi = "seina";
61            tieto.Rajahtaa = true;
62            tieto.Damage = 5;
63            vasenLaita = Level.CreateLeftBorder();
64            vasenLaita.Tag = tieto;
65            oikeaLaita = Level.CreateRightBorder();
66            oikeaLaita.Tag = tieto;
67            pohja = Level.CreateBottomBorder();
68            pohja.Tag = tieto;
69            katto = Level.CreateTopBorder();
70            katto.Tag = tieto;
71
72            //Exit-alueen tekeminen.
73            exitZone = PhysicsObject.CreateStaticObject(Level.Width, 200);
74            exitZone.Position = new Vector(Level.Center.X, Level.Bottom - exitZone.Size.Y / 2 - 5);
75            exitZone.Tag = tieto;
76
77            Add(exitZone);
78
79
80            LuoPelaaja();
81            LataaKontrollit(pelaajaAlus);
82            //LataaTausta(kentanNumero);
83            LataaViholliset(20, 4,10);
84            LataaHUD();
85        }
86
87        /// <summary>
88        /// Luo näytölle tarvittavat mittarit
89        /// </summary>
90        void LataaHUD()
91        {
92            ValueDisplay hpNaytto = new ValueDisplay();
93            hpNaytto.BindTo(pelaajaAlus.HpMeter);
94            Add(hpNaytto);
95            hpNaytto.Position = new Vector(Level.Right + 40, Level.Top - 80);
96            hpNaytto.Text = "HP: ";
97
98            ValueDisplay scoreNaytto = new ValueDisplay();
99            scoreNaytto.BindTo(score);
100            Add(scoreNaytto);
101            scoreNaytto.Position = new Vector(Level.Right + 40, Level.Top - 100);
102            scoreNaytto.Text = "SCORE: ";
103
104        }
105
106        /// <summary>
107        /// Luo pelaajan ja sijoittaa sen kentälle.
108        /// Asettaa pelaajalle myös aseen.
109        /// </summary>
110        void LuoPelaaja()
111        {
112            pelaajaAlus = new Alus(60, 55, 10);
113            pelaajaAlus.Shape = Shapes.Triangle;
114           
115            pelaajaAlus.Animation = new Animation(LoadImages("sankarialus/sankarialusThrust1", "sankarialus/sankarialusThrust2"));
116            pelaajaAlus.Animation.Start();
117
118            LisaData tieto;
119            tieto.Tyyppi = "oma";
120            tieto.Rajahtaa = true;
121            tieto.Damage = 5;
122            pelaajaAlus.Tag = tieto;
123
124            pelaajaAlus.Angle += Angle.Degrees(90);
125
126            pelaajaAlus.IgnoresCollisionResponse = false;
127            pelaajaAlus.Y = Level.Bottom + 40;
128            pelaajaAlus.KineticFriction = 1.0;
129            pelaajaAlus.Mass = 100000;
130
131            weapons = new Weapon[3];
132
133            weapons[0] = new Beam(1, 1);
134            ((Beam)weapons[0]).BeamCollision = AmmusOsuu;
135            weapons[0].Position = new Vector(0, -40);
136            weapons[1] = new Missile(1, 1);
137            ((Missile)weapons[1]).MissileCollision = AmmusOsuu;
138
139            weapons[2] = new Photon(1, 1);
140            ((Photon)weapons[2]).PhotonCollision = AmmusOsuu;
141
142            for (int i = 0; i < weapons.Length; i++)
143            {
144                pelaajaAlus.Add(weapons[i]);
145            }
146
147            Add(pelaajaAlus);
148            pelaajaAlus.SetWeapon(weapons[2]);
149           
150            AddCollisionHandler(pelaajaAlus, PelaajaTormaa);
151           
152        }
153
154        #endregion
155        #region Kontrollit ja liikkuminen
156        /// <summary>
157        /// Asettaa kontrollit ohjaamaan haluttua alusta
158        /// </summary>
159        /// <param name="pelaaja">Alus, jota halutaan ohjata</param>
160        void LataaKontrollit(Alus pelaaja)
161        {
162            Keyboard.Listen(Key.Escape, ButtonState.Pressed, Exit, "Lopettaa pelin");
163            Keyboard.Listen(Key.Up, ButtonState.Down, Liikuta, "Liikuttaa alusta ylös", pelaaja, nopeusPysty);
164            Keyboard.Listen(Key.Up, ButtonState.Released, pelaaja.StopVertical, null);
165            Keyboard.Listen(Key.Down, ButtonState.Down, Liikuta, "Liikuttaa alusta alas", pelaaja, -nopeusPysty);
166            Keyboard.Listen(Key.Down, ButtonState.Released, pelaaja.StopVertical, null);
167            Keyboard.Listen(Key.Left, ButtonState.Down, Liikuta, "Liikuttaa alusta vasemmalle", pelaaja, -nopeusVaaka);
168            Keyboard.Listen(Key.Left, ButtonState.Released, pelaaja.StopHorizontal, null);
169            Keyboard.Listen(Key.Right, ButtonState.Down, Liikuta, "Liikuttaa alusta oikealle", pelaaja, nopeusVaaka);
170            Keyboard.Listen(Key.Right, ButtonState.Released, pelaaja.StopHorizontal, null);
171            Keyboard.Listen(Key.LeftControl, ButtonState.Down, Ammu, "Lopettaa pelin", pelaajaAlus);
172            Keyboard.Listen(Key.D1, ButtonState.Pressed, VaihdaAsetta, "Valitsee säde-aseen", 1);
173            Keyboard.Listen(Key.D2, ButtonState.Pressed, VaihdaAsetta, "Valitsee ohjuksen", 2);
174            Keyboard.Listen(Key.D3, ButtonState.Pressed, VaihdaAsetta, "Valitsee fotoniaseen", 2);
175        }
176
177        /// <summary>
178        /// Liikuttaa alusta haluttuun suuntaan
179        /// </summary>
180        /// <param name="alus">Liikutettava alus</param>
181        /// <param name="suunta">Liikutettava suunta</param>
182        void Liikuta(Alus alus, Vector suunta)
183        {
184            if (-NOPEUS < alus.Velocity.Y && alus.Velocity.Y < NOPEUS && suunta.Y != 0)
185            {
186                alus.Velocity += suunta;
187            }
188            if (-NOPEUS < alus.Velocity.X && alus.Velocity.X < NOPEUS && suunta.X != 0)
189            {
190                alus.Velocity += suunta;
191            }
192        }
193
194        void VaihdaAsetta(int aseenNumero)
195        {
196            if (aseenNumero > 0 && aseenNumero < 4)
197            pelaajaAlus.SetWeapon(weapons[aseenNumero-1]);
198        }
199
200        /// <summary>
201        /// Ampuu aluksella
202        /// </summary>
203        /// <param name="alus">Alus joka ampuu</param>
204        void Ammu(Alus alus)
205        {
206            alus.Shoot();
207        }
208
209        #endregion
210        #region Viholliset
211        /// <summary>
212        /// Lataa viholliset
213        /// TODO: Kentän numeron huomioiminen
214        /// </summary>
215        void LataaViholliset(int maara, double min, double max)
216        {
217            List<AikaTapahtuma> vihollistenTuloajat = new List<AikaTapahtuma>();
218            /*
219            for (int i = 0; i < maara; i++)
220            {
221                vihollistenTuloajat.Add(new AikaTapahtuma(2 + (i * 5), LahetaSatunnainenVihollislaivue, 4, 10));
222            }
223            */
224            vihollistenTuloajat.Add(new AikaTapahtuma(1/*2 + (maara * 7)*/, LahetaLoppupomo, 1, 20));
225
226            foreach (AikaTapahtuma tapahtuma in vihollistenTuloajat)
227            {
228                Timer ajastin = new Timer();
229                ajastin.Tag = tapahtuma.Lahtopaikka;
230                ajastin.Interval = tapahtuma.Aika;
231                ajastin.Trigger += tapahtuma.Tapahtuma;
232                Add(ajastin);
233                ajastin.Start(1);
234            }
235        }
236
237        /// <summary>
238        /// Luo alukset ja lähettää ne matkaan
239        /// </summary>
240        /// <param name="sender">Timerin tagissa on lähtökoordinaatti</param>
241        /// <param name="lahetysX">X-koordinaatti, josta muodostelma lähtee</param>
242        void LahetaLoppupomo(Timer sender)
243        {
244            double taso = ((Vector)sender.Tag).X;
245
246            List<Alus> alukset = new List<Alus>();
247            Image vihollisenKuva = LoadImage("loppuvastus" + 1);
248            alukset.Add(LuoVihollinen(vihollisenKuva, 400));
249            alukset[0].Position = new Vector(0, Level.Top + 200);
250            alukset[0].Angle = Angle.Degrees(270);
251            Add(alukset[0]);
252
253            //Aseen säätö
254            Photon ase = new Photon(10, 10);
255            LisaData ammuksenData;
256            ammuksenData.Damage = 20;
257            ammuksenData.Rajahtaa = false;
258            ammuksenData.Tyyppi = "vihollinen";
259            ase.Tag = ammuksenData;
260            alukset[0].Add(ase);
261            alukset[0].SetWeapon(ase);
262            alukset[0].UsedWeapon.IsVisible = false;
263            ase.PhotonCollision = AmmusOsuu;
264
265            Timer ampumaAjastin = new Timer();
266            ampumaAjastin.Interval = 0.7;
267            ampumaAjastin.Trigger += alukset[0].TimerShoot;
268            Add(ampumaAjastin);
269            ampumaAjastin.Start();
270
271            List<Vector> reitti = new List<Vector>();
272            reitti.Add(new Vector(-200, Level.Top - 100 ));
273            reitti.Add(new Vector(200, Level.Top - 100));
274
275            Muodostelma muodostelma = new Muodostelma(alukset, reitti, LuoLahettaja());
276            muodostelma.MovingSpeed = 100;
277            muodostelma.Start();
278        }
279
280        /// <summary>
281        /// Arpoo ja lähettää satunnaisen vihollislaivueen
282        /// Laivueessa on tällä hetkellä 10 alusta
283        /// Aluksen kuva arvotaan tiedostoista, joiden nimi on "vihollinen#.png"
284        /// </summary>
285        /// <param name="sender"></param>
286        void LahetaSatunnainenVihollislaivue(Timer sender)
287        {
288            List<Alus> alukset = new List<Alus>();
289            Image vihollisenKuva = LoadImage("vihollinen" + RandomGen.NextInt(1,VIHOLLISKUVIA));
290
291            int min = (int)((Vector)sender.Tag).X;
292            int max = (int)((Vector)sender.Tag).Y;
293            int koko = RandomGen.NextInt(min, max);
294
295            for (int i = 0; i < koko; i++)
296            {
297                alukset.Add(LuoVihollinen(vihollisenKuva, 40));
298                Add(alukset[i]);
299                Angle alas = new Angle();
300                alas.Degree = 270;
301                alukset[i].Angle = Angle.Degrees(270);
302                alukset[i].Position = new Vector(0, Level.Top + 200);
303                AddCollisionHandler(alukset[i], VihollinenTormaa);
304            }
305
306            List<Vector> reitti = ArvoReitti(RandomGen.NextInt(0,5));
307            Muodostelma muodostelma = new Muodostelma(alukset, reitti, LuoLahettaja());
308            muodostelma.MovingSpeed = 100;
309            muodostelma.Start();
310        }
311
312        /// <summary>
313        /// Arpoo koneelle reitin, joka lähteee ylhäältä ja päätyy alas
314        /// </summary>
315        /// <param name="valipisteet">Välipisteiden määrä, 0 -></param>
316        /// <returns></returns>
317        List<Vector> ArvoReitti(int valipisteet)
318        {
319            List<Vector> reitti = new List<Vector>();
320            reitti.Add(new Vector(RandomGen.NextDouble(Level.Left + 30, Level.Right - 30),Level.Top + 80));
321            for (int i = 0; i < valipisteet; i++)
322            {
323                reitti.Add(new Vector(RandomGen.NextDouble(Level.Left + 30, Level.Right - 30),
324                                     (RandomGen.NextDouble(Level.Bottom + 30, Level.Top - 100))));
325            }
326            reitti.Add(new Vector(RandomGen.NextDouble(Level.Left + 30, Level.Right - 30), Level.Bottom - 35));
327            return reitti;
328        }
329
330        Alus LuoVihollinen(Image kuva, int hp)
331        {
332           
333            Alus vihollinen = new Alus(kuva.Width/5, kuva.Height/5, hp);
334            vihollinen.Image = kuva;
335            LisaData tieto;
336            tieto.Tyyppi = "vihollinen";
337            tieto.Rajahtaa = true;
338            tieto.Damage = 5;
339            vihollinen.Tag = tieto;
340            return vihollinen;
341        }
342
343        /// <summary>
344        /// Luo ajastimen
345        /// Lisää myös ajastimen, joten voidaan kutsua suoraan Muodostelman muodostajassa.
346        /// </summary>
347        /// <returns></returns>
348        Timer LuoLahettaja()
349        {
350            Timer ajastin = new Timer();
351            ajastin.Interval = 0.5;
352            Add(ajastin);
353            return ajastin;
354        }
355        #endregion
356        #region Tapahtumat
357        /// <summary>
358        /// Pelaajan törmäyksen käsittelijä
359        ///
360        /// Katsoo myös, että pelaaja ei juutu seiniin
361        /// </summary>
362        /// <param name="tormaaja"></param>
363        /// <param name="kohde"></param>
364        void PelaajaTormaa(PhysicsObject tormaaja, PhysicsObject kohde)
365        {
366            if (((LisaData)kohde.Tag).Tyyppi == "vihollinen") 
367            {
368                ((Alus)tormaaja).TakeHit(5);
369                if (kohde is Alus) ((Alus)kohde).TakeHit(20);
370            }
371
372            if (kohde == vasenLaita)
373            {
374                tormaaja.X = Level.Left + tormaaja.Height / 2 + 1;
375                tormaaja.StopHorizontal();
376            }
377
378            if (kohde == oikeaLaita)
379            {
380                tormaaja.X = Level.Right - tormaaja.Height / 2 - 1;
381                tormaaja.StopHorizontal();
382            }
383            if (kohde == katto)
384            {
385                tormaaja.Y = Level.Top - tormaaja.Width / 2 - 1;
386                tormaaja.StopVertical();
387            }
388            if (kohde == pohja)
389            {
390                tormaaja.Y = Level.Bottom + tormaaja.Width/2 +1;
391                tormaaja.StopVertical();
392            }
393
394        }
395
396        /// <summary>
397        /// Mitä tapahtuu, kun vihollinen tulee ns. poistumisalueelle
398        /// </summary>
399        /// <param name="tormaaja"></param>
400        /// <param name="kohde"></param>
401        void VihollinenTormaa(PhysicsObject tormaaja, PhysicsObject kohde)
402        {
403            if (kohde == exitZone) Remove(tormaaja);
404           
405        }
406
407        void AmmusOsuu(PhysicsObject ammus, PhysicsObject toinen)
408        {
409           
410            if (toinen.Tag.ToString() == "seina" || ((LisaData)toinen.Tag).Tyyppi != "oma" )
411            {
412                ammus.Destroy();
413                if (((LisaData)ammus.Tag).Rajahtaa)
414                {
415                    Explosion rajahdys = new Explosion(100);
416                    rajahdys.Position = toinen.Position;
417                    Add(rajahdys);
418                }
419
420                if (((LisaData)toinen.Tag).Tyyppi == "vihollinen")
421                {
422                    ((Alus)toinen).TakeHit(((LisaData)ammus.Tag).Damage);
423                    if (toinen.IsDestroyed()) score.Value++;
424                }
425            }
426
427
428        }
429        #endregion
430    }
431
432    public class AikaTapahtuma 
433    {
434        public int Aika;
435        public Timer.TriggerHandler Tapahtuma;
436        private Vector lahtopaikka;
437
438        public Vector Lahtopaikka
439        {
440            get{ return lahtopaikka; }
441        }
442
443        public AikaTapahtuma(int aika, Timer.TriggerHandler tapahtuma, double param1, double param2)
444        {
445            this.Aika = aika;
446            this.Tapahtuma = tapahtuma;
447            this.lahtopaikka = new Vector(param1, param2);
448        }
449    }
450}
Note: See TracBrowser for help on using the repository browser.