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

Revision 779, 13.1 KB checked in by hniemi, 10 years ago (diff)

Viholliset tulevat satunnaisesti.

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        private Alus pelaajaAlus;
13        private PhysicsObject exitZone;
14
15        private const double nopeus = 300;
16        private Vector nopeusPysty = new Vector(0,nopeus);
17        private Vector nopeusVaaka = new Vector(nopeus, 0);
18
19        private PhysicsObject vasenLaita;
20        private PhysicsObject oikeaLaita;
21        private PhysicsObject pohja;
22        private PhysicsObject katto;
23
24        private const int VIHOLLISKUVIA = 1;
25
26        private int kentannro = 0;
27        private IntMeter score = new IntMeter(0);
28
29        protected override void Begin()
30        {
31            LataaKentta(kentannro);
32        }
33
34        /// <summary>
35        /// Tulee lataamaan numeroa vastaavan kentän
36        /// Kentän tiedot siis tallennettaisiin level1.txt, level2.txt...
37        /// </summary>
38        /// <param name="kentanNumero">Ei vielä käytössä</param>
39        void LataaKentta(int kentanNumero)
40        {
41            ClearAll();
42            Level.Width = 600;
43            Level.Height = 800;
44
45            Camera.Move(new Vector(250, 0));
46
47            //Laidat
48            vasenLaita = Level.CreateLeftBorder();
49            oikeaLaita = Level.CreateRightBorder();
50            pohja = Level.CreateBottomBorder();
51            katto = Level.CreateTopBorder();
52
53            //Exit-alueen tekeminen.
54            exitZone = PhysicsObject.CreateStaticObject(Level.Width, 200);
55            exitZone.Position = new Vector(Level.Center.X, Level.Bottom - exitZone.Size.Y/2 - 5);
56            Add(exitZone);
57
58
59            LuoPelaaja();
60            LataaKontrollit(pelaajaAlus);
61            //LataaTausta(kentanNumero);
62            LataaViholliset();
63            LataaHUD();
64        }
65
66        /// <summary>
67        /// Luo näytölle tarvittavat mittarit
68        /// </summary>
69        void LataaHUD()
70        {
71            ValueDisplay hpNaytto = new ValueDisplay();
72            hpNaytto.BindTo(pelaajaAlus.HpMeter);
73            Add(hpNaytto);
74            hpNaytto.Position = new Vector(Level.Right + 40, Level.Top - 80);
75            hpNaytto.Text = "HP: ";
76
77            ValueDisplay scoreNaytto = new ValueDisplay();
78            scoreNaytto.BindTo(score);
79            Add(scoreNaytto);
80            scoreNaytto.Position = new Vector(Level.Right + 40, Level.Top - 100);
81            scoreNaytto.Text = "SCORE: ";
82
83        }
84
85        void LuoPelaaja()
86        {
87            pelaajaAlus = new Alus(40, 50, 10);
88            pelaajaAlus.Shape = Shapes.Triangle;
89            pelaajaAlus.Image = LoadImage("pelaajaAlus");
90           
91            pelaajaAlus.Angle += Angle.Degrees(90);
92
93            pelaajaAlus.IgnoresCollisionResponse = false;
94            pelaajaAlus.Y = Level.Bottom + 40;
95            pelaajaAlus.KineticFriction = 1.0;
96            pelaajaAlus.Mass = 100000;
97
98            LaserGun plasmatykki = new LaserGun(30, 10);
99            plasmatykki.Y = +11;
100            plasmatykki.X = +5;
101           
102            plasmatykki.LaserCollision = LaserSadeOsuu;
103            pelaajaAlus.SetWeapon(plasmatykki);
104
105            AddCollisionHandler(pelaajaAlus, PelaajaTormaa);
106            Add(pelaajaAlus);
107        }
108
109        /// <summary>
110        /// Asettaa kontrollit ohjaamaan haluttua alusta
111        /// </summary>
112        /// <param name="pelaaja">Alus, jota halutaan ohjata</param>
113        void LataaKontrollit(Alus pelaaja)
114        {
115            Keyboard.Listen(Key.Escape, ButtonState.Pressed, Exit, "Lopettaa pelin");
116            Keyboard.Listen(Key.Up, ButtonState.Down, Liikuta, "Liikuttaa alusta ylös", pelaaja, nopeusPysty);
117            Keyboard.Listen(Key.Up, ButtonState.Released, pelaaja.StopVertical, null);
118            Keyboard.Listen(Key.Down, ButtonState.Down, Liikuta, "Liikuttaa alusta alas", pelaaja, -nopeusPysty);
119            Keyboard.Listen(Key.Down, ButtonState.Released, pelaaja.StopVertical, null);
120            Keyboard.Listen(Key.Left, ButtonState.Down, Liikuta, "Liikuttaa alusta vasemmalle", pelaaja, -nopeusVaaka);
121            Keyboard.Listen(Key.Left, ButtonState.Released, pelaaja.StopHorizontal, null);
122            Keyboard.Listen(Key.Right, ButtonState.Down, Liikuta, "Liikuttaa alusta oikealle", pelaaja, nopeusVaaka);
123            Keyboard.Listen(Key.Right, ButtonState.Released, pelaaja.StopHorizontal, null);
124            Keyboard.Listen(Key.LeftControl, ButtonState.Pressed, Ammu, "Lopettaa pelin", pelaajaAlus);
125        }
126
127        /// <summary>
128        /// Liikuttaa alusta haluttuun suuntaan
129        /// </summary>
130        /// <param name="alus">Liikutettava alus</param>
131        /// <param name="suunta">Liikutettava suunta</param>
132        void Liikuta(Alus alus, Vector suunta)
133        {
134            if (-nopeus < alus.Velocity.Y && alus.Velocity.Y < nopeus && suunta.Y != 0)
135            {
136                alus.Velocity += suunta;
137            }
138            if (-nopeus < alus.Velocity.X && alus.Velocity.X < nopeus && suunta.X != 0)
139            {
140                alus.Velocity += suunta;
141            }
142        }
143
144        /// <summary>
145        /// Ampuu aluksella
146        /// </summary>
147        /// <param name="alus">Alus joka ampuu</param>
148        void Ammu(Alus alus) 
149        {
150            alus.Shoot();
151        }
152
153        void LataaViholliset()
154        {
155            List<AikaTapahtuma> vihollistenTuloajat = new List<AikaTapahtuma>();
156            vihollistenTuloajat.Add(new AikaTapahtuma(2, LahetaSatunnainenVihollislaivue, Level.Center.X - 80, Level.Top + 20 ) );
157            vihollistenTuloajat.Add(new AikaTapahtuma(2, LahetaSatunnainenVihollislaivue, Level.Center.X, Level.Top + 20));
158            vihollistenTuloajat.Add(new AikaTapahtuma(9, LahetaSatunnainenVihollislaivue, Level.Center.X + 80, Level.Top + 20));
159            vihollistenTuloajat.Add(new AikaTapahtuma(9, LahetaSatunnainenVihollislaivue, Level.Center.X - 80, Level.Top + 20));
160            vihollistenTuloajat.Add(new AikaTapahtuma(20, LahetaSatunnainenVihollislaivue, Level.Center.X, Level.Top + 20));
161            vihollistenTuloajat.Add(new AikaTapahtuma(20, LahetaSatunnainenVihollislaivue, Level.Center.X + 80, Level.Top + 20));
162            vihollistenTuloajat.Add(new AikaTapahtuma(15, LahetaSatunnainenVihollislaivue, Level.Center.X - 80, Level.Top + 20));
163            vihollistenTuloajat.Add(new AikaTapahtuma(15, LahetaSatunnainenVihollislaivue, Level.Center.X, Level.Top + 20));
164            vihollistenTuloajat.Add(new AikaTapahtuma(40, LahetaSatunnainenVihollislaivue, Level.Center.X + 80, Level.Top + 20));
165
166            foreach (AikaTapahtuma tapahtuma in vihollistenTuloajat)
167            {
168                Timer ajastin = new Timer();
169                ajastin.Tag = tapahtuma.Lahtopaikka;
170                ajastin.LimitTimes(1);
171                ajastin.Interval = tapahtuma.Aika;
172                ajastin.Trigger += tapahtuma.Tapahtuma;
173                Add(ajastin);
174                ajastin.Start();
175            }
176        }
177
178        /// <summary>
179        /// Luo alukset ja lähettää ne matkaan
180        /// </summary>
181        /// <param name="sender">Timerin tagissa on lähtökoordinaatti</param>
182        /// <param name="lahetysX">X-koordinaatti, josta muodostelma lähtee</param>
183        void LahetaPerusvihollinen(Timer sender)
184        {
185            List<Alus> alukset = new List<Alus>();
186            Image vihollisenKuva = LoadImage("vihollinen" + 1);
187
188            for (int i = 0; i < 10; i++)
189            {
190                alukset.Add(LuoVihollinen(vihollisenKuva, 1));
191                Add(alukset[i]);
192                Angle alas = new Angle();
193                alas.Degree = 270;
194                alukset[i].Angle = alas;
195                AddCollisionHandler(alukset[i], VihollinenTormaa);
196            }
197
198            double lahtoX = ((Vector)sender.Tag).X;
199            double lahtoY = ((Vector)sender.Tag).Y;
200
201            List<Vector> reitti = new List<Vector>();
202            reitti.Add(new Vector(lahtoX, lahtoY));
203            reitti.Add(new Vector(-40 +lahtoX, 0));
204            reitti.Add(new Vector(100 + lahtoX, 0));
205            reitti.Add(new Vector(Level.Center.X + lahtoX, Level.Bottom - alukset[0].Size.Y / 2 - 20));
206
207            Muodostelma muodostelma = new Muodostelma(alukset, reitti, LuoLahettaja());
208            muodostelma.MovingSpeed = 100;
209            muodostelma.Start();
210        }
211
212        void LahetaSatunnainenVihollislaivue(Timer sender)
213        {
214            List<Alus> alukset = new List<Alus>();
215            Image vihollisenKuva = LoadImage("vihollinen" + RandomGen.NextInt(1,VIHOLLISKUVIA));
216
217            for (int i = 0; i < 10; i++)
218            {
219                alukset.Add(LuoVihollinen(vihollisenKuva, 1));
220                Add(alukset[i]);
221                Angle alas = new Angle();
222                alas.Degree = 270;
223                alukset[i].Angle = alas;
224                AddCollisionHandler(alukset[i], VihollinenTormaa);
225            }
226
227            List<Vector> reitti = ArvoReitti(RandomGen.NextInt(0,5));
228            Muodostelma muodostelma = new Muodostelma(alukset, reitti, LuoLahettaja());
229            muodostelma.MovingSpeed = 100;
230            muodostelma.Start();
231        }
232
233        /// <summary>
234        /// Arpoo koneelle reitin, joka lähteee ylhäältä ja päätyy alas
235        /// </summary>
236        /// <param name="valipisteet">Välipisteiden määrä, 0 -></param>
237        /// <returns></returns>
238        List<Vector> ArvoReitti(int valipisteet)
239        {
240            List<Vector> reitti = new List<Vector>();
241           
242            reitti.Add(new Vector(RandomGen.NextDouble(Level.Left + 30, Level.Right - 30),Level.Top + 35));
243
244            for (int i = 0; i < valipisteet; i++)
245            {
246                reitti.Add(new Vector(RandomGen.NextDouble(Level.Left + 30, Level.Right - 30),
247                                     (RandomGen.NextDouble(Level.Bottom + 30, Level.Top - 100))));
248            }
249            reitti.Add(new Vector(RandomGen.NextDouble(Level.Left + 30, Level.Right - 30), Level.Bottom - 35));
250            return reitti;
251        }
252
253        Alus LuoVihollinen(Image kuva, int hp)
254        {
255            Alus vihollinen = new Alus(50, 50, hp);
256            vihollinen.Image = kuva;
257            vihollinen.Tag = "vihollinen";
258            return vihollinen;
259        }
260
261        /// <summary>
262        /// Pelaajan törmäyksen käsittelijä
263        ///
264        /// Katsoo myös, että pelaaja ei juutu seiniin
265        /// </summary>
266        /// <param name="tormaaja"></param>
267        /// <param name="kohde"></param>
268        void PelaajaTormaa(PhysicsObject tormaaja, PhysicsObject kohde)
269        {
270            if (kohde.Tag.ToString() == "vihollinen") 
271            {
272                ((Alus)tormaaja).TakeHit(5);
273                if (kohde is Alus) ((Alus)kohde).TakeHit(20);
274            }
275
276            if (kohde == vasenLaita)
277            {
278                tormaaja.X = Level.Left + tormaaja.Height / 2 + 1;
279                tormaaja.StopHorizontal();
280            }
281
282            if (kohde == oikeaLaita)
283            {
284                tormaaja.X = Level.Right - tormaaja.Height / 2 - 1;
285                tormaaja.StopHorizontal();
286            }
287            if (kohde == katto)
288            {
289                tormaaja.Y = Level.Top - tormaaja.Width / 2 - 1;
290                tormaaja.StopVertical();
291            }
292            if (kohde == pohja)
293            {
294                tormaaja.Y = Level.Bottom + tormaaja.Width/2 +1;
295                tormaaja.StopVertical();
296            }
297
298        }
299
300        /// <summary>
301        /// Mitä tapahtuu, kun vihollinen tulee ns. poistumisalueelle
302        /// </summary>
303        /// <param name="tormaaja"></param>
304        /// <param name="kohde"></param>
305        void VihollinenTormaa(PhysicsObject tormaaja, PhysicsObject kohde)
306        {
307            if (kohde == exitZone) tormaaja.Destroy();
308           
309        }
310
311        void LaserSadeOsuu(PhysicsObject sade, PhysicsObject toinen)
312        {
313            if (toinen.Tag.ToString() == "vihollinen") 
314            {
315                ((Alus)toinen).TakeHit(5);
316                if (toinen.IsDestroyed()) score.Value++;
317            }
318        }
319
320        /// <summary>
321        /// Luo ajastimen, joka on triggeröi sekunnin välein.
322        /// Lisää myös ajastimen, joten voidaan kutsua suoraan Muodostelman muodostajassa.
323        /// </summary>
324        /// <returns></returns>
325        Timer LuoLahettaja()
326        {
327            Timer ajastin = new Timer();
328            ajastin.Interval = 1;
329            Add(ajastin);
330            return ajastin;
331        }
332
333    }
334
335    public class AikaTapahtuma 
336    {
337        public int Aika;
338        public Timer.TriggerHandler Tapahtuma;
339        private Vector lahtopaikka;
340
341        public Vector Lahtopaikka
342        {
343            get{ return lahtopaikka; }
344        }
345
346        public AikaTapahtuma(int aika, Timer.TriggerHandler tapahtuma, double x, double y)
347        {
348            this.Aika = aika;
349            this.Tapahtuma = tapahtuma;
350            this.lahtopaikka = new Vector(x, y);
351        }
352    }
353}
Note: See TracBrowser for help on using the repository browser.