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

Revision 1654, 20.5 KB checked in by eelaeepu, 10 years ago (diff)
Line 
1using System;
2using Jypeli;
3using Jypeli.Widgets;
4using Jypeli.Assets;
5using Jypeli.Effects;
6using System.Collections.Generic;
7using Physics2DDotNet.Ignorers;
8
9public class Avaruuspeli : PhysicsGame
10{
11    Alus alus;
12    DoubleMeter pelaajaHpmittari;
13    List<Label> valikonKohdat;
14    List<Weapon> aseValikko;
15    List<Weapon> vihollistenaseet = new List<Weapon>();
16    List<PhysicsObject> viholliset = new List<PhysicsObject>();
17    int valittuAse;
18    Weapon aseKaytossa;
19    ObjectIgnorer ammusIgnorer = new ObjectIgnorer();
20    double aluksennopeus = 200;
21
22
23    Image efekti1 = LoadImage("Red");
24    Image efekti2 = LoadImage("Yellow");
25    Image savu = LoadImage("smoke");
26    ExplosionSystem rajahdys, savut;
27
28    Label pistenaytto;
29    IntMeter pistelaskuri = new IntMeter(0);
30
31    HighScoreList topLista;
32
33    protected override void Begin()
34    {
35        Valikko();
36        MessageDisplay.TextColor = Color.White;
37    }
38
39    void LuoKentta()
40    {
41        Level.BackgroundColor = Color.White;
42        Level.CreateBorders(0.2, false);
43        Mouse.IsCursorVisible = true;
44        AlustaEfektit();
45        for (int a = 0; a < 5; a++)
46        {
47            LuoVihollisAlukset(RandomGen.NextDouble(Level.Left, Level.Right), (RandomGen.NextDouble(Level.Bottom, Level.Top)));
48        }
49
50        Timer ajastin = new Timer();
51        ajastin.Interval = 0.1;
52        ajastin.Trigger += VihollisAlusAmpuu;
53        ajastin.Start();
54        pistenaytto = new Label();
55        pistenaytto.BindTo(pistelaskuri);
56        pistenaytto.X = Screen.Right - 100;
57        pistenaytto.Y = Screen.Top - 100;
58        Add(pistenaytto);
59
60
61    }
62
63    void AlustaEfektit()
64    {
65        rajahdys = new ExplosionSystem(efekti1, efekti2, 300, false);
66        savut = new ExplosionSystem(savu, 300, false);
67        savut.MaxLifetime = 2.0;
68        savut.MinLifetime = 1.3;
69        savut.MinVelocity = 90;
70        savut.MaxVelocity = 200;
71        Add(savut);
72        Add(rajahdys);
73    }
74
75    void LuoAlus(double hp)
76    {
77        alus = new Alus(40, 50);
78        alus.AsetaHitpoints(hp);
79        alus.Tag = "omaalus";
80        alus.Image = LoadImage("alus2");
81
82        pelaajaHpmittari = new DoubleMeter(alus.AnnaHitPoints());
83        pelaajaHpmittari.MaxValue = alus.AnnaHitPoints();
84        BarGauge pelaajaHp = new BarGauge(30, 200);
85        pelaajaHp.BindTo(pelaajaHpmittari);
86        pelaajaHp.BarColor = Color.Red;
87        pelaajaHp.BorderColor = Color.Black;
88        pelaajaHp.Angle = Angle.Degrees(270);
89        pelaajaHp.Position = new Vector(0, Screen.Top - 40);
90        Add(pelaajaHp);
91
92        luoaseet();
93        Add(alus);
94    }
95
96    void AsetaOhjaimet()
97    {
98        Mouse.Listen(MouseButton.Left, ButtonState.Down, AmmuAseella, "Ammu aseella.");
99        Keyboard.Listen(Key.F1, ButtonState.Pressed, ShowControlHelp, "Näytä ohjeet");
100        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Exit, "Poistu");
101        Keyboard.Listen(Key.LeftShift, ButtonState.Pressed, VaihdaAse, "VaihtaaAseen");
102
103        Keyboard.Listen(Key.D, ButtonState.Pressed, LiikutaAlusta, "liikuta alusta oikeaan", alus, new Vector(aluksennopeus, 0.0));
104        Keyboard.Listen(Key.A, ButtonState.Pressed, LiikutaAlusta, "liikuta alusta vasenmpaan", alus, new Vector(-aluksennopeus, 0.0));
105        Keyboard.Listen(Key.S, ButtonState.Pressed, LiikutaAlusta, "liikuta alusta alas", alus, new Vector(0.0, -aluksennopeus));
106        Keyboard.Listen(Key.W, ButtonState.Pressed, LiikutaAlusta, "Liikuta alusta ylös.", alus, new Vector(0.0, aluksennopeus));
107    }
108
109    void KaannaAlusta(PhysicsObject alus, double kaantoNopeus)
110    {
111        alus.AngularVelocity += kaantoNopeus;
112    }
113
114    void LiikutaAlusta(PhysicsObject alus, Vector nopeus)
115    {
116        Vector impulssi = nopeus;
117        alus.Hit(impulssi);
118    }
119
120    void Valikko()
121    {
122        ClearAll();
123        valikonKohdat = new List<Label>();
124
125        Label kohta1 = new Label("Aloita uusi peli (Helppo)");
126        kohta1.Position = new Vector(0, 80);
127        valikonKohdat.Add(kohta1);
128
129        Label kohta2 = new Label("Aloita uusi peli (Vaikea)");
130        kohta2.Position = new Vector(0, 40);
131        valikonKohdat.Add(kohta2);
132
133        Label kohta3 = new Label("Aloita uusi peli (Mahdoton)");
134        kohta3.Position = new Vector(0, 0);
135        valikonKohdat.Add(kohta3);
136
137        Label kohta4 = new Label("Lopeta");
138        kohta4.Position = new Vector(0, -40);
139        valikonKohdat.Add(kohta4);
140
141        foreach (Label valikonKohta in valikonKohdat)
142        {
143            Add(valikonKohta);
144        }
145
146        Mouse.ListenOn(kohta1, MouseButton.Left, ButtonState.Pressed, AloitaPeli, null, 1000.0);
147        Mouse.ListenOn(kohta2, MouseButton.Left, ButtonState.Pressed, AloitaPeli, null, 200.0);
148        Mouse.ListenOn(kohta3, MouseButton.Left, ButtonState.Pressed, AloitaPeli, null, 1.0);
149        Mouse.ListenOn(kohta4, MouseButton.Left, ButtonState.Pressed, Lopeta, null);
150
151        Mouse.IsCursorVisible = true;
152        Mouse.ListenMovement(1.0, ValikossaLiikkuminen, null);
153        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Lopeta, "");
154
155    }
156
157    void AloitaPeli(double vaikeusTaso)
158    {
159        ClearAll();
160        topLista = HighScoreList.LoadOrCreate("topten.dat", 10);
161        LuoKentta();
162        Camera.ZoomToLevel();
163        LuoAlus(vaikeusTaso);
164        AsetaOhjaimet();
165        Mouse.ListenMovement(0.1, KuunteleLiiketta, null);
166        //Keyboard.Listen(Key.Escape, ButtonState.Pressed, Valikko, "Palaa valikkoon");
167    }
168
169    void ValikossaLiikkuminen(AnalogState hiirenTila)
170    {
171        foreach (Label kohta in valikonKohdat)
172        {
173            if (Mouse.IsCursorOn(kohta))
174            {
175                kohta.TextColor = Color.Red;
176            }
177            else
178            {
179                kohta.TextColor = Color.Black;
180            }
181
182        }
183    }
184
185    void Lopeta()
186    {
187        Exit();
188    }
189
190    void luoaseet()
191    {
192        aseValikko = new List<Weapon>();
193        Cannon tykki = new Cannon(50, 10);
194        tykki.Power.Value = 10000;
195        tykki.IsVisible = false;
196        tykki.Tag = "tykki";
197        tykki.CannonBallCollision = AmmusOsuu;
198        tykki.Angle = alus.Angle - Angle.Degrees(90);
199        alus.Add(tykki);
200
201        AssaultRifle rynnakkoKivaari = new AssaultRifle(60, 20);
202        rynnakkoKivaari.Angle = alus.Angle - Angle.Degrees(90);
203        rynnakkoKivaari.Tag = "rk";
204        rynnakkoKivaari.BulletCollision = AmmusOsuu;
205        rynnakkoKivaari.IsVisible = false;
206        PlasmaCannon plasmaTykki = new PlasmaCannon(60, 20);
207        plasmaTykki.Angle = alus.Angle - Angle.Degrees(90);
208        plasmaTykki.PlasmaParticleCollision = AmmusOsuu;
209        plasmaTykki.Tag = "plasma";
210        plasmaTykki.IsVisible = false;
211        LaserGun laserAse = new LaserGun(60, 20);
212        laserAse.Angle = alus.Angle - Angle.Degrees(90);
213        laserAse.LaserCollision = AmmusOsuu;
214        laserAse.IsVisible = false;
215        laserAse.Tag = "laser";
216
217        aseValikko.Add(rynnakkoKivaari);
218        aseValikko.Add(plasmaTykki);
219        aseValikko.Add(laserAse);
220        aseValikko.Add(tykki);
221        aseKaytossa = tykki;
222        valittuAse = 3;
223        //Add(tykki);
224    }
225
226    void AmmusOsuu(PhysicsObject ammus, PhysicsObject kohde)
227    {
228        int damage = 0;
229        if (kohde == alus)
230            return;
231        if (kohde.Tag.ToString() == "vihu")
232        {
233            Alus k = (Alus)kohde;
234            if (aseKaytossa is Cannon)
235                damage = 10;
236            if (aseKaytossa is AssaultRifle)
237                damage = 2;
238            if (aseKaytossa is PlasmaCannon)
239                damage = 1;
240            if (aseKaytossa is LaserGun)
241                damage = 10;
242            pistelaskuri.Value += damage;
243
244            k.AsetaHitpoints(k.AnnaHitPoints() - damage);
245        }
246        if (kohde.Tag.ToString() == "ammus")
247        {
248            return;
249        }
250        ammus.Destroy();
251    }
252
253    void VaihdaAse()
254    {
255        int edellinenAse = valittuAse;
256        valittuAse++;
257        if (valittuAse >= aseValikko.Count)
258            valittuAse = 0;
259        alus.Remove(aseValikko[edellinenAse]);
260        Remove(alus);
261        alus.Add(aseValikko[valittuAse]);
262        aseKaytossa = aseValikko[valittuAse];
263
264        Timer alusTakaisin = new Timer();
265        alusTakaisin.Interval = 0;
266        alusTakaisin.Tag = alus;
267        alusTakaisin.Start(1);
268        alusTakaisin.Trigger += AlusTakaisinAseenVaihdonJalkeen;
269    }
270
271    void AlusTakaisinAseenVaihdonJalkeen(Timer ajastin)
272    {
273        PhysicsObject alus = (PhysicsObject)ajastin.Tag;
274        Add(alus);
275    }
276
277    void KuunteleLiiketta(AnalogState hiirenTila)
278    {
279
280
281    }
282    protected override void Update(Time time)
283    {
284
285        base.Update(time);
286
287        if (alus != null)
288        {
289            pelaajaHpmittari.Value = alus.AnnaHitPoints();
290            Vector suunta = Mouse.PositionOnWorld - alus.Position;
291            alus.Angle = suunta.Angle + Angle.Degrees(90);
292        }
293        foreach (PhysicsObject vihu in viholliset)
294        {
295            //vihu.Angle = Angle.Degrees(Math.Atan2(alus.Y - vihu.Y, alus.X - vihu.X) * 180 / Math.PI + 90);
296            Vector suunta = alus.Position - vihu.Position;
297            vihu.Angle = suunta.Angle + Angle.Degrees(270);
298            //vihu.Angle = suunta.Angle;
299        }
300
301    }
302    void AmmuAseella()
303    {
304        PhysicsObject ammus = aseKaytossa.Shoot();
305
306        if (ammus != null)
307        {
308            ammus.Size *= 3;
309            ammus.IgnoresCollisionResponse = true;
310            ammus.Tag = "ammus";
311            if (aseKaytossa.Tag.ToString() == "tykki")
312            {
313                Cannon tykki = (Cannon)aseKaytossa;
314                tykki.Power.Value += 10000;
315            }
316        }
317    }
318    void LuoVihollisAlukset(double aluksenx, double alukseny)
319    {
320        Alus vihollisalus1 = new Alus(50, 40);
321        vihollisalus1.CollisionIgnorer = ammusIgnorer;
322        vihollisalus1.AsetaHitpoints(10);
323        vihollisalus1.Tag = "vihu";
324        int aluksenTyyppi = RandomGen.NextInt(10);
325        switch (aluksenTyyppi)
326        {
327            case 0:
328                {
329                    vihollisalus1.Image = LoadImage("vihollis alus1");
330                    LaserGun laserase = new LaserGun(20, 10);
331                    laserase.LaserCollision = LaserOsuu;
332                    laserase.IsVisible = false;
333                    vihollisalus1.Add(laserase);
334                    laserase.Angle = Angle.Degrees(90);
335                    laserase.IsVisible = false;
336                    vihollistenaseet.Add(laserase);
337                    viholliset.Add(vihollisalus1);
338                    break;
339                }
340            case 1:
341                {
342                    vihollisalus1.Image = LoadImage("vihollis alus2");
343                    LaserGun laserase = new LaserGun(20, 10);
344                    laserase.LaserCollision = LaserOsuu;
345                    laserase.IsVisible = false;
346                    vihollisalus1.Add(laserase);
347                    laserase.Angle = Angle.Degrees(90);
348                    vihollistenaseet.Add(laserase);
349                    viholliset.Add(vihollisalus1);
350                    break;
351                }
352            case 2:
353                {
354                    vihollisalus1.Image = LoadImage("vihollis alus5");
355                    AssaultRifle pyssy = new AssaultRifle(40, 20);
356                    pyssy.BulletCollision = RifleOsuu;
357                    pyssy.TimeBetweenUse = new TimeSpan(4000000);
358                    pyssy.IsVisible = false;
359                    pyssy.Ammo.Value = int.MaxValue;
360                    vihollisalus1.Add(pyssy);
361                    pyssy.Angle = Angle.Degrees(90);
362                    vihollistenaseet.Add(pyssy);
363                    viholliset.Add(vihollisalus1);
364                    break;
365                }
366
367            case 3:
368                {
369                    vihollisalus1.Image = LoadImage("vihollis alus6");
370                    AssaultRifle pyssy = new AssaultRifle(40, 20);
371                    pyssy.BulletCollision = RifleOsuu;
372                    pyssy.TimeBetweenUse = new TimeSpan(2000000);
373                    pyssy.Ammo.Value = int.MaxValue;
374                    pyssy.IsVisible = false;
375                    vihollisalus1.Add(pyssy);
376                    pyssy.Angle = Angle.Degrees(90);
377                    vihollistenaseet.Add(pyssy);
378                    viholliset.Add(vihollisalus1);
379                    break;
380                }
381            case 4:
382                {
383                    vihollisalus1.Image = LoadImage("vihollis alus8");
384                    AssaultRifle pyssy = new AssaultRifle(40, 20);
385                    pyssy.BulletCollision = RifleOsuu;
386                    pyssy.Ammo.Value = int.MaxValue;
387                    pyssy.TimeBetweenUse = new TimeSpan(2000000);
388                    pyssy.IsVisible = false;
389                    vihollisalus1.Add(pyssy);
390                    pyssy.Angle = Angle.Degrees(90);
391                    vihollistenaseet.Add(pyssy);
392                    viholliset.Add(vihollisalus1);
393                    break;
394                }
395            case 5:
396                {
397                    vihollisalus1.Image = LoadImage("vihollis alus9");
398                    Cannon tykki = new Cannon(20, 10);
399                    tykki.IsVisible = false;
400                    vihollisalus1.Add(tykki);
401                    tykki.Ammo.Value = int.MaxValue;
402                    tykki.Angle = Angle.Degrees(90);
403                    tykki.TimeBetweenUse = new TimeSpan(30000000);
404                    vihollistenaseet.Add(tykki);
405                    viholliset.Add(vihollisalus1);
406                    tykki.Power.Value = 100000;
407                    tykki.CannonBallCollision = KuulaOsuu;
408                    break;
409
410                }
411            case 6:
412                {
413                    vihollisalus1.Image = LoadImage("vihollis alus10");
414                    Cannon tykki = new Cannon(20, 10);
415                    vihollisalus1.Add(tykki);
416                    tykki.Ammo.Value = int.MaxValue;
417                    tykki.TimeBetweenUse = new TimeSpan(30000000);
418                    tykki.IsVisible = false;
419                    tykki.Angle = Angle.Degrees(90);
420                    viholliset.Add(vihollisalus1);
421                    vihollistenaseet.Add(tykki);
422                    tykki.Power.Value = 100000;
423                    tykki.CannonBallCollision = KuulaOsuu;
424                    break;
425                }
426            case 7:
427                {
428                    vihollisalus1.Image = LoadImage("vihollis alus12");
429                    Cannon tykki = new Cannon(20, 10);
430                    vihollisalus1.Add(tykki);
431                    tykki.TimeBetweenUse = new TimeSpan(30000000);
432                    tykki.IsVisible = false;
433                    tykki.Ammo.Value = int.MaxValue;
434                    tykki.Angle = Angle.Degrees(90);
435                    viholliset.Add(vihollisalus1);
436                    vihollistenaseet.Add(tykki);
437                    tykki.Power.Value = 100000;
438                    tykki.CannonBallCollision = KuulaOsuu;
439                    break;
440                }
441
442            case 8:
443                {
444                    vihollisalus1.Image = LoadImage("vihollis alus 13");
445                    PlasmaCannon plasmaTykki = new PlasmaCannon(100, 50);
446                    vihollisalus1.Add(plasmaTykki);
447                    plasmaTykki.TimeBetweenUse = new TimeSpan(3000000);
448                    plasmaTykki.IsVisible = false;
449                    plasmaTykki.PlasmaParticleCollision = plasmaTykkiOsuu;
450                    plasmaTykki.Angle = Angle.Degrees(90);
451                    vihollistenaseet.Add(plasmaTykki);
452                    viholliset.Add(vihollisalus1);
453                    break;
454                }
455            case 9:
456                {
457                    vihollisalus1.Image = LoadImage("vihollis alus 16");
458                    PlasmaCannon plasmaTykki = new PlasmaCannon(100, 50);
459                    plasmaTykki.TimeBetweenUse = new TimeSpan(3000000);
460                    vihollisalus1.Add(plasmaTykki);
461                    plasmaTykki.IsVisible = false;
462                    plasmaTykki.PlasmaParticleCollision = plasmaTykkiOsuu;
463                    plasmaTykki.Angle = Angle.Degrees(90);
464                    vihollistenaseet.Add(plasmaTykki);
465                    viholliset.Add(vihollisalus1);
466                    break;
467                }
468            default:
469                {
470                    vihollisalus1.Image = LoadImage("vihollis alus9");
471                    break;
472                }
473        }
474        vihollisalus1.X = aluksenx;
475        vihollisalus1.Y = alukseny;
476        vihollisalus1.Destroyed += delegate() { luoUusiKunTuhoutuu(vihollisalus1); };
477
478        Add(vihollisalus1);
479
480    }
481
482    void luoUusiKunTuhoutuu(Alus alus)
483    {
484        rajahdys.AddEffect(alus.X, alus.Y, 50);
485        savut.AddEffect(alus.X, alus.Y, 50);
486        LuoVihollisAlukset(RandomGen.NextDouble(Level.Left, Level.Right), RandomGen.NextDouble(Level.Bottom, Level.Top));
487    }
488
489    void LaserOsuu(PhysicsObject ammus, PhysicsObject kohde)
490    {
491        if (kohde.Tag.ToString() == "ammus")
492            return;
493        if (kohde.Tag.ToString() == "omaalus")
494        {
495            Alus k = (Alus)kohde;
496            k.AsetaHitpoints(k.AnnaHitPoints() - 5);
497        }
498        ammus.Destroy();
499    }
500
501    void RifleOsuu(PhysicsObject ammus, PhysicsObject kohde)
502    {
503        if (kohde.Tag.ToString() == "ammus")
504            return;
505        if (kohde.Tag.ToString() == "omaalus")
506        {
507            Alus k = (Alus)kohde;
508            k.AsetaHitpoints(k.AnnaHitPoints() - 5);
509        }
510        ammus.Destroy();
511    }
512
513    void plasmaTykkiOsuu(PhysicsObject ammus, PhysicsObject kohde)
514    {
515
516        if (kohde.Tag.ToString() == "ammus")
517            return;
518        if (kohde.Tag.ToString() == "omaalus")
519        {
520            Alus k = (Alus)kohde;
521            k.AsetaHitpoints(k.AnnaHitPoints() - 5);
522        }
523        ammus.Destroy();
524    }
525
526    void VihollisAlusAmpuu(Timer sender)
527    {
528        for (int i = 0; i < vihollistenaseet.Count; i++)
529        {
530            Weapon ase = vihollistenaseet[i];
531            PhysicsObject vihollinen = viholliset[i];
532
533            //Vector suunta = alus.Position - ase.AbsolutePosition;
534            //vihollinen.Angle = suunta.Angle + Angle.Degrees(270);
535            if (ase is AssaultRifle)
536            {
537                PhysicsObject a = ase.Shoot();
538                if (a != null)
539                {
540                    a.Tag = "ammus";
541                    a.Velocity /= 2;
542                    a.CollisionIgnorer = ammusIgnorer;
543                    a.Size = new Vector(15, 5);
544                }
545                continue;
546            }
547            if (ase is Cannon)
548            {
549                (ase as Cannon).Power.Value = 10000;
550            }
551            PhysicsObject ammus = ase.Shoot();
552            if (ammus != null)
553            {
554                ammus.CollisionIgnorer = ammusIgnorer;
555                ammus.MaximumLifetime = TimeSpan.MaxValue;
556                ammus.Tag = "ammus";
557                ammus.Velocity /= 2;
558                if (ase is PlasmaCannon)
559                {
560                    ammus.Size *= 5;
561                }
562
563            }
564        }
565
566    }
567
568    void KuulaOsuu(PhysicsObject kuula, PhysicsObject toinen)
569    {
570
571        if (toinen.Tag.ToString() == "ammus")
572            return;
573        if (toinen.Tag.ToString() == "omaalus")
574        {
575            Alus k = (Alus)toinen;
576            k.AsetaHitpoints(k.AnnaHitPoints() - 5);
577            if (k.AnnaHitPoints() < 5)
578            {
579                NaytaTopTen();
580            }
581        }
582        kuula.Destroy();
583        Explosion rajahdys = new Explosion(40);
584        rajahdys.Position = kuula.Position;
585        Add(rajahdys);
586    }
587
588    void NaytaTopTen()
589    {
590        topLista.Show(pistelaskuri.Value);
591    }
592}
593
594public class Alus : PhysicsObject
595{
596    private double Hitpoints;
597
598    public Alus(double width, double height)
599        : base(width, height)
600    {
601    }
602
603    public void AsetaHitpoints(double hp)
604    {
605        this.Hitpoints = hp;
606    }
607
608    public double AnnaHitPoints()
609    {
610        return this.Hitpoints;
611    }
612
613    public override void Update(Time time)
614    {
615        if (AnnaHitPoints() <= 0 && !this.IsDestroyed())
616        {
617            this.Destroy();
618        }
619        base.Update(time);
620    }
621}
Note: See TracBrowser for help on using the repository browser.