source: 2014/24/EeroF/FysiikkaPeli1/FysiikkaPeli1/FysiikkaPeli1/FysiikkaPeli1.cs @ 5030

Revision 5030, 34.2 KB checked in by eefadjuk, 9 years ago (diff)
Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4using Jypeli.Assets;
5using Jypeli.Controls;
6using Jypeli.Effects;
7using Jypeli.Widgets;
8
9
10
11public class FysiikkaPeli1 : PhysicsGame
12{
13 #region yleiset
14    IntMeter pisteLaskuri;
15    PhysicsObject Mikko;
16    PhysicsObject Mikkokaveri;
17    Image mikkokuva = LoadImage("Mikko3");
18    Image taustaKuva = LoadImage("ruoho4");
19    Image omenakuva = LoadImage("omena");
20    Image hamiskuva = LoadImage("Hamis");
21    Image hamiskuva2 = LoadImage("HamisNopea");
22    Image ohjuskuva = LoadImage("Ohjus");
23    Image SaMiKu = LoadImage("Sahkomies");
24    Image mikkokaveri = LoadImage("MikkoKaveri2");
25    Image Alku = LoadImage("Alku");
26    Image MikkoMG = LoadImage("MikkoMG");
27    Image MikkoKaveriMG = LoadImage("MikkoKaveriMG");
28    Image MikkoAR = LoadImage("MikkoAR");
29    Image MikkoKaveriAR = LoadImage("MikkoKaveriAR");
30    SoundEffect Ai = LoadSoundEffect("Ai");
31    SoundEffect Nam = LoadSoundEffect("Nam");
32    SoundEffect HamisLahella = LoadSoundEffect("HamisLahella");
33    SoundEffect Kling = LoadSoundEffect("Kling");
34    SoundEffect HamisKuoli = LoadSoundEffect("HamisKuoli");
35    SoundEffect Havio = LoadSoundEffect("Haviov2");
36    SoundEffect Kuoli = LoadSoundEffect("Mikkokuoli");
37    SoundEffect Kuoli2 = LoadSoundEffect("Mikkokaverikuoli");
38    Image Tahti = LoadImage("Tahti");
39    Image tykkiKuva = LoadImage("Turret");
40    DoubleMeter elamaLaskuri;
41    DoubleMeter Mittari;
42    DoubleMeter elamalaskuri2;
43    AssaultRifle pelaajan1Ase;
44    AssaultRifle pelaajan2Ase;
45    EasyHighScore topLista = new EasyHighScore();
46    Timer ajastin;
47    public static FysiikkaPeli1 peli;
48    bool onkoHuijattu = false;
49    bool huijausmode = false;
50    int nukeViilennysAika = 0;
51    double vihunLuontiAika = 7.5;
52    int pelaajia;
53    double nopeusVakioAmmukselle = 1;
54    double montakopaivitysta = 0;
55    enum Ostettava { Kranaatti = 10, Tykki = 1000, Heal = 100, Upgrade = 150, FRAG = 15, Ohjus = 25 };
56
57    #endregion
58    public override void Begin()
59    {
60        SmoothTextures = false;
61        //IsFullScreen = true;
62        peli = this;
63        IsPaused = false;
64        ClearAll();
65        LataaAanet();
66        Mouse.IsCursorVisible = true;
67        Level.Size = new Vector(1000, 800);
68        Camera.ZoomFactor = 1;
69
70
71        MultiSelectWindow valikko = new MultiSelectWindow("Tervetuloa peliin",
72            "Yksinpeli", "Kaksinpeli", "Lopeta");
73        valikko.ItemSelected += PainettiinValikonNappia;
74        Add(valikko);
75        Camera.ZoomToLevel();
76        Level.Background.Image = Alku;
77        Level.Background.ScaleToLevelByHeight();
78        Level.Background.TextureWrapSize = Vector.Diagonal;
79    }
80
81    void LataaAanet()
82    {
83        HamisLahella = LoadSoundEffect("HamisLahella");
84    }
85
86    void PainettiinValikonNappia(int valinta)
87    {
88        switch (valinta)
89        {
90            case 0:
91                pelaajia = 1;
92                AloitaPeli();
93                break;
94            case 1:
95                pelaajia = 2;
96                AloitaPeli();
97                break;
98            default:
99                Exit();
100                break;
101        }
102    }
103
104    void AloitaPeli()
105    {
106        DoNextUpdate(delegate { Mouse.IsCursorVisible = false; });
107        LuoPelaaja();
108        LuoKentta();
109
110        vihunLuontiAika = 7.5;
111        vaikeutusAika = 60000;
112        onkoHuijattu = false;
113
114        LuoPistelaskuri();
115        LuoElamaLaskuri();
116        Level.Background.Image = taustaKuva;
117        Level.Background.TileToLevel();
118        Camera.Follow(Mikko);
119        //Camera.ZoomFactor = 20;
120        AddCollisionHandler(Mikko, "Omena", CollisionHandler.DestroyTarget);
121        AddCollisionHandler(Mikko, "Parannus", CollisionHandler.DestroyTarget);
122        AddCollisionHandler(Mikko, "Parannus", Lisaa5Pistetta);
123        AddCollisionHandler(Mikko, "Parannus", ParannaAsetta);
124        AddCollisionHandler(Mikko, "Omena", LisaaPiste);
125        AddCollisionHandler(Mikko, "Omena", LisaaElamaa);
126        AddCollisionHandler(Mikko, "Hamis", VahennaElamaa);
127        if (pelaajia == 2)
128        {
129            LuoKaveri();
130
131            Camera.Follow(Mikko, Mikkokaveri);
132
133            AddCollisionHandler(Mikkokaveri, "Omena", CollisionHandler.DestroyTarget);
134            AddCollisionHandler(Mikkokaveri, "Parannus", CollisionHandler.DestroyTarget);
135            AddCollisionHandler(Mikkokaveri, "Parannus", Lisaa5Pistetta);
136            AddCollisionHandler(Mikkokaveri, "Parannus", ParannaAsetta);
137            AddCollisionHandler(Mikkokaveri, "Omena", LisaaPiste);
138            AddCollisionHandler(Mikkokaveri, "Omena", LisaaElamaa);
139            AddCollisionHandler(Mikkokaveri, "Hamis", VahennaElamaa);
140
141        }
142        Mittari = new DoubleMeter(0, 0, 1);
143
144        AsetaOhjaimet();
145    }
146
147    void LisaaPiste(PhysicsObject tormaaja, PhysicsObject kohde)
148    {
149        pisteLaskuri.Value++;
150        Nam.Play();
151    }
152
153    void Lisaa5Pistetta(PhysicsObject tormaaja, PhysicsObject kohde)
154    {
155        pisteLaskuri.Value += 5;
156        Kling.Play();
157    }
158
159    void LuoPistelaskuri() 
160    {
161        pisteLaskuri = new IntMeter(0, 0, int.MaxValue);
162        //pisteLaskuri.AddTrigger(100, TriggerDirection.Up,
163
164        Label pisteNaytto = new Label();
165        pisteNaytto.X = Screen.Left + 100;
166        pisteNaytto.Y = Screen.Top - 100;
167        pisteNaytto.TextColor = Color.Black;
168        pisteNaytto.Color = Color.White;
169        pisteNaytto.Title = "Pisteet";
170
171        pisteNaytto.BindTo(pisteLaskuri);
172        Add(pisteNaytto);
173    }
174
175    void Vihukuoli()
176    {
177        pisteLaskuri.Value += 5;
178        HamisKuoli.Play();
179    }
180
181    #region Asetaohjaimet
182    void AsetaOhjaimet()
183    {
184        Kauppa();
185        PhoneBackButton.Listen(ConfirmExit, "Lopeta peli");
186        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Lopetus, "Lopeta peli");
187        Keyboard.Listen(Key.Up, ButtonState.Down, PelaajaKavelee, "Pelaaja liikkuu", Mikko, 250.0);
188        Keyboard.Listen(Key.Down, ButtonState.Down, PelaajaKavelee, "Pelaaja liikkuu taakse", Mikko, -250.0);
189        Keyboard.Listen(Key.Up, ButtonState.Released, PysaytaPelaaja, null, Mikko);
190        Keyboard.Listen(Key.Down, ButtonState.Released, PysaytaPelaaja, null, Mikko);
191        Keyboard.Listen(Key.Left, ButtonState.Released, PysaytaPelaaja, null, Mikko);
192        Keyboard.Listen(Key.Right, ButtonState.Released, PysaytaPelaaja, null, Mikko);
193        Keyboard.Listen(Key.P, ButtonState.Released, PysaytaPelaaja, null, Mikko);
194        Keyboard.Listen(Key.O, ButtonState.Released, PysaytaPelaaja, null, Mikko);
195        Keyboard.Listen(Key.Right, ButtonState.Down, KaantyyOikealle, "Pelaaja kääntyy", Mikko);
196        Keyboard.Listen(Key.Left, ButtonState.Down, KaantyyVasemmalle, "Pelaaja kääntyy", Mikko);
197        Keyboard.Listen(Key.O, ButtonState.Down, KaantyyVasemmalle2, "Pelaaja kääntyy vähän", Mikko);
198        Keyboard.Listen(Key.P, ButtonState.Down, KaantyyOikealle2, "Pelaaja kääntyy vähän", Mikko);
199        Keyboard.Listen(Key.RightControl, ButtonState.Down, Ampuu, "Ampuu", pelaajan1Ase);
200        Keyboard.Listen(Key.H, ButtonState.Pressed, ShowControlHelp, "Apu");
201        Keyboard.Listen(Key.NumPad5, ButtonState.Pressed, mode, null);
202        Keyboard.Listen(Key.I, ButtonState.Pressed, Huijaus, null);
203        Keyboard.Listen(Key.U, ButtonState.Pressed, Huijaus2, null);
204        Keyboard.Listen(Key.K, ButtonState.Pressed, Huijaus3, null);
205        Keyboard.Listen(Key.J, ButtonState.Pressed, Huijaus4, null);
206
207        Keyboard.Listen(Key.Delete, ButtonState.Pressed, NUKE, null);
208        Keyboard.Listen(Key.Home, ButtonState.Pressed, Koti, null);
209
210        if (pelaajia == 2)
211        {
212            if (ControllerOne.IsConnected)
213            {
214                ControllerOne.Listen(Button.RightTrigger, ButtonState.Down, Ampuu, "Ampuu", pelaajan2Ase);
215                ControllerOne.ListenAnalog(AnalogControl.RightStick, 0.1, KuunteleeOikeaaTattia, "Kääntää pelaajaa", Mikkokaveri);
216                ControllerOne.Listen(Button.DPadUp, ButtonState.Down, PelaajaKavelee, "LiikuttaaPelaajaa", Mikkokaveri, 250.0);
217                ControllerOne.Listen(Button.DPadDown, ButtonState.Down, PelaajaKavelee, "LiikuttaaPelaajaa", Mikkokaveri, -250.0);
218                ControllerOne.Listen(Button.DPadUp, ButtonState.Released, PysaytaPelaaja, "LiikuttaaPelaajaa", Mikkokaveri);
219                ControllerOne.Listen(Button.DPadDown, ButtonState.Released, PysaytaPelaaja, "LiikuttaaPelaajaa", Mikkokaveri);
220            }
221            else
222            {
223                Keyboard.Listen(Key.W, ButtonState.Down, PelaajaKavelee, "Pelaaja liikkuu", Mikkokaveri, 250.0);
224                Keyboard.Listen(Key.S, ButtonState.Down, PelaajaKavelee, "Pelaaja liikkuu taakse", Mikkokaveri, -220.0);
225                Keyboard.Listen(Key.W, ButtonState.Released, PysaytaPelaaja, null, Mikkokaveri);
226                Keyboard.Listen(Key.S, ButtonState.Released, PysaytaPelaaja, null, Mikkokaveri);
227                Keyboard.Listen(Key.Q, ButtonState.Released, PysaytaPelaaja, null, Mikkokaveri);
228                Keyboard.Listen(Key.E, ButtonState.Released, PysaytaPelaaja, null, Mikkokaveri);
229                Keyboard.Listen(Key.A, ButtonState.Released, PysaytaPelaaja, null, Mikkokaveri);
230                Keyboard.Listen(Key.D, ButtonState.Released, PysaytaPelaaja, null, Mikkokaveri);
231                Keyboard.Listen(Key.D, ButtonState.Released, PysaytaPelaaja, null, Mikkokaveri);
232                Keyboard.Listen(Key.A, ButtonState.Released, PysaytaPelaaja, null, Mikkokaveri);
233                Keyboard.Listen(Key.D, ButtonState.Down, KaantyyOikealle, "Pelaaja kääntyy", Mikkokaveri);
234                Keyboard.Listen(Key.A, ButtonState.Down, KaantyyVasemmalle, "Pelaaja kääntyy", Mikkokaveri);
235                Keyboard.Listen(Key.Q, ButtonState.Down, KaantyyVasemmalle2, "Pelaaja kääntyy vähän", Mikkokaveri);
236                Keyboard.Listen(Key.E, ButtonState.Down, KaantyyOikealle2, "Pelaaja kääntyy vähän", Mikkokaveri);
237                Keyboard.Listen(Key.LeftShift, ButtonState.Down, Ampuu, "Ampuu", pelaajan2Ase);
238
239            }
240
241        }
242    }
243    void KuunteleeOikeaaTattia(AnalogState tila, PhysicsObject pelaaja)
244    {
245        pelaaja.Angle = tila.StateVector.Angle;
246        pelaaja.AngularVelocity = 0;
247    }
248    void PelaajaKavelee(PhysicsObject Mikko, double nopeus)
249    {
250
251        Vector pelaajanSuunta = Vector.FromLengthAndAngle(nopeus, Mikko.Angle);
252        Mikko.Velocity = pelaajanSuunta;
253
254    }
255    void PysaytaPelaaja(PhysicsObject Mikko)
256    {
257        Vector nopeus = Vector.Zero;
258        Mikko.Velocity = nopeus;
259        Mikko.AngularVelocity = 0.0;
260
261    }
262    void KaantyyOikealle(PhysicsObject Mikko)
263    {
264        Mikko.AngularVelocity = -5.0;
265    }
266    void KaantyyVasemmalle(PhysicsObject Mikko)
267    {
268        Mikko.AngularVelocity = 5.0;
269    }
270    #endregion
271    void Ampuu(AssaultRifle ase)
272    {
273
274        PhysicsObject ammus = ase.Shoot();
275
276        if (ammus != null)
277        {
278            ammus.MaximumLifetime = TimeSpan.FromSeconds(2.0);
279            ammus.Mass = 100;
280            ammus.Velocity *= nopeusVakioAmmukselle;
281        }
282    }
283    #region Kauppa
284    void Kauppa()
285    {
286        Label tekstikentta = new Label(250, 175);
287        Add(tekstikentta);
288        tekstikentta.X = Screen.Left + 1000;
289        tekstikentta.Y = Screen.Top - 100;
290        tekstikentta.Color = Color.Black;
291        tekstikentta.TextColor = Color.White;
292        tekstikentta.BorderColor = Color.Black;
293        tekstikentta.Text = "1 - Kranaatti(10P)\n2 - Tykki(1000P)\n3 - Heal(100P)\n4 - Upgrade(150P)\n5 - Rypälekranaatti(15P)\n6 - Ohjus(25P)\n0 - Sulje";
294        Keyboard.Listen(Key.D0, ButtonState.Pressed, delegate { Piilotatekstikentta(tekstikentta); }, null);
295        Keyboard.Listen(Key.D1, ButtonState.Pressed, OstaKaupasta, null, Ostettava.Kranaatti);
296        Keyboard.Listen(Key.D2, ButtonState.Pressed, OstaKaupasta, null, Ostettava.Tykki);
297        Keyboard.Listen(Key.D3, ButtonState.Pressed, OstaKaupasta, null, Ostettava.Heal);
298        Keyboard.Listen(Key.D4, ButtonState.Pressed, OstaKaupasta, null, Ostettava.Upgrade);
299        Keyboard.Listen(Key.D5, ButtonState.Pressed, OstaKaupasta, null, Ostettava.FRAG);
300        Keyboard.Listen(Key.D6, ButtonState.Pressed, OstaKaupasta, null, Ostettava.Ohjus);
301    }
302
303    void OstaKaupasta(Ostettava ostettava)
304    {
305        if (pisteLaskuri.Value >= (int)ostettava)
306        {
307            pisteLaskuri.Value -= (int)ostettava;
308            if (ostettava == Ostettava.Kranaatti)
309            {
310                HeitaKranaatti(Mikko);
311            }
312            if (ostettava == Ostettava.Tykki)
313            {
314                LuoTurret(Mikko.Position);
315            }
316            if (ostettava == Ostettava.Heal)
317            {
318                elamaLaskuri.Value += 10;
319            }
320            if (ostettava == Ostettava.Upgrade)
321            {
322                pelaajan1Ase.FireRate += 3;
323                if (pelaajia == 2)
324                {
325                    pelaajan2Ase.FireRate += 3;
326                }
327            }
328            if (ostettava == Ostettava.FRAG)
329            {
330                HeitaKranaatti2(Mikko);
331            }
332            if (ostettava == Ostettava.Ohjus)
333            {
334                Ohjus(Mikko);
335            }
336        }
337    }
338
339    void HeitaKranaatti(PhysicsObject pelaaja)
340    {
341
342        Grenade kranu = new Grenade(5);
343        kranu.Explosion.ShockwaveReachesObject += KranaattiOsui;
344        pelaaja.Throw(kranu, Angle.FromDegrees(0), 5000);
345
346
347    }
348    void HeitaKranaatti2(PhysicsObject pelaaja)
349    {
350
351        ClusterGrenade kranu = new ClusterGrenade(4.0, 2);
352        kranu.NumberOfClusters = 8;
353        kranu.ClusterArc = 360;
354        pelaaja.Throw(kranu, Angle.FromDegrees(0), 5000);
355        kranu.Explosion.ShockwaveReachesObject += KranaattiOsui;
356
357    }
358
359    void Ohjus(PhysicsObject pelaaja)
360    {
361        List<GameObject> viholliset = GetObjectsWithTag("Hamis");
362        if (viholliset.Count == 0) return;
363
364        Vector tahtaysPiste = Vector.FromLengthAndAngle(100.0, pelaaja.Angle);
365
366        double lahinEtaisyys = Vector.Distance(tahtaysPiste, viholliset[0].Position);
367        int lahimmanIndeksi = 0;
368
369        for (int i = 0; i < viholliset.Count; i++)
370        {
371            double tamanEtaisyys = Vector.Distance(tahtaysPiste, viholliset[i].Position);
372            if (tamanEtaisyys < lahinEtaisyys)
373            {
374                lahinEtaisyys = tamanEtaisyys;
375                lahimmanIndeksi = i;
376            }
377        }
378
379        double lahtoNopeus = 500;
380        double lentoNopeus = 250;
381        HakeutuvaAmmus ammus = new HakeutuvaAmmus(40, 8, viholliset[lahimmanIndeksi], pelaaja.Position + Vector.FromLengthAndAngle(100, pelaaja.Angle), Vector.FromLengthAndAngle(lahtoNopeus, pelaaja.Angle), lentoNopeus);
382        ammus.MaximumLifetime = TimeSpan.FromSeconds(8.5);
383        Add(ammus);
384        ammus.Image = ohjuskuva;
385        AddCollisionHandler(ammus, "Hamis", HAmmusOsui);
386
387    }
388
389    void Piilotatekstikentta(Label tekstiKentta)
390    {
391        tekstiKentta.IsVisible = !tekstiKentta.IsVisible;
392    }
393
394    #endregion
395
396    #region ohjaaminen
397    void Huijaus()
398    {
399        if (huijausmode == true)
400        {
401            onkoHuijattu = true;
402            if (Mittari.Value == 0)
403            {
404                pelaajan1Ase.FireRate += 50;
405                Mittari.Value += 1;
406                Mikko.Image = MikkoMG;
407                if (pelaajia == 2)
408                {
409                    pelaajan2Ase.FireRate += 50;
410                    Mikkokaveri.Image = MikkoKaveriMG;
411                };
412            }
413
414            else
415            {
416                pelaajan1Ase.FireRate -= 50;
417                Mittari.Value -= 1;
418                parannuskuva();
419                if (pelaajia == 2)
420                {
421                    pelaajan2Ase.FireRate -= 50;
422                };
423            };
424        };
425    }
426    void Huijaus2()
427    {
428        if (huijausmode == true)
429        {
430            onkoHuijattu = true;
431            elamaLaskuri.Value += 10;
432            if (pelaajia == 2)
433            {
434                elamalaskuri2.Value += 10;
435            };
436        };
437    }
438    void Huijaus3()
439    {
440        if (huijausmode == true)
441        {
442            onkoHuijattu = true;
443            Vector impulssi = new Vector(50000.0, 0.0);
444            Mikko.Hit(impulssi);
445            if (pelaajia == 2)
446            {
447                Mikkokaveri.Hit(impulssi);
448            };
449        };
450    }
451    void Huijaus4()
452    {
453        if (huijausmode == true)
454        {
455            onkoHuijattu = true;
456            Vector impulssi = new Vector(-50000.0, 0.0);
457            Mikko.Hit(impulssi);
458            if (pelaajia == 2)
459            {
460                Mikkokaveri.Hit(impulssi);
461            };
462        };
463    }
464    void NUKE()
465    {
466        if (nukeViilennysAika > 0)
467            return;
468        // Aika millisekunteina.
469        nukeViilennysAika = 30000;
470        List<GameObject> hamikset = GetObjectsWithTag(new String[] { "Hamis" });
471        foreach (var hamis in hamikset)
472        {
473            Vihu vihu = hamis as Vihu;
474            vihu.ElamaLaskuri.Value -= 5;
475        }
476    }
477    void Koti()
478    {
479        List<GameObject> pelaajat = GetObjectsWithTag(new String[] { "pelaaja" });
480
481        foreach (var mikko in pelaajat)
482        {
483
484            mikko.MoveTo(new Vector(0, 0), 100000);
485
486        }
487
488
489    }
490    void mode()
491    {
492        this.huijausmode = true;
493    }
494    void KaantyyOikealle2(PhysicsObject Mikko)
495    {
496        Mikko.AngularVelocity = -1.0;
497    }
498    void KaantyyVasemmalle2(PhysicsObject Mikko)
499    {
500        Mikko.AngularVelocity = 1.0;
501    }
502    #endregion
503    #region Random
504    public void AmmusOsui(PhysicsObject ammus, PhysicsObject kohde)
505    {
506        ammus.Destroy();
507
508        if (kohde is Vihu)
509        {
510            Vihu hamis = kohde as Vihu;
511            hamis.ElamaLaskuri.Value -= 1;
512            hamis.Hit(Vector.FromLengthAndAngle(2500, ammus.Angle));
513        }
514    }
515    public void HAmmusOsui(PhysicsObject ammus, PhysicsObject kohde)
516    {
517        Explosion rajahdys = new Explosion(50);
518        rajahdys.Position = ammus.Position;
519        rajahdys.MaxRadius = 150;
520        Add(rajahdys);
521        ammus.Destroy();
522        rajahdys.ShockwaveReachesObject += KranaattiOsui;
523        if (kohde is Vihu)
524        {
525            Vihu hamis = kohde as Vihu;
526            hamis.ElamaLaskuri.Value -= 5;
527            hamis.Hit(Vector.FromLengthAndAngle(2500, ammus.Angle));
528        }
529
530
531
532    }
533    void KranaattiOsui(IPhysicsObject rajahdyksenKohde, Vector v)
534    {
535        if (rajahdyksenKohde is Vihu)
536        {
537            Vihu vihu = rajahdyksenKohde as Vihu;
538            vihu.ElamaLaskuri.Value -= 4;
539        }
540    }
541
542    void Hamislahella()
543    {
544        if (HamisLahella.IsPlaying == false)
545        { HamisLahella.Play(); }
546    }
547    void LuoKentta()
548    {
549        Level.Width = 10000;
550        Level.Height = 10000;
551
552
553        for (int i = 0; i < 100; i++)
554        {
555            LuoOmena();
556        }
557
558
559        for (int i = 0; i < 10; i++)
560        {
561
562            int luku = RandomGen.NextInt(-4500, 4500);
563            int luku2 = RandomGen.NextInt(-4500, 4500);
564            int luku3 = RandomGen.NextInt(3, 15);
565
566            for (int j = 0; j < luku3; j++)
567                LuoSaMi(luku, luku2);
568        }
569
570
571        for (int i = 0; i < 10; i++)
572        {
573
574            LuoHamis();
575
576
577        }
578
579        LuoHamis2();
580
581        for (int i = 0; i < 10; i++)
582        {
583            LuoParannus();
584        }
585        Level.CreateBorders();
586
587        ajastin = new Timer();
588        ajastin.Interval = vihunLuontiAika;
589        ajastin.Timeout += LisaaVihuja;
590        ajastin.Start();
591
592        Timer perusLooppi = new Timer();
593        perusLooppi.Interval = 0.1;
594        perusLooppi.Timeout += PerusLooppi;
595        perusLooppi.Start();
596        // LuoTurret();
597    }
598    void LuoTurret(Vector minne)
599    {
600
601        Turret turret = new Turret(120, 55, null, 0.5);
602        Add(turret);
603
604        turret.Image = tykkiKuva;
605        turret.Position = minne;
606        turret.KohdeTag = "Hamis";
607    }
608    int vaikeutusAika = 60000;
609    void PerusLooppi()
610    {
611        if (nukeViilennysAika > 0)
612            nukeViilennysAika -= 100;
613        vaikeutusAika -= 100;
614        if (vaikeutusAika < 0)
615        {
616            vihunLuontiAika -= 0.2;
617            if (vihunLuontiAika < 0.1)
618                vihunLuontiAika = 0.1;
619            if (onkoHuijattu)
620                vaikeutusAika = 500;
621            else
622                vaikeutusAika = 60000;
623        }
624    }
625
626    void LisaaVihuja()
627    {
628        ajastin.Interval = vihunLuontiAika;
629        if (GetObjectsWithTag(new String[] { "Hamis" }).Count > 200)
630            return;
631        int luku = RandomGen.NextInt(1, 5);
632        for (int i = 0; i < luku; i++)
633        {
634            LuoHamis();
635        }
636        luku = RandomGen.NextInt(0, 3);
637        for (int i = 0; i < luku; i++)
638        {
639            LuoHamis2();
640        }
641    }
642    void LuoOmena()
643    {
644
645        int luku = RandomGen.NextInt(-5000, 5000);
646        int luku2 = RandomGen.NextInt(-5000, 5000);
647        PhysicsObject Omena = new PhysicsObject(15, 15);
648        Omena.IgnoresCollisionResponse = true;
649        Omena.Image = omenakuva;
650        Omena.Tag = "Omena";
651        Omena.Shape = Shape.Circle;
652        Omena.Color = Color.Red;
653        Omena.X = luku;
654        Omena.Y = luku2;
655        Omena.MakeStatic();
656        Add(Omena);
657
658
659
660    }
661    void LuoSaMi(double x, double y)
662    {
663
664
665        int luku = RandomGen.NextInt(-500, 500);
666        int luku2 = RandomGen.NextInt(-500, 500);
667        PhysicsObject SaMi = new PhysicsObject(120, 100);
668        SaMi.Image = SaMiKu;
669        SaMi.CollisionIgnoreGroup = 2;
670
671        SaMi.X = x + luku;
672        SaMi.Y = y + luku2;
673        SaMi.Mass = 100000000000000000;
674        Add(SaMi);
675
676    }
677    void LuoElamaLaskuri()
678    {
679        elamaLaskuri = new DoubleMeter(10, 0, 20);
680        elamaLaskuri.LowerLimit += delegate { ElamaLoppui(Mikko); };
681
682        LuoElamaPalkki(Screen.Left + 150, Screen.Top - 20, elamaLaskuri);
683
684        if (pelaajia == 2)
685        {
686            elamalaskuri2 = new DoubleMeter(10, 0, 20);
687            elamalaskuri2.LowerLimit += delegate { ElamaLoppui(Mikkokaveri); };
688
689            LuoElamaPalkki(Screen.Right - 150, Screen.Top - 20, elamalaskuri2);
690        }
691    }
692    void LuoElamaPalkki(double x, double y, DoubleMeter seurattava)
693    {
694        ProgressBar elamaPalkki = new ProgressBar(150, 20);
695        elamaPalkki.X = x;
696        elamaPalkki.Y = y;
697        elamaPalkki.BindTo(seurattava);
698        elamaPalkki.Color = Color.Transparent;
699        elamaPalkki.BarColor = Color.Red;
700        elamaPalkki.BorderColor = Color.Black;
701        Add(elamaPalkki);
702    }
703
704    void LuoElamaLaskurivihkulle(Vihu vihu)
705    {
706        ProgressBar elamaPalkki = new ProgressBar(150, 20);
707        elamaPalkki.Y = 40;
708        elamaPalkki.BindTo(vihu.ElamaLaskuri);
709        elamaPalkki.Color = Color.Transparent;
710        elamaPalkki.BarColor = Color.Blue;
711        elamaPalkki.BorderColor = Color.Black;
712        vihu.Add(elamaPalkki);
713    }
714
715    void ElamaLoppui(PhysicsObject kuollut)
716    {
717        Camera.StopFollowing();
718        kuollut.Destroy();
719
720        if (kuollut.Image.Equals(mikkokuva))
721        {
722            Kuoli.Play();
723            Camera.Follow(Mikkokaveri);
724        }
725        else
726        {
727            Kuoli2.Play();
728            Camera.Follow(Mikko);
729        }
730
731    }
732
733    void TUHO()
734    {
735        Timer ajastin = new Timer();
736        ajastin.Interval = 1;
737        ajastin.Timeout += delegate
738        {
739
740            Havio.Play();
741            topLista.EnterAndShow(pisteLaskuri.Value);
742        };
743        ajastin.IgnorePause = true;
744        ajastin.Start(1);
745        IsPaused = true;
746
747        topLista.HighScoreWindow.Closed += delegate { Begin(); };
748
749    }
750    void LisaaElamaa(PhysicsObject tormaaja, PhysicsObject kohde)
751    {
752        if (tormaaja.Image.Equals(mikkokuva)) elamaLaskuri.Value++;
753        else if (pelaajia == 2 )elamalaskuri2.Value++;
754        if (tormaaja.Image.Equals(MikkoMG)) elamaLaskuri.Value++;
755        else if (pelaajia == 2) elamalaskuri2.Value++;
756        if (tormaaja.Image.Equals(MikkoAR)) elamaLaskuri.Value++;
757        else if (pelaajia == 2) elamalaskuri2.Value++;
758        DoNextUpdate(delegate
759        {
760            tormaaja.AngularVelocity = 0;
761            tormaaja.AngularAcceleration = 0;
762        });
763
764    }
765    void VahennaElamaa(PhysicsObject tormaaja, PhysicsObject kohde)
766    {
767        if (tormaaja.Image.Equals(mikkokuva)) elamaLaskuri.Value--;
768        else
769            if (pelaajia == 2)
770            {
771                elamalaskuri2.Value--;
772            }
773            else elamaLaskuri.Value--;
774        Ai.Play();
775        DoNextUpdate(delegate
776        {
777            tormaaja.AngularVelocity = 0;
778            tormaaja.AngularAcceleration = 0;
779        });
780    }
781    void LuoHamis()
782    {
783        Vihu Hamis = new Vihu(30, 30);
784        Hamis.Color = Color.Black;
785        Hamis.Tag = "Hamis";
786        Hamis.ElamaLaskuri.LowerLimit += Vihukuoli;
787        Hamis.CanRotate = false;
788        FollowerBrain aivot = new FollowerBrain("pelaaja");
789        Hamis.Brain = aivot;
790        aivot.Speed = 100;
791        aivot.Active = true;
792        aivot.TargetClose += Hamislahella;
793        aivot.DistanceClose = 1000;
794
795        Hamis.Image = hamiskuva;
796
797        int luku = RandomGen.NextInt(-5000, 5000);
798        int luku2 = RandomGen.NextInt(-5000, 5000);
799        Hamis.X = luku;
800        Hamis.Y = luku2;
801        Add(Hamis);
802
803        LuoElamaLaskurivihkulle(Hamis);
804    }
805    void LuoHamis2()
806    {
807        Vihu Hamis = new Vihu(30, 30);
808        Hamis.CollisionIgnoreGroup = 2;
809        Hamis.Color = Color.Black;
810        Hamis.Tag = "Hamis";
811        Hamis.ElamaLaskuri.LowerLimit += Vihukuoli;
812        Hamis.CanRotate = false;
813        FollowerBrain aivot = new FollowerBrain("pelaaja");
814        Hamis.Brain = aivot;
815        aivot.Speed = 200;
816        aivot.Active = true;
817        aivot.TargetClose += Hamislahella;
818        aivot.DistanceClose = 1000;
819
820        Hamis.Image = hamiskuva2;
821
822        int luku = RandomGen.NextInt(-5000, 5000);
823        int luku2 = RandomGen.NextInt(-5000, 5000);
824        Hamis.X = luku;
825        Hamis.Y = luku2;
826        Add(Hamis);
827
828        LuoElamaLaskurivihkulle(Hamis);
829    }
830
831    void LuoParannus()
832    {
833        int luku = RandomGen.NextInt(-5000, 5000);
834        int luku2 = RandomGen.NextInt(-5000, 5000);
835        PhysicsObject Parannus = new PhysicsObject(50, 50);
836        Parannus.IgnoresCollisionResponse = true;
837        Parannus.Image = Tahti;
838        Parannus.Tag = "Parannus";
839        Parannus.MakeStatic();
840        //Parannus.Shape = Shape.Star;
841        //Parannus.Color = Color.Yellow;
842        Parannus.X = luku;
843        Parannus.Y = luku2;
844        Add(Parannus);
845    }
846
847    void LuoPelaaja()
848    {
849        Mikko = new PhysicsObject(70, 49);
850        Mikko.Image = mikkokuva;
851        Mikko.LinearDamping = 1;
852        Mikko.AngularDamping = 1;
853
854
855        Mikko.Tag = "pelaaja";
856        if (pelaajia == 2)
857            Mikko.Destroyed += delegate { if (Mikko.IsDestroyed && Mikkokaveri.IsDestroyed) TUHO(); };
858        else Mikko.Destroyed += delegate { TUHO(); };
859        Add(Mikko);
860        pelaajan1Ase = new AssaultRifle(30, 10);
861        //  pelaajan1Ase.
862        pelaajan1Ase.ProjectileCollision = AmmusOsui;
863        pelaajan1Ase.FireRate = 2;
864
865
866
867        //  pelaajan1Ase.Power.DefaultValue = 100;
868        Mikko.Add(pelaajan1Ase);
869        pelaajan1Ase.Y = -10;
870        pelaajan1Ase.IsVisible = false;
871        //LuoKaveri();
872    }
873    void LuoKaveri()
874    {
875        Mikkokaveri = new PhysicsObject(70, 49);
876        Mikkokaveri.Image = mikkokaveri;
877        //Mikko.LinearDamping = 0.9;
878        //Mikko.AngularDamping = 0.9;
879        Mikkokaveri.X = -60;
880        Mikkokaveri.Tag = "pelaaja";
881        Mikkokaveri.Destroyed += delegate { if (Mikko.IsDestroyed && Mikkokaveri.IsDestroyed) TUHO(); };
882
883        pelaajan2Ase = new AssaultRifle(30, 10);
884        pelaajan2Ase.ProjectileCollision = AmmusOsui;
885        pelaajan2Ase.FireRate = 2;
886
887
888
889        //  pelaajan2Ase.Power.DefaultValue = 100;
890        Mikkokaveri.Add(pelaajan2Ase);
891        pelaajan2Ase.Y = -10;
892        pelaajan2Ase.IsVisible = false;
893
894        Add(Mikkokaveri);
895    }
896
897
898
899    void ParannaAsetta(PhysicsObject tormaaja, PhysicsObject kohde)
900    {
901        montakopaivitysta ++;
902        parannuskuva();
903        if (pelaajia == 1)
904        {
905            pelaajan1Ase.FireRate += 5;
906            nopeusVakioAmmukselle += 0.1;
907        }
908        else
909        {
910            pelaajan1Ase.FireRate += 5;
911            nopeusVakioAmmukselle += 0.1;
912            pelaajan2Ase.FireRate += 5;
913            nopeusVakioAmmukselle += 0.1;
914
915        }
916        DoNextUpdate(delegate
917        {
918            tormaaja.AngularVelocity = 0;
919            tormaaja.AngularAcceleration = 0;
920        });
921    }
922    void parannuskuva()
923    {
924        if (montakopaivitysta == 1)
925        {
926            Mikko.Image = MikkoAR;
927          if(pelaajia == 2)  Mikkokaveri.Image = MikkoKaveriAR;
928        }
929        if (montakopaivitysta == 5)
930        {
931            Mikko.Image = MikkoMG;
932          if(pelaajia == 2)  Mikkokaveri.Image = MikkoKaveriMG;
933        }
934           
935    }
936    void Lopetus()
937    {
938        Mouse.IsCursorVisible = true;
939        MultiSelectWindow valikko = new MultiSelectWindow("Pause",
940           "Jatka", "Päävalikko", "Poistu");
941        valikko.ItemSelected += PainettiinValikonNappia2;
942        Add(valikko);
943        IsPaused = true;
944
945    }
946
947    void PainettiinValikonNappia2(int valinta)
948    {
949        switch (valinta)
950        {
951            case 0:
952
953                IsPaused = false;
954                DoNextUpdate(delegate { Mouse.IsCursorVisible = false; });
955                break;
956
957            case 1:
958                Begin();
959                break;
960
961            case 2:
962                Exit();
963                break;
964
965        }
966    }
967    #endregion
968}
969
970class Vihu : PhysicsObject
971{
972    private IntMeter elamaLaskuri = new IntMeter(5, 0, 5);
973    public IntMeter ElamaLaskuri { get { return elamaLaskuri; } }
974
975    public Vihu(double leveys, double korkeus)
976        : base(leveys, korkeus)
977    {
978        elamaLaskuri.LowerLimit += delegate { this.Destroy(); };
979
980    }
981}
982
983public class Turret : PhysicsObject
984{
985    public GameObject Kohde { get; set; }
986
987    public String KohdeTag { get; set; }
988
989    private AssaultRifle ase;
990
991    double FireRate
992    {
993        get { return ShootTimer.Interval; }
994        set { ShootTimer.Interval = value; }
995    }
996
997    Timer ShootTimer { get; set; }
998
999    public Turret(double width, double height, GameObject kohde, double fireRate)
1000        : base(width, height)
1001    {
1002        this.IsUpdated = true;
1003        Kohde = kohde;
1004        MakeStatic();
1005        ase = new AssaultRifle(40, 40);
1006        ase.IsVisible = false;
1007       // ase.Y = -25;
1008       // ase.X = -110;
1009        ase.CanHitOwner = false;
1010        this.Add(ase);
1011
1012        // ase2 = new AssaultRifle(40, 40);
1013        // ase2.IsVisible = false;
1014        // ase2.Y = 25;
1015        // ase2.X = -110;
1016        // ase2.CanHitOwner = false;
1017        // this.Add(ase2);
1018
1019        ShootTimer = new Timer();
1020        ShootTimer.Interval = fireRate;
1021        ShootTimer.Timeout += Ammu;
1022        ShootTimer.Start();
1023    }
1024    void OmaAse()
1025    {
1026        PhysicsObject ammus = new PhysicsObject(5, 5);
1027        Add (ammus);
1028    }
1029    public override void Update(Time time)
1030    {
1031        if (KohdeTag != null)
1032        {
1033            List<GameObject> kohteet = FysiikkaPeli1.peli.GetObjectsWithTag(KohdeTag);
1034            if (kohteet.Count != 0)
1035            {
1036                double lyhin = Vector.Distance(this.Position, kohteet[0].Position);
1037                int lyhinIndex = 0;
1038
1039                for (int i = 1; i < kohteet.Count; i++)
1040                {
1041                    double tamanhetkinen = Vector.Distance(this.Position, kohteet[i].Position);
1042                    if (tamanhetkinen < lyhin)
1043                    {
1044                        lyhin = tamanhetkinen;
1045                        lyhinIndex = i;
1046                    }
1047
1048                }
1049                this.Kohde = kohteet[lyhinIndex];
1050            }
1051        }
1052
1053        if (Kohde != null)
1054            this.Angle = (Kohde.AbsolutePosition - this.AbsolutePosition).Angle;
1055        base.Update(time);
1056    }
1057
1058    private void Ammu()
1059    {
1060        PhysicsObject ammus = this.ase.Shoot();
1061        FysiikkaPeli1.peli.AddCollisionHandler(ammus, FysiikkaPeli1.peli.AmmusOsui);
1062    }
1063}
1064
1065public class HakeutuvaAmmus : PhysicsObject
1066{
1067    GameObject kohde { get; set; }
1068
1069    double nopeus {get; set;}
1070
1071    public HakeutuvaAmmus(double width, double height, GameObject kohde, Vector position, Vector launchDirection, double nopeus)
1072        :base(width, height)
1073    {
1074        this.kohde = kohde;
1075        this.IsUpdated = true;
1076        this.nopeus = nopeus;
1077        this.Position = position;
1078        Launch(launchDirection);
1079    }
1080
1081    public override void Update(Time time)
1082    {
1083        if (kohde == null) return;
1084
1085        const double HAKEUTUMISNOPEUS = 6; // 4
1086
1087        Angle suunta = (kohde.AbsolutePosition - this.AbsolutePosition).Angle;
1088        Vector suuntaKohteeseen = Vector.FromLengthAndAngle(nopeus, suunta);
1089        this.Angle = this.Velocity.Angle;
1090        if (this.Velocity == suuntaKohteeseen) return; // ollaan oikeassa suunnassa
1091
1092        if (this.Velocity.X < suuntaKohteeseen.X) this.Velocity = new Vector(this.Velocity.X + HAKEUTUMISNOPEUS, this.Velocity.Y);
1093        else this.Velocity = new Vector(this.Velocity.X - HAKEUTUMISNOPEUS, this.Velocity.Y);
1094
1095        if (this.Velocity.Y < suuntaKohteeseen.Y) this.Velocity = new Vector(this.Velocity.X, this.Velocity.Y + HAKEUTUMISNOPEUS);
1096        else this.Velocity = new Vector(this.Velocity.X, this.Velocity.Y - HAKEUTUMISNOPEUS);
1097        this.Velocity *= 1.01;
1098        base.Update(time);
1099    }
1100
1101    public void Launch(Vector launchDirection)
1102    {
1103        this.Hit(launchDirection);
1104    }
1105}
Note: See TracBrowser for help on using the repository browser.