source: 2010/31/eelaeepu/space defense 1.0/Peli.cs @ 1635

Revision 1635, 15.5 KB checked in by eelaeepu, 9 years ago (diff)
Line 
1using System;
2using Jypeli;
3using Jypeli.Widgets;
4using Jypeli.Assets;
5using System.Collections.Generic;
6using Physics2DDotNet.Ignorers;
7
8public class Avaruuspeli : PhysicsGame
9{
10    PhysicsObject alus;
11    List<Label> valikonKohdat;
12    List<Weapon> aseValikko;
13    List<Weapon> vihollistenaseet = new List<Weapon>();
14    List<PhysicsObject> viholliset = new List<PhysicsObject>();
15    int valittuAse;
16    Weapon aseKaytossa;
17    ObjectIgnorer ammusIgnorer = new ObjectIgnorer();
18    double aluksennopeus = 200;
19
20    protected override void Begin()
21    {
22
23
24        Valikko();
25
26
27        MessageDisplay.TextColor = Color.White;
28    }
29
30    void LuoKentta()
31    {
32        Level.BackgroundColor = Color.White;
33        Level.CreateBorders(0.2, false);
34        Mouse.IsCursorVisible = true;
35        for (int a = 0; a < 5; a++)
36        {
37            LuoVihollisAlukset(RandomGen.NextDouble(Level.Left, Level.Right), (RandomGen.NextDouble(Level.Bottom, Level.Top)));
38        }
39
40        Timer ajastin = new Timer();
41        ajastin.Interval = 0.1;
42        ajastin.Trigger += VihollisAlusAmpuu;
43        ajastin.Start();
44
45
46    }
47
48    void LuoAlus()
49    {
50        alus = new PhysicsObject(40, 50);
51        alus.Image = LoadImage("alus2");
52        luoaseet();
53        Add(alus);
54    }
55
56    void AsetaOhjaimet()
57    {
58        Mouse.Listen(MouseButton.Left, ButtonState.Down, AmmuAseella, "Ammu aseella.");
59        Keyboard.Listen(Key.F1, ButtonState.Pressed, ShowControlHelp, "Näytä ohjeet");
60        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Exit, "Poistu");
61        Keyboard.Listen(Key.LeftShift, ButtonState.Pressed, VaihdaAse, "VaihtaaAseen");
62
63        Keyboard.Listen(Key.D, ButtonState.Pressed, LiikutaAlusta, "liikuta alusta oikeaan", alus, new Vector(aluksennopeus, 0.0));
64        Keyboard.Listen(Key.A, ButtonState.Pressed, LiikutaAlusta, "liikuta alusta vasenmpaan", alus, new Vector(-aluksennopeus, 0.0));
65        Keyboard.Listen(Key.S, ButtonState.Pressed, LiikutaAlusta, "liikuta alusta alas", alus, new Vector(0.0, -aluksennopeus));
66        Keyboard.Listen(Key.W, ButtonState.Pressed, LiikutaAlusta, "Liikuta alusta ylös.", alus, new Vector(0.0, aluksennopeus));
67    }
68
69    void KaannaAlusta(PhysicsObject alus, double kaantoNopeus)
70    {
71        alus.AngularVelocity += kaantoNopeus;
72    }
73
74    void LiikutaAlusta(PhysicsObject alus, Vector nopeus)
75    {
76        Vector impulssi = nopeus;
77        alus.Hit(impulssi);
78    }
79
80    void Valikko()
81    {
82        ClearAll();
83        valikonKohdat = new List<Label>();
84
85        Label kohta1 = new Label("Aloita uusi peli");
86        kohta1.Position = new Vector(0, 40);
87        valikonKohdat.Add(kohta1);
88
89        Label kohta2 = new Label("Lopeta");
90        kohta2.Position = new Vector(0, -40);
91        valikonKohdat.Add(kohta2);
92
93        foreach (Label valikonKohta in valikonKohdat)
94        {
95            Add(valikonKohta);
96        }
97
98        Mouse.ListenOn(kohta1, MouseButton.Left, ButtonState.Pressed, AloitaPeli, null);
99        Mouse.ListenOn(kohta2, MouseButton.Left, ButtonState.Pressed, Lopeta, null);
100
101        Mouse.IsCursorVisible = true;
102        Mouse.ListenMovement(1.0, ValikossaLiikkuminen, null);
103        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Lopeta, "");
104
105    }
106
107    void AloitaPeli()
108    {
109        ClearAll();
110        LuoKentta();
111        Camera.ZoomToLevel();
112        LuoAlus();
113        AsetaOhjaimet();
114        Mouse.ListenMovement(0.1, KuunteleLiiketta, null);
115        //Keyboard.Listen(Key.Escape, ButtonState.Pressed, Valikko, "Palaa valikkoon");
116    }
117
118    void ValikossaLiikkuminen(AnalogState hiirenTila)
119    {
120        foreach (Label kohta in valikonKohdat)
121        {
122            if (Mouse.IsCursorOn(kohta))
123            {
124                kohta.TextColor = Color.Red;
125            }
126            else
127            {
128                kohta.TextColor = Color.Black;
129            }
130
131        }
132    }
133
134    void Lopeta()
135    {
136        Exit();
137    }
138
139    void luoaseet()
140    {
141        aseValikko = new List<Weapon>();
142        Cannon tykki = new Cannon(50, 10);
143        tykki.Power.Value = 10000;
144        tykki.IsVisible = false;
145        tykki.Tag = "tykki";
146        tykki.CannonBallCollision = AmmusOsuu;
147        tykki.Angle = alus.Angle - Angle.Degrees(90);
148        alus.Add(tykki);
149
150        AssaultRifle rynnakkoKivaari = new AssaultRifle(60, 20);
151        rynnakkoKivaari.Angle = alus.Angle - Angle.Degrees(90);
152        rynnakkoKivaari.BulletCollision = AmmusOsuu;
153        rynnakkoKivaari.IsVisible = false;
154        PlasmaCannon plasmaTykki = new PlasmaCannon(60, 20);
155        plasmaTykki.Angle = alus.Angle - Angle.Degrees(90);
156        plasmaTykki.PlasmaParticleCollision = AmmusOsuu;
157        plasmaTykki.IsVisible = false;
158        LaserGun laserAse = new LaserGun(60, 20);
159        laserAse.Angle = alus.Angle - Angle.Degrees(90);
160        laserAse.LaserCollision = AmmusOsuu;
161        laserAse.IsVisible = false;
162
163        aseValikko.Add(rynnakkoKivaari);
164        aseValikko.Add(plasmaTykki);
165        aseValikko.Add(laserAse);
166        aseValikko.Add(tykki);
167        aseKaytossa = tykki;
168        valittuAse = 3;
169        //Add(tykki);
170    }
171
172    void AmmusOsuu(PhysicsObject ammus, PhysicsObject kohde)
173    {
174        if (kohde == alus)
175            return;
176        if (kohde.Tag.ToString() == "ammus")
177        {
178            kohde.Destroy();
179        }
180        ammus.Destroy();
181    }
182
183    void VaihdaAse()
184    {
185        int edellinenAse = valittuAse;
186        valittuAse++;
187        if (valittuAse >= aseValikko.Count)
188            valittuAse = 0;
189        alus.Remove(aseValikko[edellinenAse]);
190        Remove(alus);
191        alus.Add(aseValikko[valittuAse]);
192        aseKaytossa = aseValikko[valittuAse];
193
194        Timer alusTakaisin = new Timer();
195        alusTakaisin.Interval = 0;
196        alusTakaisin.Tag = alus;
197        alusTakaisin.Start(1);
198        alusTakaisin.Trigger += AlusTakaisinAseenVaihdonJalkeen;
199    }
200
201    void AlusTakaisinAseenVaihdonJalkeen(Timer ajastin)
202    {
203        PhysicsObject alus = (PhysicsObject)ajastin.Tag;
204        Add(alus);
205    }
206
207    void KuunteleLiiketta(AnalogState hiirenTila)
208    {
209
210
211    }
212    protected override void Update(Time time)
213    {
214
215        base.Update(time);
216
217        if (alus != null)
218        {
219            Vector suunta = Mouse.PositionOnWorld - alus.Position;
220            alus.Angle = suunta.Angle + Angle.Degrees(90);
221        }
222        foreach (PhysicsObject vihu in viholliset)
223        {
224            //vihu.Angle = Angle.Degrees(Math.Atan2(alus.Y - vihu.Y, alus.X - vihu.X) * 180 / Math.PI + 90);
225            Vector suunta = alus.Position - vihu.Position;
226            vihu.Angle = suunta.Angle + Angle.Degrees(270);
227            //vihu.Angle = suunta.Angle;
228        }
229
230    }
231    void AmmuAseella()
232    {
233        PhysicsObject ammus = aseKaytossa.Shoot();
234
235        if (ammus != null)
236        {
237            ammus.Size *= 3;
238            ammus.Tag = "ammus";
239            if (aseKaytossa.Tag.ToString() == "tykki")
240            {
241                Cannon tykki = (Cannon)aseKaytossa;
242                tykki.Power.Value += 10000;
243            }
244        }
245    }
246    void LuoVihollisAlukset(double aluksenx, double alukseny)
247    {
248        PhysicsObject vihollisalus1 = new PhysicsObject(50, 40);
249        vihollisalus1.CollisionIgnorer = ammusIgnorer;
250        int aluksenTyyppi = RandomGen.NextInt(10);
251        switch (aluksenTyyppi)
252        {
253            case 0:
254                {
255                    vihollisalus1.Image = LoadImage("vihollis alus1");
256                    LaserGun laserase = new LaserGun(20, 10);
257                    laserase.LaserCollision = LaserOsuu;
258                    laserase.IsVisible = false;
259                    vihollisalus1.Add(laserase);
260                    laserase.Angle = Angle.Degrees(90);
261                    laserase.IsVisible = false;
262                    vihollistenaseet.Add(laserase);
263                    viholliset.Add(vihollisalus1);
264
265
266                    break;
267                }
268            case 1:
269                {
270                    vihollisalus1.Image = LoadImage("vihollis alus2");
271                    LaserGun laserase = new LaserGun(20, 10);
272                    laserase.LaserCollision = LaserOsuu;
273                    laserase.IsVisible = false;
274                    vihollisalus1.Add(laserase);
275                    laserase.Angle = Angle.Degrees(90);
276                    vihollistenaseet.Add(laserase);
277                    viholliset.Add(vihollisalus1);
278                    break;
279                }
280            case 2:
281                {
282                    vihollisalus1.Image = LoadImage("vihollis alus5");
283                    AssaultRifle pyssy = new AssaultRifle(40, 20);
284                    pyssy.BulletCollision = RifleOsuu;
285                    pyssy.TimeBetweenUse = new TimeSpan(4000000);
286                    pyssy.IsVisible = false;
287                    vihollisalus1.Add(pyssy);
288                    pyssy.Angle = Angle.Degrees(90);
289                    vihollistenaseet.Add(pyssy);
290                    viholliset.Add(vihollisalus1);
291                    break;
292                }
293
294            case 3:
295                {
296                    vihollisalus1.Image = LoadImage("vihollis alus6");
297                    AssaultRifle pyssy = new AssaultRifle(40, 20);
298                    pyssy.BulletCollision = RifleOsuu;
299                    pyssy.TimeBetweenUse = new TimeSpan(2000000);
300                    pyssy.IsVisible = false;
301                    vihollisalus1.Add(pyssy);
302                    pyssy.Angle = Angle.Degrees(90);
303                    vihollistenaseet.Add(pyssy);
304                    viholliset.Add(vihollisalus1);
305                    break;
306                }
307            case 4:
308                {
309                    vihollisalus1.Image = LoadImage("vihollis alus8");
310                    AssaultRifle pyssy = new AssaultRifle(40, 20);
311                    pyssy.BulletCollision = RifleOsuu;
312                    pyssy.TimeBetweenUse = new TimeSpan(2000000);
313                    pyssy.IsVisible = false;
314                    vihollisalus1.Add(pyssy);
315                    pyssy.Angle = Angle.Degrees(90);
316                    vihollistenaseet.Add(pyssy);
317                    viholliset.Add(vihollisalus1);
318                    break;
319                }
320            case 5:
321                {
322                    vihollisalus1.Image = LoadImage("vihollis alus9");
323                    Cannon tykki = new Cannon(20, 10);
324                    tykki.IsVisible = false;
325                    vihollisalus1.Add(tykki);
326                    tykki.Angle = Angle.Degrees(90);
327                    tykki.TimeBetweenUse = new TimeSpan(30000000);
328                    vihollistenaseet.Add(tykki);
329                    viholliset.Add(vihollisalus1);
330                    tykki.Power.Value = 100000;
331                    tykki.CannonBallCollision = KuulaOsuu;
332                    break;
333
334                }
335            case 6:
336                {
337                    vihollisalus1.Image = LoadImage("vihollis alus10");
338                    Cannon tykki = new Cannon(20, 10);
339                    vihollisalus1.Add(tykki);
340                    tykki.TimeBetweenUse = new TimeSpan(30000000);
341                    tykki.IsVisible = false;
342                    tykki.Angle = Angle.Degrees(90);
343                    viholliset.Add(vihollisalus1);
344                    vihollistenaseet.Add(tykki);
345                    tykki.Power.Value = 100000;
346                    tykki.CannonBallCollision = KuulaOsuu;
347                    break;
348                }
349            case 7:
350                {
351                    vihollisalus1.Image = LoadImage("vihollis alus12");
352                    Cannon tykki = new Cannon(20, 10);
353                    vihollisalus1.Add(tykki);
354                    tykki.TimeBetweenUse = new TimeSpan(30000000);
355                    tykki.IsVisible = false;
356                    tykki.Angle = Angle.Degrees(90);
357                    viholliset.Add(vihollisalus1);
358                    vihollistenaseet.Add(tykki);
359                    tykki.Power.Value = 100000;
360                    tykki.CannonBallCollision = KuulaOsuu;
361                    break;
362                }
363
364            case 8:
365                {
366                    vihollisalus1.Image = LoadImage("vihollis alus 13");
367                    PlasmaCannon plasmaTykki = new PlasmaCannon(100, 50);
368                    vihollisalus1.Add(plasmaTykki);
369                    plasmaTykki.TimeBetweenUse = new TimeSpan(3000000);
370                    plasmaTykki.IsVisible = false;
371                    plasmaTykki.Angle = Angle.Degrees(90);
372                    vihollistenaseet.Add(plasmaTykki);
373                    viholliset.Add(vihollisalus1);
374                    break;
375                }
376            case 9:
377                {
378                    vihollisalus1.Image = LoadImage("vihollis alus 16");
379                    PlasmaCannon plasmaTykki = new PlasmaCannon(100, 50);
380                    plasmaTykki.TimeBetweenUse = new TimeSpan(3000000);
381                    vihollisalus1.Add(plasmaTykki);
382                    plasmaTykki.IsVisible = false;
383                    plasmaTykki.Angle = Angle.Degrees(90);
384                    vihollistenaseet.Add(plasmaTykki);
385                    viholliset.Add(vihollisalus1);
386                    break;
387                }
388            default:
389                {
390                    vihollisalus1.Image = LoadImage("vihollis alus9");
391                    break;
392                }
393        }
394        vihollisalus1.X = aluksenx;
395        vihollisalus1.Y = alukseny;
396
397
398        Add(vihollisalus1);
399
400    }
401
402    void LaserOsuu(PhysicsObject ammus, PhysicsObject kohde)
403    {
404        if (kohde.Tag.ToString() == "ammus")
405            return;
406        ammus.Destroy();
407    }
408
409    void RifleOsuu(PhysicsObject ammus, PhysicsObject kohde)
410    {
411        if (kohde.Tag.ToString() == "ammus")
412            return;
413        ammus.Destroy();
414    }
415
416    void plasmaTykkiOsuu(PhysicsObject ammus, PhysicsObject kohde)
417    {
418        if (kohde.Tag.ToString() == "ammus")
419            return;
420        ammus.Destroy();
421    }
422
423    void VihollisAlusAmpuu(Timer sender)
424    {
425        for (int i = 0; i < vihollistenaseet.Count; i++)
426        {
427            Weapon ase = vihollistenaseet[i];
428            PhysicsObject vihollinen = viholliset[i];
429
430            //Vector suunta = alus.Position - ase.AbsolutePosition;
431            //vihollinen.Angle = suunta.Angle + Angle.Degrees(270);
432            if (ase is AssaultRifle)
433            {
434                PhysicsObject a = ase.Shoot();
435                if (a != null)
436                {
437                    a.Tag = "ammus";
438                    a.CollisionIgnorer = ammusIgnorer;
439                    a.Size = new Vector(15, 5);
440                }
441                continue;
442            }
443            if (ase is Cannon)
444            {
445                (ase as Cannon).Power.Value = 10000;
446            }
447            PhysicsObject ammus = ase.Shoot();
448            if (ammus != null)
449            {
450                ammus.CollisionIgnorer = ammusIgnorer;
451                ammus.Tag = "ammus";
452                if (ase is PlasmaCannon)
453                {
454                    ammus.Size *= 5;
455                }
456
457            }
458        }
459
460    }
461
462    void KuulaOsuu(PhysicsObject kuula, PhysicsObject toinen)
463    {
464        if (toinen.Tag.ToString() == "ammus")
465            return;
466        kuula.Destroy();
467        Explosion rajahdys = new Explosion(40);
468        rajahdys.Position = kuula.Position;
469        Add(rajahdys);
470    }
471
472
473}
474
Note: See TracBrowser for help on using the repository browser.