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

Revision 847, 14.6 KB checked in by hniemi, 10 years ago (diff)

Grafiikkaa lisätty
Aseen vaihtaminen EI TOIMI (kaataa pelin)

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            vasenLaita = Level.CreateLeftBorder();
60            oikeaLaita = Level.CreateRightBorder();
61            pohja = Level.CreateBottomBorder();
62            katto = Level.CreateTopBorder();
63
64            //Exit-alueen tekeminen.
65            exitZone = PhysicsObject.CreateStaticObject(Level.Width, 200);
66            exitZone.Position = new Vector(Level.Center.X, Level.Bottom - exitZone.Size.Y / 2 - 5);
67            Add(exitZone);
68
69
70            LuoPelaaja();
71            LataaKontrollit(pelaajaAlus);
72            //LataaTausta(kentanNumero);
73            LataaViholliset();
74            LataaHUD();
75        }
76
77        /// <summary>
78        /// Luo näytölle tarvittavat mittarit
79        /// </summary>
80        void LataaHUD()
81        {
82            ValueDisplay hpNaytto = new ValueDisplay();
83            hpNaytto.BindTo(pelaajaAlus.HpMeter);
84            Add(hpNaytto);
85            hpNaytto.Position = new Vector(Level.Right + 40, Level.Top - 80);
86            hpNaytto.Text = "HP: ";
87
88            ValueDisplay scoreNaytto = new ValueDisplay();
89            scoreNaytto.BindTo(score);
90            Add(scoreNaytto);
91            scoreNaytto.Position = new Vector(Level.Right + 40, Level.Top - 100);
92            scoreNaytto.Text = "SCORE: ";
93
94
95
96        }
97
98        /// <summary>
99        /// Luo pelaajan ja sijoittaa sen kentälle.
100        /// Asettaa pelaajalle myös aseen.
101        /// </summary>
102        void LuoPelaaja()
103        {
104            pelaajaAlus = new Alus(40, 50, 10);
105            pelaajaAlus.Shape = Shapes.Triangle;
106            pelaajaAlus.Image = LoadImage("sankarialus/sankarialusStop");
107
108            pelaajaAlus.Angle += Angle.Degrees(90);
109
110            pelaajaAlus.IgnoresCollisionResponse = false;
111            pelaajaAlus.Y = Level.Bottom + 40;
112            pelaajaAlus.KineticFriction = 1.0;
113            pelaajaAlus.Mass = 100000;
114
115            weapons = new Weapon[2];
116
117            weapons[0] = new Beam(30, 10);
118            ((Beam)weapons[0]).BeamCollision = BeamOsuu;
119            weapons[0].Position = new Vector(5, 11);
120            weapons[1] = new Missile(30, 10);
121            ((Missile)weapons[1]).MissileCollision = MissileOsuu;
122
123            Add(pelaajaAlus);
124            pelaajaAlus.SetWeapon(weapons[1]);
125           
126            AddCollisionHandler(pelaajaAlus, PelaajaTormaa);
127           
128        }
129
130        #endregion
131        #region Kontrollit ja liikkuminen
132        /// <summary>
133        /// Asettaa kontrollit ohjaamaan haluttua alusta
134        /// </summary>
135        /// <param name="pelaaja">Alus, jota halutaan ohjata</param>
136        void LataaKontrollit(Alus pelaaja)
137        {
138            Keyboard.Listen(Key.Escape, ButtonState.Pressed, Exit, "Lopettaa pelin");
139            Keyboard.Listen(Key.Up, ButtonState.Down, Liikuta, "Liikuttaa alusta ylös", pelaaja, nopeusPysty);
140            Keyboard.Listen(Key.Up, ButtonState.Released, pelaaja.StopVertical, null);
141            Keyboard.Listen(Key.Down, ButtonState.Down, Liikuta, "Liikuttaa alusta alas", pelaaja, -nopeusPysty);
142            Keyboard.Listen(Key.Down, ButtonState.Released, pelaaja.StopVertical, null);
143            Keyboard.Listen(Key.Left, ButtonState.Down, Liikuta, "Liikuttaa alusta vasemmalle", pelaaja, -nopeusVaaka);
144            Keyboard.Listen(Key.Left, ButtonState.Released, pelaaja.StopHorizontal, null);
145            Keyboard.Listen(Key.Right, ButtonState.Down, Liikuta, "Liikuttaa alusta oikealle", pelaaja, nopeusVaaka);
146            Keyboard.Listen(Key.Right, ButtonState.Released, pelaaja.StopHorizontal, null);
147            Keyboard.Listen(Key.LeftControl, ButtonState.Pressed, Ammu, "Lopettaa pelin", pelaajaAlus);
148            Keyboard.Listen(Key.D1, ButtonState.Pressed, VaihdaAsetta, "Valitsee säde-aseen", 1);
149            Keyboard.Listen(Key.D2, ButtonState.Pressed, VaihdaAsetta, "Valitsee säde-aseen", 2);
150        }
151
152        /// <summary>
153        /// Liikuttaa alusta haluttuun suuntaan
154        /// </summary>
155        /// <param name="alus">Liikutettava alus</param>
156        /// <param name="suunta">Liikutettava suunta</param>
157        void Liikuta(Alus alus, Vector suunta)
158        {
159            if (-NOPEUS < alus.Velocity.Y && alus.Velocity.Y < NOPEUS && suunta.Y != 0)
160            {
161                alus.Velocity += suunta;
162            }
163            if (-NOPEUS < alus.Velocity.X && alus.Velocity.X < NOPEUS && suunta.X != 0)
164            {
165                alus.Velocity += suunta;
166            }
167        }
168
169        void VaihdaAsetta(int aseenNumero)
170        {
171            if (aseenNumero > 0 && aseenNumero < 3)
172            pelaajaAlus.SetWeapon(weapons[aseenNumero-1]);
173        }
174
175        /// <summary>
176        /// Ampuu aluksella
177        /// </summary>
178        /// <param name="alus">Alus joka ampuu</param>
179        void Ammu(Alus alus)
180        {
181            alus.Shoot();
182        }
183
184        #endregion
185        #region Viholliset
186        /// <summary>
187        /// Lataa viholliset
188        /// TODO: Kentän numeron huomioiminen
189        /// </summary>
190        void LataaViholliset()
191        {
192            List<AikaTapahtuma> vihollistenTuloajat = new List<AikaTapahtuma>();
193            vihollistenTuloajat.Add(new AikaTapahtuma(2, LahetaSatunnainenVihollislaivue, Level.Center.X - 80, Level.Top + 20 ) );
194            vihollistenTuloajat.Add(new AikaTapahtuma(2, LahetaSatunnainenVihollislaivue, Level.Center.X, Level.Top + 20));
195            vihollistenTuloajat.Add(new AikaTapahtuma(9, LahetaSatunnainenVihollislaivue, Level.Center.X + 80, Level.Top + 20));
196            vihollistenTuloajat.Add(new AikaTapahtuma(9, LahetaSatunnainenVihollislaivue, Level.Center.X - 80, Level.Top + 20));
197            vihollistenTuloajat.Add(new AikaTapahtuma(20, LahetaSatunnainenVihollislaivue, Level.Center.X, Level.Top + 20));
198            vihollistenTuloajat.Add(new AikaTapahtuma(20, LahetaSatunnainenVihollislaivue, Level.Center.X + 80, Level.Top + 20));
199            vihollistenTuloajat.Add(new AikaTapahtuma(15, LahetaSatunnainenVihollislaivue, Level.Center.X - 80, Level.Top + 20));
200            vihollistenTuloajat.Add(new AikaTapahtuma(15, LahetaSatunnainenVihollislaivue, Level.Center.X, Level.Top + 20));
201            vihollistenTuloajat.Add(new AikaTapahtuma(40, LahetaSatunnainenVihollislaivue, Level.Center.X + 80, Level.Top + 20));
202
203            foreach (AikaTapahtuma tapahtuma in vihollistenTuloajat)
204            {
205                Timer ajastin = new Timer();
206                ajastin.Tag = tapahtuma.Lahtopaikka;
207                ajastin.LimitTimes(1);
208                ajastin.Interval = tapahtuma.Aika;
209                ajastin.Trigger += tapahtuma.Tapahtuma;
210                Add(ajastin);
211                ajastin.Start();
212            }
213        }
214
215        /// <summary>
216        /// Luo alukset ja lähettää ne matkaan
217        /// </summary>
218        /// <param name="sender">Timerin tagissa on lähtökoordinaatti</param>
219        /// <param name="lahetysX">X-koordinaatti, josta muodostelma lähtee</param>
220        void LahetaPerusvihollinen(Timer sender)
221        {
222            List<Alus> alukset = new List<Alus>();
223            Image vihollisenKuva = LoadImage("vihollinen" + 1);
224
225            for (int i = 0; i < 10; i++)
226            {
227                alukset.Add(LuoVihollinen(vihollisenKuva, 1));
228                Add(alukset[i]);
229                Angle alas = new Angle();
230                alas.Degree = 270;
231                alukset[i].Angle = alas;
232                AddCollisionHandler(alukset[i], VihollinenTormaa);
233            }
234
235            double lahtoX = ((Vector)sender.Tag).X;
236            double lahtoY = ((Vector)sender.Tag).Y;
237
238            List<Vector> reitti = new List<Vector>();
239            reitti.Add(new Vector(lahtoX, lahtoY));
240            reitti.Add(new Vector(-40 +lahtoX, 0));
241            reitti.Add(new Vector(100 + lahtoX, 0));
242            reitti.Add(new Vector(Level.Center.X + lahtoX, Level.Bottom - alukset[0].Size.Y / 2 - 20));
243
244            Muodostelma muodostelma = new Muodostelma(alukset, reitti, LuoLahettaja());
245            muodostelma.MovingSpeed = 100;
246            muodostelma.Start();
247        }
248
249        void LahetaSatunnainenVihollislaivue(Timer sender)
250        {
251            List<Alus> alukset = new List<Alus>();
252            Image vihollisenKuva = LoadImage("vihollinen" + RandomGen.NextInt(1,VIHOLLISKUVIA));
253
254            for (int i = 0; i < 10; i++)
255            {
256                alukset.Add(LuoVihollinen(vihollisenKuva, 1));
257                Add(alukset[i]);
258                Angle alas = new Angle();
259                alas.Degree = 270;
260                alukset[i].Angle = alas;
261                AddCollisionHandler(alukset[i], VihollinenTormaa);
262            }
263
264            List<Vector> reitti = ArvoReitti(RandomGen.NextInt(0,5));
265            Muodostelma muodostelma = new Muodostelma(alukset, reitti, LuoLahettaja());
266            muodostelma.MovingSpeed = 100;
267            muodostelma.Start();
268        }
269
270        /// <summary>
271        /// Arpoo koneelle reitin, joka lähteee ylhäältä ja päätyy alas
272        /// </summary>
273        /// <param name="valipisteet">Välipisteiden määrä, 0 -></param>
274        /// <returns></returns>
275        List<Vector> ArvoReitti(int valipisteet)
276        {
277            List<Vector> reitti = new List<Vector>();
278            reitti.Add(new Vector(RandomGen.NextDouble(Level.Left + 30, Level.Right - 30),Level.Top + 80));
279            for (int i = 0; i < valipisteet; i++)
280            {
281                reitti.Add(new Vector(RandomGen.NextDouble(Level.Left + 30, Level.Right - 30),
282                                     (RandomGen.NextDouble(Level.Bottom + 30, Level.Top - 100))));
283            }
284            reitti.Add(new Vector(RandomGen.NextDouble(Level.Left + 30, Level.Right - 30), Level.Bottom - 35));
285            return reitti;
286        }
287
288        Alus LuoVihollinen(Image kuva, int hp)
289        {
290            Alus vihollinen = new Alus(50, 50, hp);
291            vihollinen.Image = kuva;
292            vihollinen.Tag = "vihollinen";
293            return vihollinen;
294        }
295
296        /// <summary>
297        /// Luo ajastimen
298        /// Lisää myös ajastimen, joten voidaan kutsua suoraan Muodostelman muodostajassa.
299        /// </summary>
300        /// <returns></returns>
301        Timer LuoLahettaja()
302        {
303            Timer ajastin = new Timer();
304            ajastin.Interval = 0.5;
305            Add(ajastin);
306            return ajastin;
307        }
308        #endregion
309        #region Tapahtumat
310        /// <summary>
311        /// Pelaajan törmäyksen käsittelijä
312        ///
313        /// Katsoo myös, että pelaaja ei juutu seiniin
314        /// </summary>
315        /// <param name="tormaaja"></param>
316        /// <param name="kohde"></param>
317        void PelaajaTormaa(PhysicsObject tormaaja, PhysicsObject kohde)
318        {
319            if (kohde.Tag.ToString() == "vihollinen") 
320            {
321                ((Alus)tormaaja).TakeHit(5);
322                if (kohde is Alus) ((Alus)kohde).TakeHit(20);
323            }
324
325            if (kohde == vasenLaita)
326            {
327                tormaaja.X = Level.Left + tormaaja.Height / 2 + 1;
328                tormaaja.StopHorizontal();
329            }
330
331            if (kohde == oikeaLaita)
332            {
333                tormaaja.X = Level.Right - tormaaja.Height / 2 - 1;
334                tormaaja.StopHorizontal();
335            }
336            if (kohde == katto)
337            {
338                tormaaja.Y = Level.Top - tormaaja.Width / 2 - 1;
339                tormaaja.StopVertical();
340            }
341            if (kohde == pohja)
342            {
343                tormaaja.Y = Level.Bottom + tormaaja.Width/2 +1;
344                tormaaja.StopVertical();
345            }
346
347        }
348
349        /// <summary>
350        /// Mitä tapahtuu, kun vihollinen tulee ns. poistumisalueelle
351        /// </summary>
352        /// <param name="tormaaja"></param>
353        /// <param name="kohde"></param>
354        void VihollinenTormaa(PhysicsObject tormaaja, PhysicsObject kohde)
355        {
356            if (kohde == exitZone) tormaaja.Destroy();
357           
358        }
359
360        void BeamOsuu(PhysicsObject sade, PhysicsObject toinen)
361        {
362            sade.Destroy();
363
364            if (toinen.Tag.ToString() == "vihollinen") 
365            {
366                ((Alus)toinen).TakeHit(5);
367                if (toinen.IsDestroyed()) score.Value++;
368            }
369        }
370
371        void MissileOsuu(PhysicsObject missile, PhysicsObject toinen)
372        {
373            if (toinen != pelaajaAlus) missile.Destroy();
374
375            if (toinen.Tag.ToString() == "vihollinen")
376            {
377                ((Alus)toinen).TakeHit(20);
378                if (toinen.IsDestroyed()) score.Value++;
379            }
380        }
381        #endregion
382    }
383
384    public class AikaTapahtuma 
385    {
386        public int Aika;
387        public Timer.TriggerHandler Tapahtuma;
388        private Vector lahtopaikka;
389
390        public Vector Lahtopaikka
391        {
392            get{ return lahtopaikka; }
393        }
394
395        public AikaTapahtuma(int aika, Timer.TriggerHandler tapahtuma, double x, double y)
396        {
397            this.Aika = aika;
398            this.Tapahtuma = tapahtuma;
399            this.lahtopaikka = new Vector(x, y);
400        }
401    }
402}
Note: See TracBrowser for help on using the repository browser.