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

Revision 776, 10.3 KB checked in by hniemi, 11 years ago (diff)

Liikkumista parannettu, lisätty ampuminen

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