source: 2016/27/PaavoH/UltimateAdventure/UltimateAdventure/UltimateAdventure/UltimateAdventure.cs @ 8417

Revision 8417, 19.4 KB checked in by tesatapa, 2 years ago (diff)
Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4using Jypeli.Assets;
5using Jypeli.Controls;
6using Jypeli.Effects;
7using Jypeli.Widgets;
8using System.IO;
9
10public class UltimateAdventure : PhysicsGame
11{
12    double nopeus = 200;
13    const double JumpSpeed = 750;
14    const int RUUDUN_KOKO = 40;
15    IntMeter Pommit = new IntMeter(50);
16    Double Painovoima = -1000;
17    bool saapiiskata = true;
18    bool saapommittaa = true;
19    PushButton TextureButton;
20    DoubleMeter aani = new DoubleMeter(0, 0, 1);
21    private IntMeter OxygenMeter;
22
23    PlatformCharacter pelaaja1;
24    IntMeter elamaLaskuri;
25
26    Image pelaajanKuva = LoadImage("norsu");
27    Image tahtiKuva = LoadImage("tahti");
28    Image Bpimage = LoadImage("stoneplatform");
29    Image silmamobimage = LoadImage("silmamob");
30    Image veripartikkeli = LoadImage("veripartikkeli");
31    Image playerhealth = LoadImage("playerhealth");
32    Image Bomb = LoadImage("bomb");
33    Image Arrow = LoadImage("Arrow");
34    Image PhysicBlockImage = LoadImage("PhysicBlockTexture");
35    Image TurretImage = LoadImage("TurretTextureV1");
36    Image Snake = LoadImage("snake");
37    Image Player = LoadImage("PlayerV2");
38    Image SpeedShoeImage = LoadImage("SpeedShoe");
39    Image MoonstoneImage = LoadImage("Moonstone");
40    Image WizardrWand = LoadImage("WizardingWandV3");
41    Image LogoImage = LoadImage("LogoV1");
42
43    SoundEffect maaliAani = LoadSoundEffect("maali");
44    SoundEffect WizardZap = LoadSoundEffect("WizardZap");
45    Animation Ruoskanimaatio;
46
47    double aanenvoimakkuus = 0.1;
48
49    public override void Begin()
50    {
51        Ruoskanimaatio = LoadAnimation("ruoska");
52        LuoAlkuValikko();
53
54
55    }
56
57    void LuoAlkuValikko()
58    {
59        ClearAll();
60        Logo();
61        MultiSelectWindow alkuValikko = new MultiSelectWindow("UltimateAdventure", "Aloita peli", "Options", "Avaa valittu kenttä","Lopeta");
62
63        alkuValikko.AddItemHandler(0, AloitaPeli);
64        alkuValikko.AddItemHandler(1, MenuOptions);
65        alkuValikko.AddItemHandler(2, SelectLevel);
66        alkuValikko.AddItemHandler(3, Exit);
67
68        Add(alkuValikko);
69    }
70    void LuoPeliValikko()
71    {
72        MultiSelectWindow Pelivalikko = new MultiSelectWindow(" ", "Jatka peliä", "Options", "Lopeta");
73
74        //Pelivalikko.AddItemHandler(0, AloitaPeli);
75        Pelivalikko.AddItemHandler(1, PeliOptions);
76        Pelivalikko.AddItemHandler(2, Exit);
77
78        Add(Pelivalikko);
79    }
80
81    void Logo()
82    {
83        GameObject Logo = new GameObject(500,500);
84        Logo.Image = LogoImage;
85        Add(Logo);
86    }
87    void AloitaPeli()
88    {
89        StartLevel("kentta1");
90
91    }
92    void StartLevel(String LevelName)
93    {
94        ClearAll();
95        Gravity = new Vector(0, Painovoima);
96
97        AddLevel(LevelName);
98        LisaaNappaimet();
99        LuoElamaLaskuri();
100        CreateOxygenMeter();
101        Camera.Follow(pelaaja1);
102        Camera.ZoomFactor = 2.8;
103        Camera.StayInLevel = true;
104
105        Label PommienMaara = new Label(Pommit);
106        PommienMaara.X = Screen.Right - 150;
107        PommienMaara.Y = Screen.Top - 150;
108        Add(PommienMaara);
109
110    }
111
112
113    void MenuOptions()
114    {
115        Options();
116        BackButton();
117    }
118    void Options()
119    {
120        Mouse.IsCursorVisible = true;
121        Slider liukusaadin = LuoSlider();
122        Add(liukusaadin);
123        TeeTextureButton();
124    }
125
126    void SelectLevel()
127    {
128        InputWindow AskWindow = new InputWindow("What level you want to play.");
129        AskWindow.TextEntered += ProcessInput;
130        Add(AskWindow);
131        BackButton();
132    }
133
134    void ProcessInput(InputWindow window)
135    {
136        string answer = window.InputBox.Text;
137        if (answer == null || answer == "") return;
138        FileStream stream = null;
139        bool success = true;
140        try 
141        {
142            stream = File.Open("Content\\" + answer+".xnb", FileMode.Open);
143        }
144        catch (FileNotFoundException f)
145        {
146            success = false;
147        }
148        finally
149        {
150            if(stream != null)
151                stream.Close();
152        }
153        if (success)
154            StartLevel(answer);
155        else
156            SelectLevel();
157    }
158   
159
160    void PeliOptions()
161    {
162        Options();
163        TeeSuljePeliOptions();
164    }
165    void TeeTextureButton()
166    {
167        TextureButton = new PushButton("" + SmoothTextures);
168        TextureButton.Y = -100;
169        TextureButton.Clicked += PaivitaTextureButton;
170        TextureButton.Tag = "Options";
171
172        Add(TextureButton);
173    }
174    void PaivitaTextureButton()
175    {
176        SmoothTextures = !SmoothTextures;
177        TextureButton.Text = "" + SmoothTextures;
178    }
179    Slider LuoSlider()
180    {
181
182        aani.Changed += MuutaAanenvoimakuutta;
183
184        Slider liukusaadin = new Slider(200, 20);
185        liukusaadin.BindTo(aani);
186        liukusaadin.Tag = "Options";
187        liukusaadin.X = 0;
188        liukusaadin.Y = 0;
189
190        liukusaadin.Color = Color.GreenYellow;
191        liukusaadin.Knob.Image = tahtiKuva;
192        liukusaadin.Track.Color = Color.Black;
193        liukusaadin.BorderColor = Color.LightBlue;
194
195        return liukusaadin;
196
197    }
198    void BackButton()
199    {
200        PushButton BackNappain = new PushButton("Back");
201        BackNappain.Y = -300;
202        BackNappain.Clicked += LuoAlkuValikko;
203
204        Add(BackNappain);
205    }
206    void TeeSuljePeliOptions()
207    {
208        PushButton SuljePeliOptions = new PushButton("Back");
209        SuljePeliOptions.Y = -300;
210        SuljePeliOptions.Tag = "Options";
211        SuljePeliOptions.Clicked += JatkaPelia;
212
213        Add(SuljePeliOptions);
214    }
215
216    void JatkaPelia()
217    {
218        List<GameObject> Oliot = GetObjectsWithTag("Options");
219        foreach (GameObject item in Oliot)
220        {
221            item.Destroy();
222        }
223        IsMouseVisible = false;
224    }
225    void MuutaAanenvoimakuutta(double vanhaArvo, double uusiArvo)
226    {
227        aanenvoimakkuus = uusiArvo;
228        MessageDisplay.Add(aanenvoimakkuus.ToString());
229    }
230
231    void AddLevel(String LevelName)
232    {
233        TileMap level = TileMap.FromLevelAsset(LevelName);
234        level.SetTileMethod('#', LisaaSolid);
235        level.SetTileMethod('&', LisaaBp);
236        level.SetTileMethod('*', LisaaHealt);
237        level.SetTileMethod('o', LisaaPelaaja);
238        level.SetTileMethod('0', LisaaSilmamob);
239        level.SetTileMethod('5', LisaaSnakemob);
240        level.SetTileMethod('>', LisaaTurret);
241        level.SetTileMethod('☂', PhysicBlock);
242        level.SetTileMethod('7', LisaaSpeedBoots);
243        level.SetTileMethod('O', LisaaPommipakkaus);
244        level.SetTileMethod('U', Water);
245        level.SetTileMethod('W', Wizard);
246        level.SetTileMethod('C', Moonstone);
247        level.Execute(RUUDUN_KOKO, RUUDUN_KOKO);
248        Level.CreateBorders();
249        Level.Background.CreateGradient(Color.SkyBlue, Color.SkyBlue);
250    }
251
252    void LisaaSolid(Vector paikka, double leveys, double korkeus)
253    {
254        PhysicsObject taso = PhysicsObject.CreateStaticObject(leveys, korkeus);
255        taso.Position = paikka;
256        taso.Color = RandomGen.NextColor();
257        Add(taso);
258    }
259
260    void LisaaBp(Vector paikka, double leveys, double korkeus)
261    {
262        PhysicsObject taso = PhysicsObject.CreateStaticObject(leveys, korkeus);
263        taso.Position = paikka;
264        taso.Image = Bpimage;
265        Add(taso);
266    }
267
268    void LisaaTurret(Vector paikka, double leveys, double korkeus)
269    {
270        PhysicsObject Turret = PhysicsObject.CreateStaticObject(leveys, korkeus);
271        Turret.Position = paikka;
272        Turret.Image = TurretImage;
273        Add(Turret);
274
275
276        Timer ajastin = new Timer();
277        ajastin.Interval = 0.1;
278        ajastin.Timeout += delegate
279        {
280            if (pelaaja1.X > Turret.X && Math.Abs(pelaaja1.Y - Turret.Y) < 20)
281            {
282                PhysicsObject nuoli = new PhysicsObject(30, 5);
283                nuoli.Position = Turret.Position;
284                nuoli.Velocity = new Vector(1700, 0);
285                Add(nuoli);
286                nuoli.Image = Arrow;
287                nuoli.Tag = "nuoli";
288                //AddCollisionHandler(nuoli, CollisionHandler.DestroyObject);
289                ajastin.Stop();
290            }
291        };
292        ajastin.Start();
293    }
294
295    void PhysicBlock(Vector paikka, double leveys, double korkeus)
296    {
297        PhysicsObject PhysicBlock = new PhysicsObject(leveys, korkeus);
298        PhysicBlock.Position = paikka;
299        PhysicBlock.Image = PhysicBlockImage;
300        PhysicBlock.Mass = 200.0;
301        Add(PhysicBlock);
302    }
303
304    void Moonstone(Vector paikka, double leveys, double korkeus)
305    {
306        PhysicsObject Moonstone = PhysicsObject.CreateStaticObject(leveys, korkeus);
307        Moonstone.Position = paikka;
308        Moonstone.Image = MoonstoneImage;
309        Add(Moonstone);
310    }
311
312
313    void Water(Vector paikka, double leveys, double korkeus)
314    {
315        GameObject Water = new GameObject(leveys, korkeus);
316        Water.Position = paikka;
317        Water.Color = new Color(0, 0, 100, 55);
318        Add(Water, 2);
319        Water.Tag = "Water";
320    }
321
322
323
324    void LisaaHealt(Vector paikka, double leveys, double korkeus)
325    {
326        PhysicsObject healt = PhysicsObject.CreateStaticObject(leveys, korkeus);
327        healt.IgnoresCollisionResponse = true;
328        healt.Position = paikka;
329        healt.Image = tahtiKuva;
330        healt.Tag = "healt";
331        Add(healt);
332    }
333    void LisaaPommipakkaus(Vector paikka, double leveys, double korkeus)
334    {
335        PhysicsObject Pommipakkaus = PhysicsObject.CreateStaticObject(leveys, korkeus);
336        Pommipakkaus.IgnoresCollisionResponse = true;
337        Pommipakkaus.Position = paikka;
338        //Pommipakkaus.Image = tahtiKuva;
339        Pommipakkaus.Tag = "Pommipakkaus";
340        Add(Pommipakkaus);
341    }
342    void LisaaSpeedBoots(Vector paikka, double leveys, double korkeus)
343    {
344        PhysicsObject SpeedShoe = PhysicsObject.CreateStaticObject(leveys, korkeus);
345        SpeedShoe.IgnoresCollisionResponse = true;
346        SpeedShoe.Position = paikka;
347        SpeedShoe.Tag = "SpeedBoots";
348        SpeedShoe.Image = SpeedShoeImage;
349        Add(SpeedShoe);
350    }
351    void LisaaPelaaja(Vector paikka, double leveys, double korkeus)
352    {
353        pelaaja1 = new PlatformCharacter(leveys, korkeus);
354        pelaaja1.Position = paikka;
355        pelaaja1.Mass = 4.0;
356        pelaaja1.Image = Player;
357        pelaaja1.Tag = "pelaaja";
358        pelaaja1.Mass = 100.0;
359        AddCollisionHandler(pelaaja1, "healt", TormaaHealtiin);
360        AddCollisionHandler(pelaaja1, "silmamob", TormaaSilmaMobiin);
361        AddCollisionHandler(pelaaja1, "snake", TormaaSnakeen);
362        AddCollisionHandler(pelaaja1, "nuoli", TormaaNuoleen);
363        AddCollisionHandler(pelaaja1, "SpeedBoots", TormaaSpeedBootsiin);
364        AddCollisionHandler(pelaaja1, "Pommipakkaus", TormaaPommipakkaukseen);
365        Add(pelaaja1);
366    }
367
368
369    void LisaaMob(Vector paikka, double leveys, double korkeus, double massa, string tag, Brain aivo, Image kuva)
370    {
371        PlatformCharacter Mob = new PlatformCharacter(leveys, korkeus);
372        Mob.Position = paikka;
373        Mob.Mass = massa;
374        Mob.Image = kuva;
375        Add(Mob);
376        Mob.Tag = tag;
377        Mob.Brain = aivo;
378    }
379
380    void LisaaSilmamob(Vector paikka, double leveys, double korkeus)
381    {
382        PlatformWandererBrain aivot = new PlatformWandererBrain();
383        aivot.Speed = 100;
384
385        LisaaMob(paikka, leveys, korkeus, 2.0, "silmamob", aivot, silmamobimage);
386    }
387
388    void LisaaSnakemob(Vector paikka, double leveys, double korkeus)
389    {
390        PlatformWandererBrain aivot = new PlatformWandererBrain();
391        aivot.Speed = 100;
392
393        LisaaMob(paikka, leveys, korkeus, 3.0, "snake", aivot, Snake);
394    }
395
396    void Wizard(Vector paikka, double leveys, double korkeus)
397    {
398        PlatformCharacter Wizard = new PlatformCharacter(leveys, korkeus);
399        Wizard.Position = paikka;
400        Wizard.Image = Player;
401        Wizard.Tag = "Wizard";
402
403        FollowerBrain WizardBrain = new FollowerBrain(pelaaja1);
404        //WizardBrain.Speed = 100;
405        //WizardBrain.FallsOffPlatforms = true;
406        //WizardBrain.JumpSpeed = 700;
407        //WizardBrain.TriesToJump = true;
408
409        Wizard.Brain = WizardBrain;
410
411        Wizard.Weapon = new AssaultRifle(10, 10);
412        Wizard.Weapon.Position = new Vector(10,0);
413        Wizard.Weapon.AttackSound = WizardZap;
414        Wizard.Weapon.Image = WizardrWand;
415        //Wizard.Weapon.Image = WizardrWand; Ammuksen kuvaksi
416        Add(Wizard);
417
418        const double ampumisEtaisyys = 10*RUUDUN_KOKO;
419
420        Timer shootingtimer = new Timer();
421        shootingtimer.Interval = 0.75;
422        shootingtimer.Timeout += delegate
423        {
424            if (Vector.Distance(Wizard.Position, pelaaja1.Position) < ampumisEtaisyys)
425            {
426                Wizard.Weapon.Shoot();
427            }
428        };
429        shootingtimer.Start();
430
431    }
432
433
434    void LisaaNappaimet()
435    {
436        Keyboard.Listen(Key.F1, ButtonState.Pressed, ShowControlHelp, "Näytä ohjeet");
437        Keyboard.Listen(Key.Escape, ButtonState.Pressed, LuoPeliValikko, "Lopeta peli");
438
439        Keyboard.Listen(Key.A, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", pelaaja1, -1.0);
440        Keyboard.Listen(Key.D, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", pelaaja1, 1.0);
441        Keyboard.Listen(Key.W, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", pelaaja1, JumpSpeed);
442
443        Mouse.Listen(MouseButton.Left, ButtonState.Pressed, Lyo, "Pelaaja Lyö", pelaaja1);
444        Mouse.Listen(MouseButton.Right, ButtonState.Pressed, HeitaPommi, "Pelaaja heittää pommin", pelaaja1);
445
446        ControllerOne.Listen(Button.Back, ButtonState.Pressed, Exit, "Poistu pelistä");
447
448        ControllerOne.ListenAnalog(AnalogControl.LeftStick, 0.1, LiikutaPelaajaa, "Liikuta pelaajaa tattia pyörittämällä.");
449        ControllerOne.Listen(Button.A, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", pelaaja1, JumpSpeed);
450        ControllerOne.Listen(Button.RightShoulder, ButtonState.Pressed, HeitaPommi, "Pelaaja heittää pommin", pelaaja1);
451        ControllerOne.Listen(Button.LeftShoulder, ButtonState.Pressed, Lyo, "Pelaaja Lyö", pelaaja1);
452    }
453
454    void LiikutaPelaajaa(AnalogState tatinTila)
455    {
456        Vector tatinAsento = tatinTila.StateVector;
457        pelaaja1.Walk(tatinAsento.X * nopeus);
458    }
459    void Lyo(PlatformCharacter hahmo)
460    {
461        if (saapiiskata == false)
462            return;
463
464        saapiiskata = false;
465
466        PhysicsObject temp = new PhysicsObject(50, 20);
467        //temp.IsVisible = false;
468        temp.IgnoresGravity = true;
469        temp.IgnoresCollisionResponse = true;
470        temp.Destroyed += delegate { saapiiskata = true; };
471        Add(temp);
472        temp.Animation = new Animation(Ruoskanimaatio);
473        temp.Animation.Start();
474
475        AddCollisionHandler(temp, "silmamob", CollisionHandler.DestroyTarget);
476        AddCollisionHandler(temp, "snake", CollisionHandler.DestroyTarget);
477
478        Timer.SingleShot(1, temp.Destroy);
479
480        Timer ajastin = new Timer();
481        ajastin.Interval = 0.01;
482        ajastin.Timeout += delegate
483        {
484            if (hahmo.FacingDirection == Direction.Left)
485            {
486                temp.TextureWrapSize = new Vector(-1, 1);
487                temp.Position = new Vector((hahmo.Position.X - (hahmo.Width / 2) - (temp.Width * .35)), hahmo.Position.Y);
488            }
489            else
490            {
491                temp.TextureWrapSize = new Vector(1, 1);
492                temp.Position = new Vector((hahmo.Position.X + (hahmo.Width / 2) + (temp.Width * .35)), hahmo.Position.Y);
493            }
494        };
495        ajastin.Start();
496    }
497    void HeitaPommi(PlatformCharacter hahmo)
498    {
499        if (saapommittaa == false || Pommit.Value <= 0)
500            return;
501        Pommit.Value--;
502
503        saapommittaa = false;
504
505        Grenade Pommi = new Grenade(10.0);
506        //  Pommi.Destroyed += delegate { Pommit.AddValue(-1); };
507        hahmo.Throw(Pommi, Angle.FromDegrees(30), 10000);
508        Pommi.Image = Bomb;
509
510        Timer.SingleShot(.2, delegate { saapommittaa = true; });
511    }
512
513    void Liikuta(PlatformCharacter hahmo, double suunta)
514    {
515        hahmo.Walk(nopeus * suunta);
516    }
517
518    void Hyppaa(PlatformCharacter hahmo, double nopeus)
519    {
520        hahmo.Jump(nopeus);
521    }
522
523    void TormaaHealtiin(PhysicsObject hahmo, PhysicsObject healt)
524    {
525        maaliAani.Play(aanenvoimakkuus, 0.0, 0.0);
526        healt.Destroy();
527        elamaLaskuri.Value += 5;
528    }
529
530    void LuoElamaLaskuri()
531    {
532        elamaLaskuri = new IntMeter(10);
533        elamaLaskuri.MaxValue = 99;
534        elamaLaskuri.LowerLimit += ElamaLoppui;
535
536        Label ElamaKuva = new Label(playerhealth);
537        ElamaKuva.Size = new Vector(80, 80);
538        Add(ElamaKuva);
539
540        Label pisteNaytto = new Label();
541        pisteNaytto.X = Screen.Left + 100;
542        pisteNaytto.Y = Screen.Top - 100;
543        pisteNaytto.TextColor = Color.Black;
544        pisteNaytto.Color = Color.Red;
545        pisteNaytto.BindTo(elamaLaskuri);
546        Add(pisteNaytto);
547
548        ElamaKuva.X = pisteNaytto.X;
549        ElamaKuva.Y = pisteNaytto.Y;
550
551
552
553    }
554
555    void CreateOxygenMeter()
556    {
557        OxygenMeter = new IntMeter(10, 0, 10);
558        //OxygenMeter.LowerLimit += ElamaLoppui;
559
560        ProgressBar OxygenBar = new ProgressBar(500, 20);
561        OxygenBar.X = 0;
562        OxygenBar.Y = Screen.Top - 20;
563        OxygenBar.BindTo(OxygenMeter);
564        OxygenBar.Color = Color.MidnightBlue;
565        OxygenBar.BarColor = Color.LightBlue;
566        Add(OxygenBar);
567
568        Timer DrowningTimer = new Timer();
569        DrowningTimer.Interval = 0.5;
570        DrowningTimer.Timeout += CheckDrowning;
571        DrowningTimer.Start();
572    }
573
574    void CheckDrowning()
575    {
576        GameObject Water = GetObjectAt(pelaaja1.Position, "Water", 1);
577        if (Water == null)
578        {
579            OxygenMeter.Value++;
580        }
581        else
582        {
583            OxygenMeter.Value--;
584
585            if (OxygenMeter.Value == 0)
586            {
587                elamaLaskuri.Value--;
588            }
589        }
590    }
591
592
593
594    void ElamaLoppui()
595    {
596        pelaaja1.Destroy();
597        ExplosionSystem rajahdys = new ExplosionSystem(veripartikkeli, 100);
598        Add(rajahdys);
599        rajahdys.MaxScale = 1.0;
600        rajahdys.MaxVelocity = 20.0;
601        rajahdys.MinLifetime = 2.0;
602        int pMaara = 50;
603        Timer.SingleShot(3.0, ConfirmExit);
604
605
606
607        rajahdys.AddEffect(pelaaja1.X, pelaaja1.Y, pMaara);
608        //rajahdys.X = pelaaja1.X;
609        //rajahdys.Y = pelaaja1.Y;
610    }
611    void TormaaSilmaMobiin(PhysicsObject hahmo, PhysicsObject silmamob)
612    {
613        elamaLaskuri.Value -= 1;
614    }
615
616    void TormaaSnakeen(PhysicsObject hahmo, PhysicsObject silmamob)
617    {
618        elamaLaskuri.Value -= 1;
619    }
620
621    void TormaaNuoleen(PhysicsObject hahmo, PhysicsObject nuoli)
622    {
623        elamaLaskuri.Value -= 2;
624
625    }
626
627    void TormaaSpeedBootsiin(PhysicsObject hahmo, PhysicsObject SpeedBoots)
628    {
629        nopeus *= 2;
630        SpeedBoots.Destroy();
631        Timer.SingleShot(5.0, delegate { nopeus /= 2; });
632
633    }
634
635    void TormaaPommipakkaukseen(PhysicsObject hahmo, PhysicsObject Pommipakkaus)
636    {
637        Pommit.Value += 5;
638        Pommipakkaus.Destroy();
639    }
640}
Note: See TracBrowser for help on using the repository browser.