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

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