source: 2016/30/luennot/Kalvoralli/Kalvoralli/Kalvoralli/Kalvoralli.cs @ 8102

Revision 8102, 8.4 KB checked in by jotapoti, 7 years ago (diff)

Kalvoralliin tehty muutoksia, jotta toimii Deltan koneella.
Pallopeli, jossa aliohjelmalla voi luoda palloja.

Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4using Jypeli.Assets;
5using Jypeli.Controls;
6using Jypeli.Effects;
7using Jypeli.Widgets;
8
9public class Kalvoralli : PhysicsGame
10{
11    const double nopeus = 200;
12    const double hyppyNopeus = 750;
13    const int RUUDUN_KOKO = 40;
14    const int KALVON_LEVEYS = 800;
15    const int KALVON_KORKEUS = 600;
16
17    PlatformCharacter pelaaja1;
18
19    Image pelaajanKuva = LoadImage("norsu");
20    Image pelaajaRakettirepunKanssaKuva = LoadImage("norsurakettirepulla2");
21    Image tahtiKuva = LoadImage("tahti");
22    Image laatikonKuva = LoadImage("laatikko");
23
24    SoundEffect maaliAani = LoadSoundEffect("maali");
25
26    Vector poistumispaikka = Vector.Zero;
27    Vector spawnipiste;
28
29    Image[] kalvot = new Image[] {
30                                   LoadImage("tiistain_ohjelma"),
31                                   LoadImage("millaisia_peleja_jypelilla"),
32                                   LoadImage("ota_myos_huomioon"),
33                                   LoadImage("ideointi"),
34                                 };
35
36    int kenttanro = 0;
37
38    bool rakettireppuSaatu = false;
39
40    public override void Begin()
41    {
42        IsFullScreen = false;
43        Window.Width = 1024;
44        Window.Height = 768;
45
46        AloitaKalvoAlusta();
47    }
48
49    private void AloitaKalvoAlusta()
50    {
51        ClearAll();
52
53        Gravity = new Vector(0, -1000);
54
55        rakettireppuSaatu = false;
56
57        LuoKentta();
58
59        LisaaKalvoKenttaan();
60
61        LisaaNappaimet();
62
63        Camera.Follow(pelaaja1);
64    //    Camera.ZoomToLevel();
65        Camera.StayInLevel = true;
66    }
67
68    void LuoKentta()
69    {
70        if (kenttanro < 0)
71        {
72            kenttanro = 0;
73        }
74
75        if (kenttanro > kalvot.Length-1)
76        {
77            kenttanro = kalvot.Length-1;
78        }
79
80        TileMap kentta = TileMap.FromLevelAsset("kentta" + kenttanro);
81        kentta.SetTileMethod('#', LisaaPalikka);
82        kentta.SetTileMethod('*', LisaaTahti);
83        kentta.SetTileMethod('N', LisaaSpawnipiste);
84        kentta.SetTileMethod('r', LisaaRakettireppu);
85        kentta.Execute(RUUDUN_KOKO, RUUDUN_KOKO);
86        Level.CreateBottomBorder();
87        Level.CreateTopBorder();
88        PhysicsObject vasenReuna = Level.CreateLeftBorder();
89        PhysicsObject oikeaReuna = Level.CreateRightBorder();
90
91        LisaaPelaaja(RUUDUN_KOKO, RUUDUN_KOKO);
92
93        AddCollisionHandler(vasenReuna, "pelaaja", delegate(PhysicsObject vasenreuna, PhysicsObject hahmo) { kenttanro--; poistumispaikka = pelaaja1.Position; AloitaKalvoAlusta(); } );
94        AddCollisionHandler(oikeaReuna, "pelaaja", delegate(PhysicsObject oikeareuna, PhysicsObject hahmo) { kenttanro++; poistumispaikka = pelaaja1.Position; AloitaKalvoAlusta(); } );
95
96        Level.Background.CreateGradient(Color.Snow, Color.LightGray);
97    }
98
99    private void LisaaRakettireppu(Vector paikka, double leveys, double korkeus)
100    {
101        PhysicsObject rakettireppu = new PhysicsObject(leveys, korkeus);
102        rakettireppu.Image = laatikonKuva;
103        rakettireppu.Color = Color.Blue;
104        rakettireppu.Position = paikka;
105        rakettireppu.Tag = "rakettireppu";
106        Add(rakettireppu);
107    }
108
109    void LisaaKalvoKenttaan()
110    {
111        GameObject kalvo = new GameObject(KALVON_LEVEYS, KALVON_KORKEUS);
112        kalvo.Position = Vector.Zero;
113        kalvo.Image = kalvot[kenttanro];
114        Add(kalvo);
115    }
116
117    void LisaaPalikka(Vector paikka, double leveys, double korkeus)
118    {
119        PhysicsObject palikka = PhysicsObject.CreateStaticObject(leveys, korkeus);
120        palikka.Position = paikka;
121        palikka.Color = Color.Green;
122        Add(palikka);
123    }
124
125    void LisaaTahti(Vector paikka, double leveys, double korkeus)
126    {
127        PhysicsObject tahti = PhysicsObject.CreateStaticObject(leveys, korkeus);
128        tahti.IgnoresCollisionResponse = true;
129        tahti.Position = paikka;
130        tahti.Image = tahtiKuva;
131        tahti.Tag = "tahti";
132        Add(tahti);
133    }
134
135    void LisaaSpawnipiste(Vector paikka, double leveys, double korkeus)
136    {
137        spawnipiste = paikka;
138    }
139
140    void LisaaPelaaja(double leveys, double korkeus)
141    {
142        pelaaja1 = new PlatformCharacter(leveys, korkeus);
143       
144        Vector sisaantulopaikka = spawnipiste;
145
146        if (poistumispaikka != Vector.Zero)
147        {
148            sisaantulopaikka.Y = poistumispaikka.Y;
149            if (poistumispaikka.X > 0)
150            {
151                sisaantulopaikka.X = poistumispaikka.X - KALVON_LEVEYS; // TODO tässä luotetaan, että KALVON_LEVEYS on suunnilleen sama kuin kentän leveys
152            }
153            else
154            {
155                sisaantulopaikka.X = poistumispaikka.X + KALVON_LEVEYS; // TODO tässä luotetaan, että KALVON_LEVEYS on suunnilleen sama kuin kentän leveys
156            }
157        }
158
159        pelaaja1.Position = sisaantulopaikka;
160       
161        pelaaja1.Mass = 4.0;
162        pelaaja1.Image = pelaajanKuva;
163        pelaaja1.Tag = "pelaaja";
164        AddCollisionHandler(pelaaja1, "tahti", TormaaTahteen);
165        AddCollisionHandler(pelaaja1, "rakettireppu", TormaaRakettireppuun);
166        Add(pelaaja1);
167    }
168
169    void TormaaRakettireppuun(PhysicsObject tormaaja, PhysicsObject rakettireppuesine)
170    {
171        // TODO ota kuva käyttöön
172        pelaaja1.Image = pelaajaRakettirepunKanssaKuva;
173        rakettireppuSaatu = true;
174        rakettireppuesine.Destroy(); // poistetaan tavara pelikentältä
175    }
176
177    void LisaaNappaimet()
178    {
179        Keyboard.Listen(Key.F1, ButtonState.Pressed, ShowControlHelp, "Näytä ohjeet");
180        // TODO lisää mykistysnappi ääniä varten
181        // TODO lisää äänensäätöpainikkeet (vähemmän ja enemmän)
182        Keyboard.Listen(Key.F4, ButtonState.Pressed, delegate { kenttanro--; poistumispaikka = Vector.Zero; AloitaKalvoAlusta(); }, "Edellinen kalvo");
183        Keyboard.Listen(Key.F5, ButtonState.Pressed, AloitaKalvoAlusta, "Aloita kalvo uudelleen");
184        Keyboard.Listen(Key.F6, ButtonState.Pressed, delegate { kenttanro++; poistumispaikka = Vector.Zero; AloitaKalvoAlusta(); }, "Seuraava kalvo");
185
186        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
187
188        Keyboard.Listen(Key.Left, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", pelaaja1, -nopeus);
189        Keyboard.Listen(Key.Right, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", pelaaja1, nopeus);
190        Keyboard.Listen(Key.Up, ButtonState.Down, Hyppaa, "Pelaaja hyppää", pelaaja1, hyppyNopeus);
191
192        ControllerOne.Listen(Button.Back, ButtonState.Pressed, ConfirmExit, "Poistu pelistä");
193
194        ControllerOne.Listen(Button.DPadLeft, ButtonState.Down, Liikuta, "Pelaaja liikkuu vasemmalle", pelaaja1, -nopeus);
195        ControllerOne.Listen(Button.DPadRight, ButtonState.Down, Liikuta, "Pelaaja liikkuu oikealle", pelaaja1, nopeus);
196        ControllerOne.Listen(Button.A, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", pelaaja1, hyppyNopeus);
197    }
198
199    void Liikuta(PlatformCharacter hahmo, double nopeus)
200    {
201        hahmo.Walk(nopeus);
202    }
203
204    void Hyppaa(PlatformCharacter hahmo, double nopeus)
205    {
206        if (rakettireppuSaatu)
207        {
208            hahmo.ForceJump(nopeus / 10);
209           
210            PhysicsObject lieska = LuoLieska(new Vector(hahmo.X + hahmo.Width / 4.0, hahmo.Bottom), new TimeSpan(0, 0, 1), hahmo.Width / 2.0, hahmo.Height / 5.0);
211            lieska.Push(new Vector(0, -100));
212
213            PhysicsObject lieska2 = LuoLieska(new Vector(hahmo.X - hahmo.Width / 4.0, hahmo.Bottom), new TimeSpan(0, 0, 1), hahmo.Width / 2.0, hahmo.Height / 5.0);
214            lieska2.Push(new Vector(0, -100));
215           
216        }
217        else
218        {
219            hahmo.Jump(nopeus);
220        }
221       
222    }
223
224    PhysicsObject LuoLieska(Vector sijainti, TimeSpan elinaika, double leveys, double korkeus)
225    {
226        PhysicsObject lieska = new PhysicsObject(leveys, korkeus);
227        lieska.IgnoresCollisionResponse = true;
228        lieska.IgnoresExplosions = true;
229        lieska.Position = sijainti;
230        lieska.Image = tahtiKuva;
231        lieska.MaximumLifetime = elinaika;
232        Add(lieska);
233        return lieska;
234    }
235
236    void TormaaTahteen(PhysicsObject hahmo, PhysicsObject tahti)
237    {
238        maaliAani.Play();
239        //MessageDisplay.Add("Keräsit tähden!");
240        tahti.Destroy();
241    }
242}
Note: See TracBrowser for help on using the repository browser.