source: 2010/23/lavevake/Rise of darkness/Peli.cs @ 737

Revision 737, 17.9 KB checked in by lavevake, 12 years ago (diff)

Tein Rise of darknessiin uuden kentän.

Line 
1using System.Collections.Generic;
2using Jypeli;
3using Jypeli.ScreenObjects;
4using Jypeli.Assets;
5
6
7namespace Rise_of_darkness //  Lauri Kemppi 2010. All rights reserved.
8{
9    class Tasohyppely : PhysicsGame
10    {
11
12        protected enum Pelitila { Valikko, Peli, UusiPeli, Loppu, EiMikaan }
13        Pelitila PelinTila = Pelitila.EiMikaan;
14        const int ruudunLeveys = 50;
15        const int ruudunKorkeus = 50;
16
17
18        const double nopeus = 200;
19        const double hyppyVoima = 4000;
20
21        IntMeter pisteLaskuri;
22        ValueDisplay pisteNaytto;
23        Timer laskuri;
24
25        const double virtaMaara = 5000;
26
27        bool voikoHirvioitaSyoda = false;
28
29        DoubleMeter virtaLaskuri;
30        ValueDisplay virtaNaytto;
31        BarGauge virtaNayttoBar;
32
33        PlatformCharacter pelaaja1;
34        PlatformCharacter Hirvio;
35        PhysicsObject Virta;
36        PhysicsObject Extra;
37        PhysicsObject Raha;
38
39        int kenttaNro; // monesko kenttä on menossa
40
41        // Valikkoon liittyvät jutut
42        Image valikonTaustakuva;
43        PhysicsObject ValikonKursori;
44        List<GameObject> ValikonValinnat = new List<GameObject>();
45
46
47        #region Pelitila ja valikko
48        protected bool AsetaPelitila(Pelitila tila)
49        {
50            if (PelinTila != tila)
51            {
52                PelinTila = tila;
53                switch (tila)
54                {
55                    case Pelitila.Valikko:
56                        {
57                            LataaValikko();
58                            NaytaValikko();
59                            break;
60                        }
61
62                    case Pelitila.Peli:
63                        {
64                            //Level.Clear();
65                            ClearAll();
66                            pelialkaa();
67                            break;
68                        }
69                    case Pelitila.UusiPeli:
70                        {
71                            AsetaPelitila(Pelitila.Peli);
72                            break;
73                        }
74
75
76                    case Pelitila.Loppu:
77                        {
78                            Exit();
79                            break;
80                        }
81                    default:
82                        break;
83                }
84
85                return true;
86            }
87            return false;
88        }
89
90        /// <summary>
91        /// Näyttää valikon
92        /// </summary>
93        void NaytaValikko()
94        {
95            ClearAll();
96            MessageDisplay.Add("Näytä valikko");
97            Camera.ZoomToLevel();
98            Level.Background.Image = valikonTaustakuva;
99            Level.Background.Size = new Vector(Screen.Width, Screen.Height);
100
101
102            foreach (GameObject gobj in ValikonValinnat)
103            {
104                Add(gobj);
105                Mouse.ListenOn(gobj, MouseButton.Left, ButtonState.Pressed, ValikkoKursorinValinta, null);
106            }
107
108            TextDisplay tekijat = new TextDisplay();
109            tekijat.TextColor = Color.Green;
110            tekijat.Text = "Tekijä:\n" +
111                "Ohjelmointi ja grafiikka: Lauri Kemppi\n";
112            tekijat.X = Screen.Center.X + 250;
113            tekijat.Y = Screen.Center.Y - 300;
114            Add(tekijat);
115
116            Add(ValikonKursori);
117
118            //Controls.Clear();
119            Mouse.IsCursorVisible = false;
120            Mouse.ListenMovement(1, ValikkoKursorinOhjaus, null);
121        }
122
123
124        /// <summary>
125        /// Päivittää kursorin sijainnin ja korostaa nappulan
126        /// </summary>
127        /// <param name="e"></param>
128        /// <returns></returns>
129        void ValikkoKursorinOhjaus(AnalogState a)
130        {
131            foreach (PhysicsObject gobj in ValikonValinnat)
132            {
133                //if (ValikonKursori.X >= gobj.Left && ValikonKursori.X <= gobj.Right &&
134                //  ValikonKursori.Top >= gobj.Bottom && ValikonKursori.Bottom <= gobj.Top)
135                if (Mouse.IsCursorOnGameObject(gobj))
136                {
137                    gobj.Image = LoadImage(gobj.Tag + "_");
138
139                }
140                else
141                    gobj.Image = LoadImage(gobj.Tag.ToString());
142            }
143
144            ValikonKursori.Position = Mouse.PositionOnScreen;
145        }
146
147        /// <summary>
148        /// Kun valikon nappulaa painetaan
149        /// </summary>
150        /// <param name="e"></param>
151        /// <returns></returns>
152        void ValikkoKursorinValinta()
153        {
154            foreach (PhysicsObject gobj in ValikonValinnat)
155            {
156                //if (ValikonKursori.X >= gobj.Left && ValikonKursori.X <= gobj.Right &&
157                //    ValikonKursori.Top >= gobj.Bottom && ValikonKursori.Bottom <= gobj.Top)
158                if (Mouse.IsCursorOnGameObject(gobj))
159                {
160                    switch (gobj.Tag.ToString())
161                    {
162                        case "aloita":
163                           
164                            AsetaPelitila(Pelitila.Peli);
165                            MessageDisplay.Add("Aloita peli");
166                            break;
167                        case "lopeta":
168                            AsetaPelitila(Pelitila.Loppu);
169                            MessageDisplay.Add("Lopeta");
170                            break;
171                    }
172                }
173            }
174        }
175
176        /// <summary>
177        /// Lataa valikon ja luo sen oliot, mutta ei lisää niitä kenttään
178        /// </summary>
179        void LataaValikko()
180        {
181            valikonTaustakuva = LoadImage("dark-castle-1");
182
183            LisaaNappula(0, 50, LoadImage("aloita"), "aloita");
184            LisaaNappula(0, -50, LoadImage("lopeta"), "lopeta");
185            ValikonKursori = PhysicsObject.CreateStaticObject(16, 16);
186            ValikonKursori.Shape = Shapes.Triangle;
187            ValikonKursori.Color = Color.DarkRed;
188        }
189
190        void LisaaNappula(double x, double y, Image kuva, string tagi)
191        {
192            PhysicsObject nappula = PhysicsObject.CreateStaticObject(200, 60, Shapes.Rectangle);
193            // TODO: Nappulat ScreenObjecteina, esim. TextDisplay
194            nappula.Tag = tagi;
195            nappula.X = x; nappula.Y = y;
196            nappula.Image = kuva;
197            //nappula.Color = Color.Aqua;
198
199            ValikonValinnat.Add(nappula);
200        }
201
202        #endregion
203
204        protected override void Begin()
205        {
206           
207            AsetaPelitila(Pelitila.Valikko);
208        }
209
210        private void pelialkaa()
211        {
212            kenttaNro = 0;
213            Level.Width = 2000;
214            Level.Height = 1000;
215
216
217            // Zoomataan lähemmäksi
218            Camera.ZoomFactor = 2.0;
219
220            Camera.StayInLevel = true;
221
222            seuraavaKentta();
223            MessageDisplay.Add("Pääse koneelle ennen kuin energia loppuu!");
224
225        }
226
227        void vahennaVirtaa(Timer t)
228        {
229            virtaLaskuri.Value -=7;
230        }
231
232        void seuraavaKentta()
233        {
234            ClearAll();
235           
236            LuoPistelaskuri();
237            pisteLaskuri.Reset();
238
239            kenttaNro += 1; // lisätään kenttänumeroa yhdellä
240            MessageDisplay.Add("Kenttä " + kenttaNro);
241
242            // Asetetaan painovoima
243            Gravity = new Vector(0, -1000);
244
245            LuoKentta(kenttaNro);
246            LisaaNappaimet();
247            Camera.Follow(pelaaja1);
248            LuoNaytot();
249            laskuri = new Timer();
250            laskuri.Interval = 0.001;
251            laskuri.Trigger += vahennaVirtaa;
252            Add(laskuri);
253            laskuri.Start();
254        }
255
256        private void LuoPistelaskuri()
257        {
258            // Luodaan pistelaskuri
259            pisteLaskuri = new IntMeter(0);
260
261            // luodaan pistelaskunäyttö
262            pisteNaytto = new ValueDisplay();
263            pisteNaytto.Text = "Pisteitä: ";
264            pisteNaytto.X = Screen.RightSafe - 250;
265            pisteNaytto.Y = Screen.TopSafe - 50;
266            pisteNaytto.BindTo(pisteLaskuri);
267            pisteNaytto.TextColor = Color.Yellow;
268            pisteNaytto.ValueColor = Color.Red;
269            Add(pisteNaytto);    // lisätään peliin
270
271        }
272
273        void LuoKentta(int kentanNro)
274        {
275            Level.Background.CreateGradient(Color.Black, Color.SkyBlue);
276            char[,] ruudut;
277            var merkit = new Dictionary<char, ObjectCreator>();
278            merkit['='] = LisaaTaso;
279            merkit['X'] = Pelaaja1;
280            merkit['0'] = LuoHirvio;
281            merkit['V'] = LuoVirta;
282            merkit['A'] = LisaaMaali;
283            merkit['E'] = LuoExtra;
284            merkit['R'] = LuoRaha;
285
286            if (kentanNro == 1)
287            {
288                ruudut = Tiles.ReadFromFile("Text.txt");
289                Tiles.Insert(this, ruudut, merkit, ruudunLeveys, ruudunKorkeus);
290                //lisaaMaali();
291            }
292
293            if (kentanNro == 2)
294            {
295                ruudut = Tiles.ReadFromFile("Text2.txt");
296                Tiles.Insert(this, ruudut, merkit, ruudunLeveys, ruudunKorkeus);
297            }
298
299            if (kentanNro > 2)
300            {
301                Exit();
302            }
303
304           
305
306        }
307
308
309        PhysicsObject LisaaTaso()
310        {
311            PhysicsObject taso = PhysicsObject.CreateStaticObject(100, 30);
312            taso.Color = Color.Black;
313
314            Add(taso);
315            return taso;
316        }
317
318        PhysicsObject LisaaMaali()
319        {
320            PhysicsObject maali = PhysicsObject.CreateStaticObject(50, 50, Shapes.Circle);
321            maali.Tag = "maali";
322            maali.IgnoresCollisionResponse = true;
323            maali.Image = LoadImage("Kone 2");
324            return maali;
325        }
326
327        void LisaaNappaimet()
328        {
329            Keyboard.Listen(Key.F1, ButtonState.Pressed, ShowControlHelp, "Näytä ohjeet");
330            Keyboard.Listen(Key.Escape, ButtonState.Pressed, Exit, "Poistu pelistä");
331
332            Keyboard.Listen(Key.Left, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", -nopeus);
333            Keyboard.Listen(Key.Right, ButtonState.Down, Liikuta, "Liikkuu oikealle", nopeus);
334            Keyboard.Listen(Key.Up, ButtonState.Pressed, Hyppaa, "Hyppää", hyppyVoima);
335
336            LisaaGamePadNappaimet(ControllerOne);
337        }
338
339        void LisaaGamePadNappaimet(GamePad controller)
340        {
341            controller.Listen(Button.Back, ButtonState.Pressed, Exit, "Poistu pelistä");
342
343            controller.Listen(Button.DPadLeft, ButtonState.Down, Liikuta, "Pelaaja liikkuu vasemmalle", -nopeus);
344            controller.Listen(Button.DPadRight, ButtonState.Down, Liikuta, "Pelaaja liikkuu oikealle", nopeus);
345            controller.Listen(Button.A, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", hyppyVoima);
346        }
347
348        void Liikuta(double nopeus)
349        {
350            pelaaja1.Walk(nopeus);
351        }
352
353        void Hyppaa(double voima)
354        {
355            pelaaja1.Jump(voima);
356        }
357
358        void OsuiMaaliin(PhysicsObject collidingObject, PhysicsObject otherObject)
359        {
360            if (otherObject.Tag.ToString() == "maali")
361            {
362                this.PlaySound("maali");
363                int edellisenKentanPisteet = pisteLaskuri.Value;
364                seuraavaKentta();
365                MessageDisplay.Add("Pääsit läpi kentän " + kenttaNro + ". Pisteitä: " + edellisenKentanPisteet);
366            }
367        }
368
369        void LopetaPeli()
370        {
371            pelaaja1.Stop();
372
373            TextDisplay lopetus = new TextDisplay();
374            lopetus.Position = Screen.Center;
375            lopetus.TextColor = Color.Red;
376            Add(lopetus);
377            lopetus.Text = "                              Game over.\n" +
378            "Jos haluat aloittaa alusta, paina enter. Jos taas haluat lopettaa, paina Esc.";
379            ClearControls();
380            Keyboard.Listen(Key.Escape, ButtonState.Pressed, Valikkoon, "Poistu pelistä");
381            Keyboard.Listen(Key.Enter, ButtonState.Pressed, AloitaAlusta, null);
382            //controller.Listen(Button.A, ButtonState.Pressed, AloitaAlusta, null);
383
384        }
385
386        void Valikkoon()
387        {
388            AsetaPelitila(Pelitila.Valikko);
389        }
390
391        void KasitteleTormays(PhysicsObject pelaaja1, PhysicsObject toinen)
392        {
393            if (toinen.Tag.ToString() == "H")
394            {
395                if (voikoHirvioitaSyoda == true)
396                {
397                    toinen.Destroy();
398                    MessageDisplay.Add("Tuhosit hirviön!");
399                    pisteLaskuri.Value += 1;
400                }
401                else
402                {
403
404                    //Timer lopetus = new Timer();
405                    //lopetus.Interval = 0.01;
406                    //lopetus.Trigger += new Timer.TriggerHandler(lopetaPeli);
407                    //Add(lopetus);
408                    //lopetus.Enabled = true;
409
410                    LopetaPeli();
411                }
412            }
413
414            else if (toinen.Tag.ToString() == "V")
415            {
416                virtaLaskuri.Value += 1500;
417                MessageDisplay.Add("Sait lisää virtaa taskulamppuusi.");
418                toinen.Destroy();
419                pisteLaskuri.Value += 1;
420            }
421            else if (toinen.Tag.ToString() == "E")
422            {
423                voikoHirvioitaSyoda = true;
424
425
426
427                MessageDisplay.Add("Voit nyt syödä hirviöitä kymmenen sekunnin ajan!");
428
429                Timer syonti = new Timer();
430                syonti.Interval = 10;
431                syonti.Trigger += ajastin;
432                Add(syonti);
433                syonti.Start();
434
435                toinen.Destroy();
436
437                pisteLaskuri.Value += 1;
438            }
439            else if (toinen.Tag.ToString() == "R")
440            {
441                MessageDisplay.Add("Poimit rahan!");
442                pisteLaskuri.Value += 1;
443                toinen.Destroy();
444            }
445        }
446
447        void LuoNaytot()
448        {
449            // viestinäytön väri valkoiseksi, jotta näkyy
450            MessageDisplay.TextColor = Color.White;
451
452            // polttoainelaskuri ja näytöt
453            virtaLaskuri = new DoubleMeter(virtaMaara);
454            virtaLaskuri.MaxValue = virtaMaara;
455            virtaLaskuri.LowerAlertValue = 750;
456            virtaLaskuri.DefaultValue = virtaMaara;
457            virtaLaskuri.LowerAlertValue = 1500;
458            virtaLaskuri.LowerAlert += virtaUhkaaLoppua;
459            virtaLaskuri.LowerLimit += virtaLoppui;
460
461            virtaNayttoBar = new BarGauge();
462            virtaNayttoBar.HorizontalOrigin = HorizontalAlignment.Left;
463            virtaNayttoBar.VerticalOrigin = VerticalAlignment.Top;
464            virtaNayttoBar.ValueColor = Color.Green;
465            virtaNayttoBar.Max = virtaMaara;
466            virtaNayttoBar.X = Screen.RightSafe - 20;
467            virtaNayttoBar.Y = Screen.TopSafe - 20;
468            virtaNayttoBar.Width = 30;
469            virtaNayttoBar.Height = 200;
470            virtaNayttoBar.BindTo(virtaLaskuri);
471            Add(virtaNayttoBar);
472
473            virtaNaytto = new ValueDisplay();
474            virtaNaytto.HorizontalOrigin = HorizontalAlignment.Left;
475            virtaNaytto.VerticalOrigin = VerticalAlignment.Top;
476            virtaNaytto.TextColor = Color.Wheat;
477            virtaNaytto.ValueColor = Color.Wheat;
478            virtaNaytto.X = Screen.RightSafe - 330;
479            virtaNaytto.Y = Screen.TopSafe;
480            virtaNaytto.BindTo(virtaLaskuri);
481            virtaNaytto.Text = "Virtaa jäljellä: ";
482            Add(virtaNaytto);
483        }
484
485        void virtaUhkaaLoppua(double maara)
486        {
487            virtaNaytto.ValueColor = Color.Red;
488            virtaNayttoBar.ValueColor = Color.Red;
489            MessageDisplay.Add("Varoitus: virta alkaa olla vähissä!");
490        }
491
492        void virtaLoppui(double polttoAineMaara)
493        {
494
495            //Timer lopetus = new Timer();
496            //lopetus.Interval = 0.01;
497            //lopetus.Trigger += new Timer.TriggerHandler(lopetaPeli);
498            //Add(lopetus);
499            //lopetus.Enabled = true;
500            LopetaPeli();
501        }
502
503        PhysicsObject Pelaaja1()
504        {
505            pelaaja1 = new PlatformCharacter(40, 40);
506            pelaaja1.Mass = 4.0;
507            pelaaja1.Image = LoadImage("Ukko 2");
508
509            AddCollisionHandler(pelaaja1, OsuiMaaliin);
510
511            AddCollisionHandler(pelaaja1, KasitteleTormays);
512
513            return pelaaja1;
514        }
515
516        PhysicsObject LuoHirvio()
517        {
518            Hirvio = new PlatformCharacter(80, 80);
519            Hirvio.Mass = 4.0;
520            Hirvio.Image = LoadImage("hirviö");
521
522            Hirvio.Tag = "H";
523
524            return Hirvio;
525
526        }
527
528        PhysicsObject LuoVirta()
529        {
530
531            Virta = new PhysicsObject(40, 40);
532            Virta.Mass = 4.0;
533            Virta.Image = LoadImage("Virta");
534
535            Virta.Tag = "V";
536
537            return Virta;
538        }
539
540        PhysicsObject LuoExtra()
541        {
542            Extra = new PhysicsObject(40, 40);
543            Extra.Mass = 4.0;
544            Extra.Image = LoadImage("Extra");
545
546            Extra.Tag = "E";
547
548            return Extra;
549        }
550
551        PhysicsObject LuoRaha()
552        {
553            Raha = new PhysicsObject(40, 40);
554            Raha.Mass = 4.0;
555            Raha.Image = LoadImage("Raha");
556
557            Raha.Tag = "R";
558
559            return Raha;
560        }
561
562        void ajastin(Timer sender)
563        {
564            MessageDisplay.Add("Et voi enää syödä hirviöitä.");
565            voikoHirvioitaSyoda = false;
566            sender.Stop();
567        }
568
569        void AloitaAlusta()
570        {
571            kenttaNro = 0;
572            seuraavaKentta(); // TODO: Aiheuttaa poikkeuksen??
573        }
574    }
575}
Note: See TracBrowser for help on using the repository browser.