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

Revision 772, 18.9 KB checked in by lavevake, 12 years ago (diff)

Tein Rise of darknessin loppuun.

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(true);
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(bool seuraava)
233        {
234            ClearAll();
235           
236            LuoPistelaskuri();
237            pisteLaskuri.Reset();
238
239            if (seuraava)
240            {
241                kenttaNro += 1; // lisätään kenttänumeroa yhdellä
242            }
243            MessageDisplay.Add("Kenttä " + kenttaNro);
244
245            // Asetetaan painovoima
246            Gravity = new Vector(0, -1000);
247
248            LuoKentta(kenttaNro);
249            LisaaNappaimet();
250            Camera.Follow(pelaaja1);
251            LuoNaytot();
252            laskuri = new Timer();
253            laskuri.Interval = 0.001;
254            laskuri.Trigger += vahennaVirtaa;
255            Add(laskuri);
256            laskuri.Start();
257        }
258
259        private void LuoPistelaskuri()
260        {
261            // Luodaan pistelaskuri
262            pisteLaskuri = new IntMeter(0);
263
264            // luodaan pistelaskunäyttö
265            pisteNaytto = new ValueDisplay();
266            pisteNaytto.Text = "Pisteitä: ";
267            pisteNaytto.X = Screen.RightSafe - 250;
268            pisteNaytto.Y = Screen.TopSafe - 50;
269            pisteNaytto.BindTo(pisteLaskuri);
270            pisteNaytto.TextColor = Color.Yellow;
271            pisteNaytto.ValueColor = Color.Red;
272            Add(pisteNaytto);    // lisätään peliin
273
274        }
275
276        void LuoKentta(int kentanNro)
277        {
278            Level.Background.CreateGradient(Color.Black, Color.SkyBlue);
279            char[,] ruudut;
280            var merkit = new Dictionary<char, ObjectCreator>();
281            merkit['='] = LisaaTaso;
282            merkit['X'] = Pelaaja1;
283            merkit['0'] = LuoHirvio;
284            merkit['V'] = LuoVirta;
285            merkit['A'] = LisaaMaali;
286            merkit['E'] = LuoExtra;
287            merkit['R'] = LuoRaha;
288
289            if (kentanNro == 1)
290            {
291                ruudut = Tiles.ReadFromFile("Text.txt");
292                Tiles.Insert(this, ruudut, merkit, ruudunLeveys, ruudunKorkeus);
293                //lisaaMaali();
294            }
295
296            if (kentanNro == 2)
297            {
298                ruudut = Tiles.ReadFromFile("Text2.txt");
299                Tiles.Insert(this, ruudut, merkit, ruudunLeveys, ruudunKorkeus);
300            }
301
302            if (kentanNro == 3)
303            {
304                ruudut = Tiles.ReadFromFile("Text3.txt");
305                Tiles.Insert(this, ruudut, merkit, ruudunLeveys, ruudunKorkeus);
306            }
307            if (kentanNro > 3)
308            {
309                TextDisplay voitto = new TextDisplay();
310                voitto.Position = Screen.Center;
311                voitto.TextColor = Color.Orange;
312                Add(voitto);
313                voitto.Text = "Onnittelut. Voitit tohtori X:n ja palautit valon maailmaan. Pääsit pelin läpi!";
314            } 
315
316        }
317
318
319        PhysicsObject LisaaTaso()
320        {
321            PhysicsObject taso = PhysicsObject.CreateStaticObject(100, 30);
322            taso.Color = Color.Black;
323
324            Add(taso);
325            return taso;
326        }
327
328        PhysicsObject LisaaMaali()
329        {
330            PhysicsObject maali = PhysicsObject.CreateStaticObject(50, 50, Shapes.Circle);
331            maali.Tag = "maali";
332            maali.IgnoresCollisionResponse = true;
333            maali.Image = LoadImage("Kone 2");
334            return maali;
335        }
336
337        void LisaaNappaimet()
338        {
339            Keyboard.Listen(Key.F1, ButtonState.Pressed, ShowControlHelp, "Näytä ohjeet");
340            Keyboard.Listen(Key.Escape, ButtonState.Pressed, Exit, "Poistu pelistä");
341
342            Keyboard.Listen(Key.Left, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", -nopeus);
343            Keyboard.Listen(Key.Right, ButtonState.Down, Liikuta, "Liikkuu oikealle", nopeus);
344            Keyboard.Listen(Key.Up, ButtonState.Pressed, Hyppaa, "Hyppää", hyppyVoima);
345
346            LisaaGamePadNappaimet(ControllerOne);
347        }
348
349        void LisaaGamePadNappaimet(GamePad controller)
350        {
351            controller.Listen(Button.Back, ButtonState.Pressed, Exit, "Poistu pelistä");
352
353            controller.Listen(Button.DPadLeft, ButtonState.Down, Liikuta, "Pelaaja liikkuu vasemmalle", -nopeus);
354            controller.Listen(Button.DPadRight, ButtonState.Down, Liikuta, "Pelaaja liikkuu oikealle", nopeus);
355            controller.Listen(Button.A, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", hyppyVoima);
356        }
357
358        void Liikuta(double nopeus)
359        {
360            pelaaja1.Walk(nopeus);
361        }
362
363        void Hyppaa(double voima)
364        {
365            pelaaja1.Jump(voima);
366        }
367
368        void OsuiMaaliin(PhysicsObject collidingObject, PhysicsObject otherObject)
369        {
370            if (otherObject.Tag.ToString() == "maali")
371            {
372                this.PlaySound("maali");
373                int edellisenKentanPisteet = pisteLaskuri.Value;
374                seuraavaKentta(true);
375                MessageDisplay.Add("Pääsit läpi kentän " + kenttaNro + ". Pisteitä: " + edellisenKentanPisteet);
376            }
377        }
378
379        void LopetaPeli()
380        {
381            pelaaja1.Stop();
382
383            TextDisplay lopetus = new TextDisplay();
384            lopetus.Position = Screen.Center;
385            lopetus.TextColor = Color.LightGreen;
386            Add(lopetus);
387            lopetus.Text = "                                           Game over.\n" +
388            "Jos haluat aloittaa alusta, paina enter. Jos taas haluat lopettaa, paina Esc.";
389            ClearControls();
390            Keyboard.Listen(Key.Escape, ButtonState.Pressed, Valikkoon, "Poistu pelistä");
391            Keyboard.Listen(Key.Enter, ButtonState.Pressed, AloitaAlusta, null);
392
393            ControllerOne.Listen(Button.A, ButtonState.Down, Valikkoon, "Poistu pelistä");
394            ControllerOne.Listen(Button.B, ButtonState.Down,AloitaAlusta , null);
395
396        }
397
398        void Valikkoon()
399        {
400            AsetaPelitila(Pelitila.Valikko);
401        }
402
403        void KasitteleTormays(PhysicsObject pelaaja1, PhysicsObject toinen)
404        {
405            if (toinen.Tag.ToString() == "H")
406            {
407                if (voikoHirvioitaSyoda == true)
408                {
409                    toinen.Destroy();
410                    MessageDisplay.Add("Tuhosit hirviön!");
411                    pisteLaskuri.Value += 1;
412                }
413                else
414                {
415
416                    //Timer lopetus = new Timer();
417                    //lopetus.Interval = 0.01;
418                    //lopetus.Trigger += new Timer.TriggerHandler(lopetaPeli);
419                    //Add(lopetus);
420                    //lopetus.Enabled = true;
421
422                    LopetaPeli();
423                }
424            }
425
426            else if (toinen.Tag.ToString() == "V")
427            {
428                virtaLaskuri.Value += 1500;
429                MessageDisplay.Add("Sait lisää virtaa taskulamppuusi.");
430                toinen.Destroy();
431                pisteLaskuri.Value += 1;
432            }
433            else if (toinen.Tag.ToString() == "E")
434            {
435                voikoHirvioitaSyoda = true;
436
437
438
439                MessageDisplay.Add("Voit nyt syödä hirviöitä kymmenen sekunnin ajan!");
440
441                Timer syonti = new Timer();
442                syonti.Interval = 10;
443                syonti.Trigger += ajastin;
444                Add(syonti);
445                syonti.Start();
446
447                toinen.Destroy();
448
449                pisteLaskuri.Value += 1;
450            }
451            else if (toinen.Tag.ToString() == "R")
452            {
453                MessageDisplay.Add("Poimit rahan!");
454                pisteLaskuri.Value += 1;
455                toinen.Destroy();
456            }
457
458
459           
460        }
461
462        void LuoNaytot()
463        {
464            // viestinäytön väri valkoiseksi, jotta näkyy
465            MessageDisplay.TextColor = Color.White;
466
467            // polttoainelaskuri ja näytöt
468            virtaLaskuri = new DoubleMeter(virtaMaara);
469            virtaLaskuri.MaxValue = virtaMaara;
470            virtaLaskuri.LowerAlertValue = 750;
471            virtaLaskuri.DefaultValue = virtaMaara;
472            virtaLaskuri.LowerAlertValue = 1500;
473            virtaLaskuri.LowerAlert += virtaUhkaaLoppua;
474            virtaLaskuri.LowerLimit += virtaLoppui;
475
476            virtaNayttoBar = new BarGauge();
477            virtaNayttoBar.HorizontalOrigin = HorizontalAlignment.Left;
478            virtaNayttoBar.VerticalOrigin = VerticalAlignment.Top;
479            virtaNayttoBar.ValueColor = Color.Green;
480            virtaNayttoBar.Max = virtaMaara;
481            virtaNayttoBar.X = Screen.RightSafe - 20;
482            virtaNayttoBar.Y = Screen.TopSafe - 20;
483            virtaNayttoBar.Width = 30;
484            virtaNayttoBar.Height = 200;
485            virtaNayttoBar.BindTo(virtaLaskuri);
486            Add(virtaNayttoBar);
487
488            virtaNaytto = new ValueDisplay();
489            virtaNaytto.HorizontalOrigin = HorizontalAlignment.Left;
490            virtaNaytto.VerticalOrigin = VerticalAlignment.Top;
491            virtaNaytto.TextColor = Color.Wheat;
492            virtaNaytto.ValueColor = Color.Wheat;
493            virtaNaytto.X = Screen.RightSafe - 330;
494            virtaNaytto.Y = Screen.TopSafe;
495            virtaNaytto.BindTo(virtaLaskuri);
496            virtaNaytto.Text = "Virtaa jäljellä: ";
497            Add(virtaNaytto);
498        }
499
500        void virtaUhkaaLoppua(double maara)
501        {
502            virtaNaytto.ValueColor = Color.Red;
503            virtaNayttoBar.ValueColor = Color.Red;
504            MessageDisplay.Add("Varoitus: virta alkaa olla vähissä!");
505        }
506
507        void virtaLoppui(double polttoAineMaara)
508        {
509
510            //Timer lopetus = new Timer();
511            //lopetus.Interval = 0.01;
512            //lopetus.Trigger += new Timer.TriggerHandler(lopetaPeli);
513            //Add(lopetus);
514            //lopetus.Enabled = true;
515            LopetaPeli();
516        }
517
518        PhysicsObject Pelaaja1()
519        {
520            pelaaja1 = new PlatformCharacter(40, 40);
521            pelaaja1.Mass = 4.0;
522            pelaaja1.Image = LoadImage("Ukko 2");
523
524            AddCollisionHandler(pelaaja1, OsuiMaaliin);
525
526            AddCollisionHandler(pelaaja1, KasitteleTormays);
527
528            return pelaaja1;
529        }
530
531        PhysicsObject LuoHirvio()
532        {
533            Hirvio = new PlatformCharacter(80, 80);
534            Hirvio.Mass = 4.0;
535            Hirvio.Image = LoadImage("hirviö");
536           
537            FollowerBrain seuraajanAivot = new FollowerBrain();
538           
539            seuraajanAivot.Target = pelaaja1;
540
541            seuraajanAivot.MovingSpeed = 10;  // Millä nopeudella kohdetta seurataan
542
543            seuraajanAivot.FollowAlways = true; // Seurataanko kohdetta etäisyydestä riippumatta           
544
545            Hirvio.Brain = seuraajanAivot;
546
547            Hirvio.Tag = "H";
548
549            return Hirvio;
550
551        }
552
553        PhysicsObject LuoVirta()
554        {
555
556            Virta = new PhysicsObject(40, 40);
557            Virta.Mass = 4.0;
558            Virta.Image = LoadImage("Virta");
559
560            Virta.Tag = "V";
561
562            return Virta;
563        }
564
565        PhysicsObject LuoExtra()
566        {
567            Extra = new PhysicsObject(40, 40);
568            Extra.Mass = 4.0;
569            Extra.Image = LoadImage("Extra");
570
571            Extra.Tag = "E";
572
573            return Extra;
574        }
575
576        PhysicsObject LuoRaha()
577        {
578            Raha = new PhysicsObject(40, 40);
579            Raha.Mass = 4.0;
580            Raha.Image = LoadImage("Raha");
581
582            Raha.Tag = "R";
583
584            return Raha;
585        }
586
587
588        void ajastin(Timer sender)
589        {
590            MessageDisplay.Add("Et voi enää syödä hirviöitä.");
591            voikoHirvioitaSyoda = false;
592            sender.Stop();
593        }
594
595        void AloitaAlusta()
596        {
597            //kenttaNro = 0;
598            ClearAll();
599            seuraavaKentta(false);
600            // TODO: Aiheuttaa poikkeuksen??
601        }
602    }
603}
Note: See TracBrowser for help on using the repository browser.