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

Revision 7938, 13.4 KB checked in by anvinurm, 7 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    const double nopeus = 2000;
14
15    const int RUUDUN_KOKO = 40;
16
17    IntMeter voimaMittari;
18    int kenttaNRO = 1;
19    const int maxKentat = 1;
20    PhysicsObject pelaaja1;
21
22    Image pelaajanKuva = LoadImage("Hahmo");
23    Image tahtiKuva = LoadImage("tahti");
24    Image kovaKuutio = LoadImage("kovaKuutio");
25    Image LaskeutuminenKuva = LoadImage("Laskeutuminen");
26    Image SahkoansaKuva = LoadImage("Sähköansa");
27    Image SahkoansaTykkiKuva = LoadImage("SahkoansaTykki");
28    Image SahkoansaSahkoKuva = LoadImage("SahkoansaSahko");
29    Image RajahdysKuva = LoadImage("Rajahdys");
30    Image TykkiKuva = LoadImage("Tykki");
31
32    AssaultRifle tykkiAse;
33
34    SoundEffect maaliAani = LoadSoundEffect("maali");
35
36    public override void Begin()
37    {
38        ClearAll();
39        LuoPaavalikko();
40    }
41
42    void LuoPaavalikko()
43    {
44        MultiSelectWindow alkuValikko = new MultiSelectWindow("Pelin alkuvalikko",
45"Pelaa", "Lopeta");
46        Add(alkuValikko);
47        alkuValikko.AddItemHandler(0, Pelaa);
48        alkuValikko.AddItemHandler(1, Exit);
49    }
50
51    void Pelaa()
52    {
53        MultiSelectWindow alkuValikko = new MultiSelectWindow("Valitse kenttä",
54"Kenntä 1", "Takaisin");
55        Add(alkuValikko);
56        alkuValikko.AddItemHandler(0, delegate { AloitaPeli(1); });
57        alkuValikko.AddItemHandler(1, LuoPaavalikko);
58
59    }
60
61    void AloitaPeli(int kentta)
62    {
63        this.kenttaNRO = kentta;
64        IsMouseVisible = true;
65        LuoKentta();
66        LuoTahtiLaskuri();
67        LisaaNappaimet();
68
69        Camera.Follow(pelaaja1);
70        Camera.ZoomFactor = 1.2;
71        Camera.StayInLevel = true;
72    }
73
74    void LuoKentta()
75    {
76        TileMap kentta = TileMap.FromLevelAsset("kentta"+kenttaNRO);
77        kentta.SetTileMethod('#', LisaaTaso);
78        kentta.SetTileMethod('*', LisaaTahti);
79        kentta.SetTileMethod('N', LisaaPelaaja);
80        kentta.SetTileMethod('L', LisaaLaskeutuminen);
81        kentta.SetTileMethod('R', LisaaSahkoansaTykkiVaaka);
82        kentta.SetTileMethod('S', LisaaSahkoansaTykkiPysty);
83        kentta.SetTileMethod('T', LisaaTykki);
84        kentta.Execute(RUUDUN_KOKO, RUUDUN_KOKO);
85        Level.CreateBorders();
86        Level.Background.CreateGradient(Color.White, Color.SkyBlue);
87        Level.Background.Image = LoadImage("kiviseina");
88    }
89
90    void LuoTahtiLaskuri()
91    {
92        voimaMittari = new IntMeter(0,0,3);
93        voimaMittari.UpperLimit += VoimaMittariTaynna;
94
95        ProgressBar voimaPalkki = new ProgressBar(150, 50);
96        voimaPalkki.X = Screen.Right - 250;
97        voimaPalkki.Y = Screen.Bottom + 100;
98        voimaPalkki.BindTo(voimaMittari);
99        voimaPalkki.Image = LoadImage("harmaatTahdet");
100        voimaPalkki.BarImage = LoadImage("kultaisetTahdet");
101        Add(voimaPalkki);
102
103    }
104
105    void VoimaMittariTaynna()
106    {
107        MessageDisplay.Add("Keräsit kaikki kolme tähteä!");
108    }
109
110    void LisaaTaso(Vector paikka, double leveys, double korkeus)
111    {
112        PhysicsObject taso = PhysicsObject.CreateStaticObject(leveys, korkeus);
113        taso.Position = paikka;
114        taso.Image = kovaKuutio;
115        Add(taso);
116    }
117
118    void LisaaTahti(Vector paikka, double leveys, double korkeus)
119    {
120        PhysicsObject tahti = PhysicsObject.CreateStaticObject(leveys, korkeus);
121        tahti.IgnoresCollisionResponse = true;
122        tahti.Position = paikka;
123        tahti.Image = tahtiKuva;
124        tahti.Tag = "tahti";
125        Add(tahti);
126    }
127
128    void LisaaPelaaja(Vector paikka, double leveys, double korkeus)
129    {
130        pelaaja1 = new PhysicsObject(leveys*0.9, korkeus*0.9);
131        pelaaja1.Position = paikka;
132        pelaaja1.Mass = 4.0;
133        pelaaja1.Image = pelaajanKuva;
134        AddCollisionHandler(pelaaja1, "SahkoansaSahko", TuhoaPelaaja);
135        AddCollisionHandler(pelaaja1, "tahti", TormaaTahteen);
136        AddCollisionHandler(pelaaja1, "Laskeutuminen", TormaaLaskeutumiseen);
137        Add(pelaaja1);
138        pelaaja1.LinearDamping = 0.9;
139        pelaaja1.Tag = "pelaaja";
140        pelaaja1.CanRotate = false;
141
142        tykkiAse = new AssaultRifle(30, 10);
143        tykkiAse.Power.MaxValue = 50;
144        tykkiAse.FireRate = 1;
145        tykkiAse.ProjectileCollision = AmmusOsui;
146        pelaaja1.Add(tykkiAse);
147
148       
149    }
150
151    void LisaaLaskeutuminen(Vector paikka, double leveys, double korkeus)
152    {
153        PhysicsObject Laskeutuminen = PhysicsObject.CreateStaticObject(leveys, korkeus);
154        Laskeutuminen.IgnoresCollisionResponse = true;
155        Laskeutuminen.Position = paikka;
156        Laskeutuminen.Image = LaskeutuminenKuva;
157        Laskeutuminen.Tag = "Laskeutuminen";
158        Add(Laskeutuminen);
159    }
160
161    void LisaaSahkoansaTykkiPysty(Vector paikka, double leveys, double korkeus)
162    {
163        PhysicsObject sahko = LisaaSahkoansaSahko(new Vector(paikka.X, paikka.Y-korkeus), leveys/2, korkeus, Angle.FromDegrees(0));
164        LisaaSahkoansaTykki(paikka, leveys, korkeus, sahko, Angle.FromDegrees(180));
165        LisaaSahkoansaTykki(new Vector(paikka.X, paikka.Y-korkeus*2), leveys, korkeus, sahko, Angle.FromDegrees(0));
166    }
167
168    void LisaaSahkoansaTykkiVaaka(Vector paikka, double leveys, double korkeus)
169    {
170        PhysicsObject sahko = LisaaSahkoansaSahko(new Vector(paikka.X + leveys, paikka.Y), leveys/2, korkeus, Angle.FromDegrees(-90));
171        LisaaSahkoansaTykki(paikka,leveys,korkeus,sahko, Angle.FromDegrees(-90));
172        LisaaSahkoansaTykki(new Vector(paikka.X + leveys*2, paikka.Y), leveys, korkeus, sahko, Angle.FromDegrees(90));
173    }
174
175    void LisaaSahkoansaTykki(Vector paikka, double leveys, double korkeus, PhysicsObject sahko, Angle kaanna)
176    {
177        SahkoansaTykki Sahkoansa = new SahkoansaTykki(leveys, korkeus, sahko);
178        Sahkoansa.Position = paikka;
179        Sahkoansa.Image = SahkoansaTykkiKuva;
180        Sahkoansa.Tag = "SahkoansaTykki";
181        Add(Sahkoansa);
182        Sahkoansa.RotateImage = true;
183        Sahkoansa.Angle = kaanna;
184
185        Label pisteNaytto = new Label();
186        //pisteNaytto.Position = Camera.WorldToScreen(paikka);
187        pisteNaytto.TextColor = Color.Red;
188        pisteNaytto.BindTo(Sahkoansa.ElamaLaskuri);
189        Sahkoansa.Add(pisteNaytto);
190    }
191
192
193
194    PhysicsObject LisaaSahkoansaSahko(Vector paikka, double leveys, double korkeus,Angle kaanna)
195    {
196        PhysicsObject SahkoansaSahko = PhysicsObject.CreateStaticObject(leveys, korkeus);
197        SahkoansaSahko.Position = paikka;
198        SahkoansaSahko.Image = SahkoansaSahkoKuva;
199        SahkoansaSahko.Tag = "SahkoansaSahko";
200        Add(SahkoansaSahko);
201        SahkoansaSahko.RotateImage = true;
202        SahkoansaSahko.Angle = kaanna;
203        return SahkoansaSahko;
204    }
205
206    void LisaaTykki(Vector paikka, double leveys, double korkeus)
207    {
208        Tykki tykki = new Tykki(leveys, korkeus);
209        tykki.Position = paikka;
210        tykki.Image = TykkiKuva;
211        tykki.Tag = "Tykki";
212        Add(tykki);
213
214        AssaultRifle tykkiAse = new AssaultRifle(30, 10);
215        tykkiAse.IsVisible = false;
216        tykkiAse.Power.MaxValue = 50;
217        tykkiAse.FireRate = 0.5;
218        tykkiAse.ProjectileCollision = AmmusOsuiPelaajaan;
219        tykki.Add(tykkiAse);
220
221        Timer tykkiAjastin = new Timer();
222        tykkiAjastin.Interval = 0.5;
223        tykkiAjastin.Timeout += delegate
224        {
225            AmmuAseella(tykkiAse);
226        };
227        tykkiAjastin.Start();
228
229        tykki.Destroyed += delegate { tykkiAjastin.Stop(); };
230
231        Label pisteNaytto = new Label();
232        //pisteNaytto.Position = Camera.WorldToScreen(paikka);
233        pisteNaytto.TextColor = Color.Red;
234        pisteNaytto.BindTo(tykki.ElamaLaskuri);
235        tykki.Add(pisteNaytto);
236
237    }
238
239    void LisaaNappaimet()
240    {
241        Keyboard.Listen(Key.F1, ButtonState.Pressed, ShowControlHelp, "Näytä ohjeet");
242        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
243
244        Keyboard.Listen(Key.Left, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", pelaaja1, new Vector(-nopeus, 0));
245        Keyboard.Listen(Key.Right, ButtonState.Down, Liikuta, "Liikkuu oikealle", pelaaja1, new Vector(nopeus, 0));
246        Keyboard.Listen(Key.Up, ButtonState.Down, Liikuta, "Pelaaja liikkuu ylöspäin", pelaaja1, new Vector(0, nopeus));
247        Keyboard.Listen(Key.Down, ButtonState.Down, Liikuta, "pelaaja liikkuu alaspäin", pelaaja1, new Vector(0, -nopeus));
248        Mouse.Listen(MouseButton.Left, ButtonState.Down, AmmuAseella, "Ammu", tykkiAse);
249        Mouse.ListenMovement(0.1, Tahtaa, "Tähtää aseella");
250
251
252        ControllerOne.Listen(Button.Back, ButtonState.Pressed, Exit, "Poistu pelistä");
253        ControllerOne.Listen(Button.DPadUp, ButtonState.Down, Liikuta, "Pelaaja liikkuu ylöspäin", pelaaja1, new Vector(0, nopeus));
254        ControllerOne.Listen(Button.DPadDown, ButtonState.Down, Liikuta, "pelaaja liikkuu alaspäin", pelaaja1, new Vector(0, -nopeus));
255        ControllerOne.Listen(Button.DPadLeft, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", pelaaja1, new Vector(-nopeus, 0));
256        ControllerOne.Listen(Button.DPadRight, ButtonState.Down, Liikuta, "Liikkuu oikealle", pelaaja1, new Vector(nopeus, 0));
257        ControllerOne.Listen(Button.A, ButtonState.Down, AmmuAseella, "Ammu", tykkiAse);
258        ControllerOne.ListenAnalog(AnalogControl.RightStick, 0.1, Tahtaa2, "Liikuta pelaajaa tattia pyörittämällä.");
259
260        PhoneBackButton.Listen(ConfirmExit, "Lopeta peli");
261    }
262
263    void Tahtaa2(AnalogState tatinTila)
264    {
265        tykkiAse.Angle = tatinTila.StateVector.Angle;
266    }
267
268    void Liikuta(PhysicsObject hahmo, Vector nopeus)
269    {
270        hahmo.Push(nopeus);
271    }
272
273
274
275    void TormaaTahteen(PhysicsObject hahmo, PhysicsObject tahti)
276    {
277        maaliAani.Play();
278        MessageDisplay.Add("Keräsit tähden!");
279        tahti.Destroy();
280        voimaMittari.Value += 1;
281    }
282
283    void TormaaLaskeutumiseen(PhysicsObject hahmo, PhysicsObject Laskeutuminen)
284    {
285
286    MessageDisplay.Add("Läpäisit tason");
287        Timer.SingleShot(1, Voitit);
288    }
289
290
291    void AmmusOsui(PhysicsObject ammus, PhysicsObject kohde)
292    {
293        ammus.Destroy();
294        if(kohde.Tag.ToString() == "SahkoansaTykki")
295        {
296            ((SahkoansaTykki)kohde).ElamaLaskuri.Value -= 10;
297        }
298        if (kohde.Tag.ToString() == "Tykki")
299        {
300
301            ((Tykki)kohde).ElamaLaskuri.Value -= 10;
302
303        }
304    }
305
306    void AmmusOsuiPelaajaan(PhysicsObject ammus, PhysicsObject kohde)
307    {
308        ammus.Destroy();
309        if (kohde.Tag.ToString() == "pelaaja")
310        {
311            TuhoaPelaaja(pelaaja1, ammus);
312        }
313
314    }
315
316    void Tahtaa(AnalogState hiirenLiike)
317    {
318        Vector suunta = (Mouse.PositionOnWorld - tykkiAse.AbsolutePosition).Normalize();
319        tykkiAse.Angle = suunta.Angle;
320    }
321    void AmmuAseella(AssaultRifle ase)
322    {
323        PhysicsObject ammus = ase.Shoot();
324
325        if (ammus != null)
326        {
327            ammus.Size *= 1;
328            //ammus.Image = ...
329            ammus.MaximumLifetime = TimeSpan.FromSeconds(200.0);
330        }
331    }
332
333    void TuhoaPelaaja(PhysicsObject pelaaja, PhysicsObject kohde)
334    {
335        pelaaja.Destroy();
336        Explosion rajahdys = new Explosion(500);
337        rajahdys.Position = pelaaja.Position;
338        Add(rajahdys);
339        Mouse.Disable(MouseButton.Left);
340        Timer.SingleShot(2, Havisit);
341    }
342
343    void Havisit()
344    {
345        ClearAll();
346        Level.Background.Color = Color.Black;
347        MultiSelectWindow havioValikko = new MultiSelectWindow("Hävisit pelin", "Aloita alusta", "Päävalikko", "Lopeta");
348        Add(havioValikko);
349        havioValikko.AddItemHandler(0, delegate { AloitaPeli(kenttaNRO); });
350        havioValikko.AddItemHandler(1, LuoPaavalikko);
351        havioValikko.AddItemHandler(2, Exit);
352    }
353
354    void Voitit()
355    {
356        ClearAll();
357        Level.Background.Color = Color.Black;
358        MultiSelectWindow voittoValikko = new MultiSelectWindow("Taso suoritettu", "Pelaa uudelleen", "Päävalikko","Seuraava kenttä", "Lopeta");
359        Add(voittoValikko);
360        voittoValikko.AddItemHandler(0, delegate { AloitaPeli(kenttaNRO); });
361        voittoValikko.AddItemHandler(1, LuoPaavalikko);
362        voittoValikko.AddItemHandler(2, delegate { if (!(kenttaNRO < maxKentat)) LuoPaavalikko(); AloitaPeli(kenttaNRO += 1); });
363        voittoValikko.AddItemHandler(3, Exit);
364
365    }
366
367}
368   
369
370
371class SahkoansaTykki : PhysicsObject
372{
373    private IntMeter elamaLaskuri = new IntMeter(50, 0, 50);
374
375    private PhysicsObject sahko;
376    public IntMeter ElamaLaskuri { get { return elamaLaskuri; } }
377
378    public SahkoansaTykki(double leveys, double korkeus, PhysicsObject sahko)
379        : base(leveys, korkeus)
380    {
381        MakeStatic();
382        this.sahko = sahko;
383        elamaLaskuri.LowerLimit += delegate { this.sahko.Destroy(); this.Destroy(); };
384    }
385
386
387
388
389}
390
391class Tykki : PhysicsObject
392{
393    private IntMeter elamaLaskuri = new IntMeter(20, 0, 20);
394    public IntMeter ElamaLaskuri { get { return elamaLaskuri; } }
395
396    public Tykki(double leveys, double korkeus)
397        : base(leveys, korkeus)
398    {
399        MakeStatic();
400        elamaLaskuri.LowerLimit += delegate { this.Destroy(); };
401    }
402}
Note: See TracBrowser for help on using the repository browser.