source: 2016/27/AnttiN/SalainenTehtävä/SalainenTehtävä/SalainenTehtävä/SalainenTehtävä.cs @ 7960

Revision 7960, 17.6 KB checked in by anvinurm, 3 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
9public class SalainenTehtävä : PhysicsGame
10{
11
12   
13    private const double nopeus = 2000;
14
15    private const int RUUDUN_KOKO = 40;
16
17    private IntMeter tahtiMittari;
18    private int kenttaNRO = 1;
19    private const int maxKentat = 1;
20
21    int pelaajia = 1;
22    private PhysicsObject pelaaja1;
23    private PhysicsObject pelaaja2;
24
25    private Dictionary<int, int> tahtiaKeratty = new Dictionary<int, int>();
26
27    [Save] public int[] tahtiaKerattyTaulukko = new int[maxKentat];
28
29    private Image pelaajanKuva = LoadImage("Hahmo");
30    private Image pelaajan2Kuva = LoadImage("Hahmo2");
31    private Image tahtiKuva = LoadImage("tahti");
32    private Image kovaKuutio = LoadImage("kovaKuutio");
33    private Image LaskeutuminenKuva = LoadImage("Laskeutuminen");
34    private Image SahkoansaKuva = LoadImage("Sähköansa");
35    private Image SahkoansaTykkiKuva = LoadImage("SahkoansaTykki");
36    private Image SahkoansaSahkoKuva = LoadImage("SahkoansaSahko");
37    private Image RajahdysKuva = LoadImage("Rajahdys");
38    private Image TykkiKuva = LoadImage("Tykki");
39
40
41    private AssaultRifle pelaajan1Ase;
42    private AssaultRifle pelaajan2Ase;
43
44    private SoundEffect maaliAani = LoadSoundEffect("maali");
45
46    public override void Begin()
47    {
48        ClearAll();
49        LataaTahdet();
50        LuoPaavalikko();
51    }
52
53    void LataaTahdet()
54    {
55        for (int i = 1; i <= maxKentat; i++)
56        {
57            tahtiaKeratty.Add(i, 0);
58        }
59
60        if (DataStorage.Exists("tilanne.xml"))
61        {
62            // pelitilanne olemassa, ladataan se
63            LoadGame("tilanne.xml");
64            int j = 0;
65            for (int i = 1; i <= maxKentat; i++)
66            {
67                tahtiaKeratty[i] = tahtiaKerattyTaulukko[j];
68            }
69        }
70       
71    }
72
73    void PalaaPaavalikkoon(Window ikkuna)
74    {
75        LuoPaavalikko();
76    }
77
78    void LuoPaavalikko()
79    {
80        Level.Background.Image = LoadImage("vuoristo");
81        Level.Background.FitToLevel();
82        Camera.ZoomToLevel();
83        Level.Background.Color = Color.Blue;
84        MultiSelectWindow alkuValikko = new MultiSelectWindow("Pelin alkuvalikko","Pelaa", "Lopeta");
85        Add(alkuValikko);
86        alkuValikko.AddItemHandler(0, Pelaa);
87        alkuValikko.AddItemHandler(1, Exit);
88    }
89
90    void Pelaa()
91    {
92        Level.Background.Image = LoadImage("kiviseina");
93        Level.Background.FitToLevel();
94        Camera.ZoomToLevel();
95        Level.Background.Color = Color.Gray;
96        MultiSelectWindow alkuValikko = new MultiSelectWindow("Valitse kenttä",
97        "Kenntä 1 | Tähtiä " + tahtiaKeratty[1],
98        /*"Kenntä 2 | Tähtiä " + tahtiaKeratty[2],*/
99        "Takaisin");
100        Add(alkuValikko);
101        alkuValikko.AddItemHandler(0, delegate { ValitsePelaajat(1); });
102        alkuValikko.AddItemHandler(1, LuoPaavalikko);
103
104    }
105
106    void ValitsePelaajat(int kentta)
107    {
108        MultiSelectWindow alkuValikko = new MultiSelectWindow("Kenttä 1. Montako pelaajaa?", "1 Pelaaja", "2 Pelaajaa");
109        Add(alkuValikko);
110        alkuValikko.AddItemHandler(0, delegate { pelaajia = 1; AloitaPeli(kentta); });
111        alkuValikko.AddItemHandler(1, delegate { pelaajia = 2; AloitaPeli(kentta); });
112    }
113
114    void AloitaPeli(int kentta)
115    {
116        this.kenttaNRO = kentta;
117        IsMouseVisible = true;
118        LuoKentta();
119        LuoTahtiLaskuri();
120        LisaaNappaimet();
121
122        Camera.Follow(pelaaja1);
123        Camera.ZoomFactor = 1.2;
124        Camera.StayInLevel = true;
125    }
126
127    void LuoKentta()
128    {
129        TileMap kentta = TileMap.FromLevelAsset("kentta"+kenttaNRO);
130        kentta.SetTileMethod('#', LisaaTaso);
131        kentta.SetTileMethod('*', LisaaTahti);
132        kentta.SetTileMethod('N', LisaaPelaaja,1);
133        kentta.SetTileMethod('L', LisaaLaskeutuminen);
134        kentta.SetTileMethod('R', LisaaSahkoansaTykkiVaaka);
135        kentta.SetTileMethod('S', LisaaSahkoansaTykkiPysty);
136        kentta.SetTileMethod('T', LisaaTykki);
137        if(pelaajia==2) kentta.SetTileMethod('2', LisaaPelaaja, 2);
138        kentta.Execute(RUUDUN_KOKO, RUUDUN_KOKO);
139        Level.CreateBorders();
140        Level.Background.CreateGradient(Color.White, Color.SkyBlue);
141        Level.Background.Image = LoadImage("kiviseina");
142    }
143
144    void LuoTahtiLaskuri()
145    {
146        tahtiMittari = new IntMeter(0,0,3);
147        tahtiMittari.UpperLimit += VoimaMittariTaynna;
148
149        ProgressBar voimaPalkki = new ProgressBar(150, 50);
150        voimaPalkki.X = Screen.Right - 250;
151        voimaPalkki.Y = Screen.Bottom + 100;
152        voimaPalkki.BindTo(tahtiMittari);
153        voimaPalkki.Image = LoadImage("harmaatTahdet");
154        voimaPalkki.BarImage = LoadImage("kultaisetTahdet");
155        Add(voimaPalkki);
156
157    }
158
159    void VoimaMittariTaynna()
160    {
161        MessageDisplay.Add("Keräsit kaikki kolme tähteä!");
162    }
163
164    void LisaaTaso(Vector paikka, double leveys, double korkeus)
165    {
166        PhysicsObject taso = PhysicsObject.CreateStaticObject(leveys, korkeus);
167        taso.Position = paikka;
168        taso.Image = kovaKuutio;
169        Add(taso);
170    }
171
172    void LisaaTahti(Vector paikka, double leveys, double korkeus)
173    {
174        PhysicsObject tahti = PhysicsObject.CreateStaticObject(leveys, korkeus);
175        tahti.IgnoresCollisionResponse = true;
176        tahti.Position = paikka;
177        tahti.Image = tahtiKuva;
178        tahti.Tag = "tahti";
179        Add(tahti);
180    }
181
182    void LisaaPelaaja(Vector paikka, double leveys, double korkeus, int pelaaja)
183    {
184        if (pelaaja == 1)
185        {
186            pelaaja1 = LuoPelaaja(paikka, leveys, korkeus, pelaajanKuva, "pelaaja1");
187            pelaajan1Ase = LuoPelaajanAse(pelaaja1);
188        }
189        if (pelaaja == 2)
190        {
191            pelaaja2 = LuoPelaaja(paikka, leveys, korkeus, pelaajan2Kuva, "pelaaja2");
192            pelaajan2Ase = LuoPelaajanAse(pelaaja2);
193        }
194    }
195
196    PhysicsObject LuoPelaaja(Vector paikka, double leveys, double korkeus,Image kuva, string nimi)
197    {
198        PhysicsObject pelaaja = new PhysicsObject(leveys*0.9, korkeus*0.9);
199        pelaaja.Position = paikka;
200        pelaaja.Mass = 4.0;
201        pelaaja.Image = kuva;
202        AddCollisionHandler(pelaaja, "SahkoansaSahko", TuhoaPelaaja);
203        AddCollisionHandler(pelaaja, "tahti", TormaaTahteen);
204        AddCollisionHandler(pelaaja, "Laskeutuminen", TormaaLaskeutumiseen);
205        Add(pelaaja);
206        pelaaja.LinearDamping = 0.9;
207        pelaaja.Tag = nimi;
208        pelaaja.CanRotate = false;
209
210        return pelaaja;
211    }
212
213    AssaultRifle LuoPelaajanAse(PhysicsObject pelaaja)
214    {
215        AssaultRifle pelaajanAse = new AssaultRifle(30, 10);
216        pelaajanAse.Power.MaxValue = 50;
217        pelaajanAse.FireRate = 1;
218        pelaajanAse.ProjectileCollision = AmmusOsui;
219        pelaaja.Add(pelaajanAse);
220        return pelaajanAse;
221    }
222
223    void LisaaLaskeutuminen(Vector paikka, double leveys, double korkeus)
224    {
225        PhysicsObject Laskeutuminen = PhysicsObject.CreateStaticObject(leveys, korkeus);
226        Laskeutuminen.IgnoresCollisionResponse = true;
227        Laskeutuminen.Position = paikka;
228        Laskeutuminen.Image = LaskeutuminenKuva;
229        Laskeutuminen.Tag = "Laskeutuminen";
230        Add(Laskeutuminen);
231    }
232
233    void LisaaSahkoansaTykkiPysty(Vector paikka, double leveys, double korkeus)
234    {
235        PhysicsObject sahko = LisaaSahkoansaSahko(new Vector(paikka.X, paikka.Y-korkeus), leveys/2, korkeus, Angle.FromDegrees(0));
236        LisaaSahkoansaTykki(paikka, leveys, korkeus, sahko, Angle.FromDegrees(180));
237        LisaaSahkoansaTykki(new Vector(paikka.X, paikka.Y-korkeus*2), leveys, korkeus, sahko, Angle.FromDegrees(0));
238    }
239
240    void LisaaSahkoansaTykkiVaaka(Vector paikka, double leveys, double korkeus)
241    {
242        PhysicsObject sahko = LisaaSahkoansaSahko(new Vector(paikka.X + leveys, paikka.Y), leveys/2, korkeus, Angle.FromDegrees(-90));
243        LisaaSahkoansaTykki(paikka,leveys,korkeus,sahko, Angle.FromDegrees(-90));
244        LisaaSahkoansaTykki(new Vector(paikka.X + leveys*2, paikka.Y), leveys, korkeus, sahko, Angle.FromDegrees(90));
245    }
246
247    void LisaaSahkoansaTykki(Vector paikka, double leveys, double korkeus, PhysicsObject sahko, Angle kaanna)
248    {
249        SahkoansaTykki Sahkoansa = new SahkoansaTykki(leveys, korkeus, sahko);
250        Sahkoansa.Position = paikka;
251        Sahkoansa.Image = SahkoansaTykkiKuva;
252        Sahkoansa.Tag = "SahkoansaTykki";
253        Add(Sahkoansa);
254        Sahkoansa.RotateImage = true;
255        Sahkoansa.Angle = kaanna;
256
257        Label pisteNaytto = new Label();
258        //pisteNaytto.Position = Camera.WorldToScreen(paikka);
259        pisteNaytto.TextColor = Color.Red;
260        pisteNaytto.BindTo(Sahkoansa.ElamaLaskuri);
261        Sahkoansa.Add(pisteNaytto);
262    }
263
264
265
266    PhysicsObject LisaaSahkoansaSahko(Vector paikka, double leveys, double korkeus,Angle kaanna)
267    {
268        PhysicsObject SahkoansaSahko = PhysicsObject.CreateStaticObject(leveys, korkeus);
269        SahkoansaSahko.Position = paikka;
270        SahkoansaSahko.Image = SahkoansaSahkoKuva;
271        SahkoansaSahko.Tag = "SahkoansaSahko";
272        Add(SahkoansaSahko);
273        SahkoansaSahko.RotateImage = true;
274        SahkoansaSahko.Angle = kaanna;
275        return SahkoansaSahko;
276    }
277
278    void LisaaTykki(Vector paikka, double leveys, double korkeus)
279    {
280        Tykki tykki = new Tykki(leveys, korkeus);
281        tykki.Position = paikka;
282        tykki.Image = TykkiKuva;
283        tykki.Tag = "Tykki";
284        Add(tykki);
285
286        AssaultRifle tykkiAse = new AssaultRifle(30, 10);
287        tykkiAse.IsVisible = false;
288        tykkiAse.Power.MaxValue = 50;
289        tykkiAse.FireRate = 0.5;
290        tykkiAse.ProjectileCollision = AmmusOsuiPelaajaan;
291        tykki.Add(tykkiAse);
292
293        Timer tykkiAjastin = new Timer();
294        tykkiAjastin.Interval = 0.5;
295        tykkiAjastin.Timeout += delegate
296        {
297            AmmuAseella(tykkiAse);
298        };
299        tykkiAjastin.Start();
300
301        tykki.Destroyed += delegate { tykkiAjastin.Stop(); };
302
303        Label pisteNaytto = new Label();
304        //pisteNaytto.Position = Camera.WorldToScreen(paikka);
305        pisteNaytto.TextColor = Color.Red;
306        pisteNaytto.BindTo(tykki.ElamaLaskuri);
307        tykki.Add(pisteNaytto);
308
309    }
310
311    void LisaaNappaimet()
312    {
313        Keyboard.Listen(Key.F1, ButtonState.Pressed, ShowControlHelp, "Näytä ohjeet");
314        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
315
316        //Pelaajan 1 näppäimet
317        Keyboard.Listen(Key.Left, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", pelaaja1, new Vector(-nopeus, 0));
318        Keyboard.Listen(Key.Right, ButtonState.Down, Liikuta, "Liikkuu oikealle", pelaaja1, new Vector(nopeus, 0));
319        Keyboard.Listen(Key.Up, ButtonState.Down, Liikuta, "Pelaaja liikkuu ylöspäin", pelaaja1, new Vector(0, nopeus));
320        Keyboard.Listen(Key.Down, ButtonState.Down, Liikuta, "pelaaja liikkuu alaspäin", pelaaja1, new Vector(0, -nopeus));
321        Mouse.Listen(MouseButton.Left, ButtonState.Down, AmmuAseella, "Ammu", pelaajan1Ase);
322        Mouse.ListenMovement(0.1, Tahtaa, "Tähtää aseella");
323
324
325        ControllerOne.Listen(Button.Back, ButtonState.Pressed, Exit, "Poistu pelistä");
326        ControllerOne.Listen(Button.DPadUp, ButtonState.Down, Liikuta, "Pelaaja liikkuu ylöspäin", pelaaja1, new Vector(0, nopeus));
327        ControllerOne.Listen(Button.DPadDown, ButtonState.Down, Liikuta, "pelaaja liikkuu alaspäin", pelaaja1, new Vector(0, -nopeus));
328        ControllerOne.Listen(Button.DPadLeft, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", pelaaja1, new Vector(-nopeus, 0));
329        ControllerOne.Listen(Button.DPadRight, ButtonState.Down, Liikuta, "Liikkuu oikealle", pelaaja1, new Vector(nopeus, 0));
330        ControllerOne.Listen(Button.A, ButtonState.Down, AmmuAseella, "Ammu", pelaajan1Ase);
331        ControllerOne.ListenAnalog(AnalogControl.RightStick, 0.1, Tahtaa2, "Liikuta pelaajaa tattia pyörittämällä.", pelaajan1Ase);
332
333
334        // Pelaajan 2 ohjaimet
335        ControllerTwo.Listen(Button.DPadUp, ButtonState.Down, Liikuta, "Pelaaja liikkuu ylöspäin", pelaaja2, new Vector(0, nopeus));
336        ControllerTwo.Listen(Button.DPadDown, ButtonState.Down, Liikuta, "pelaaja liikkuu alaspäin", pelaaja2, new Vector(0, -nopeus));
337        ControllerTwo.Listen(Button.DPadLeft, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", pelaaja2, new Vector(-nopeus, 0));
338        ControllerTwo.Listen(Button.DPadRight, ButtonState.Down, Liikuta, "Liikkuu oikealle", pelaaja2, new Vector(nopeus, 0));
339        ControllerTwo.Listen(Button.A, ButtonState.Down, AmmuAseella, "Ammu", pelaajan2Ase);
340        ControllerTwo.ListenAnalog(AnalogControl.RightStick, 0.1, Tahtaa2, "Liikuta pelaajaa tattia pyörittämällä.", pelaajan2Ase);
341
342
343
344        PhoneBackButton.Listen(ConfirmExit, "Lopeta peli");
345    }
346
347    void Tahtaa2(AnalogState tatinTila, AssaultRifle ase)
348    {
349        ase.Angle = tatinTila.StateVector.Angle;
350    }
351
352    void Liikuta(PhysicsObject hahmo, Vector nopeus)
353    {
354        hahmo.Push(nopeus);
355    }
356
357
358
359    void TormaaTahteen(PhysicsObject hahmo, PhysicsObject tahti)
360    {
361        maaliAani.Play();
362        MessageDisplay.Add("Keräsit tähden!");
363        tahti.Destroy();
364        tahtiMittari.Value += 1;
365    }
366
367    void TormaaLaskeutumiseen(PhysicsObject hahmo, PhysicsObject Laskeutuminen)
368    {
369
370        MessageDisplay.Add("Läpäisit tason");
371        if (tahtiaKeratty[kenttaNRO] < tahtiMittari.Value) tahtiaKeratty[kenttaNRO] = tahtiMittari.Value;
372        Timer.SingleShot(1, Voitit);
373    }
374
375
376    void AmmusOsui(PhysicsObject ammus, PhysicsObject kohde)
377    {
378        ammus.Destroy();
379        if(kohde.Tag.ToString() == "SahkoansaTykki")
380        {
381            ((SahkoansaTykki)kohde).ElamaLaskuri.Value -= 10;
382        }
383        if (kohde.Tag.ToString() == "Tykki")
384        {
385
386            ((Tykki)kohde).ElamaLaskuri.Value -= 10;
387
388        }
389    }
390
391    void AmmusOsuiPelaajaan(PhysicsObject ammus, PhysicsObject kohde)
392    {
393        ammus.Destroy();
394        if (kohde.Tag.ToString() == "pelaaja1")
395        {
396            TuhoaPelaaja(pelaaja1, ammus);
397        }
398        if (kohde.Tag.ToString() == "pelaaja2")
399        {
400            TuhoaPelaaja(pelaaja2, ammus);
401        }
402
403    }
404
405    void Tahtaa(AnalogState hiirenLiike)
406    {
407        Vector suunta = (Mouse.PositionOnWorld - pelaajan1Ase.AbsolutePosition).Normalize();
408        pelaajan1Ase.Angle = suunta.Angle;
409    }
410    void AmmuAseella(AssaultRifle ase)
411    {
412        PhysicsObject ammus = ase.Shoot();
413
414        if (ammus != null)
415        {
416            ammus.Size *= 1;
417            //ammus.Image = ...
418            ammus.MaximumLifetime = TimeSpan.FromSeconds(200.0);
419        }
420    }
421
422    void TuhoaPelaaja(PhysicsObject pelaaja, PhysicsObject kohde)
423    {
424        pelaaja.Destroy();
425        Explosion rajahdys = new Explosion(500);
426        rajahdys.Position = pelaaja.Position;
427        Add(rajahdys);
428       
429        Timer.SingleShot(2, delegate { if (pelaaja1.IsDestroyed && pelaaja2.IsDestroyed)
430            {
431                Mouse.Disable(MouseButton.Left);
432                Havisit();
433            }
434        });
435    }
436
437    void Havisit()
438    {
439        ClearAll();
440        Level.Background.Color = Color.Black;
441        MultiSelectWindow havioValikko = new MultiSelectWindow("Hävisit pelin", "Aloita alusta", "Päävalikko", "Lopeta");
442        Add(havioValikko);
443        havioValikko.AddItemHandler(0, delegate { AloitaPeli(kenttaNRO); });
444        havioValikko.AddItemHandler(1, LuoPaavalikko);
445        havioValikko.AddItemHandler(2, Exit);
446    }
447
448    void Voitit()
449    {
450        ClearAll();
451        Level.Background.Color = Color.Black;
452        MultiSelectWindow voittoValikko = new MultiSelectWindow("Taso suoritettu", "Pelaa uudelleen", "Päävalikko","Seuraava kenttä", "Lopeta");
453        Add(voittoValikko);
454        voittoValikko.AddItemHandler(0, delegate { AloitaPeli(kenttaNRO); });
455        voittoValikko.AddItemHandler(1, LuoPaavalikko);
456        voittoValikko.AddItemHandler(2, delegate { if ((kenttaNRO >= maxKentat)) { MessageWindow ikkuna = new MessageWindow("Ei lisää kenttiä vielä!"); Add(ikkuna); ikkuna.Closed += PalaaPaavalikkoon; } else AloitaPeli(kenttaNRO += 1); });
457        voittoValikko.AddItemHandler(3, Exit);
458
459    }
460
461    protected override void OnExiting(object sender, EventArgs args)
462    {
463        int j = 0;
464        for (int i = 1; i <= maxKentat; i++)
465        {
466            tahtiaKerattyTaulukko[j] = tahtiaKeratty[i];
467        }
468        SaveGame("tilanne.xml");
469        base.OnExiting(sender, args);
470    }
471
472}
473   
474
475
476class SahkoansaTykki : PhysicsObject
477{
478    private IntMeter elamaLaskuri = new IntMeter(50, 0, 50);
479
480    private PhysicsObject sahko;
481    public IntMeter ElamaLaskuri { get { return elamaLaskuri; } }
482
483    public SahkoansaTykki(double leveys, double korkeus, PhysicsObject sahko)
484        : base(leveys, korkeus)
485    {
486        MakeStatic();
487        this.sahko = sahko;
488        elamaLaskuri.LowerLimit += delegate { this.sahko.Destroy(); this.Destroy(); };
489    }
490
491
492
493
494}
495
496class Tykki : PhysicsObject
497{
498    private IntMeter elamaLaskuri = new IntMeter(20, 0, 20);
499    public IntMeter ElamaLaskuri { get { return elamaLaskuri; } }
500
501    public Tykki(double leveys, double korkeus)
502        : base(leveys, korkeus)
503    {
504        MakeStatic();
505        elamaLaskuri.LowerLimit += delegate { this.Destroy(); };
506    }
507}
Note: See TracBrowser for help on using the repository browser.