source: 2013/27/JuhanaR/Korispeli/Korispeli/Korispeli/Korispeli.cs @ 4435

Revision 4435, 11.6 KB checked in by juronnbe, 8 years ago (diff)

Talletus.

Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4using Jypeli.Assets;
5using Jypeli.Controls;
6using Jypeli.Effects;
7using Jypeli.Widgets;
8
9public class Korispeli : PhysicsGame
10{
11    const double nopeus = 200;
12    const double hyppyNopeus = 750;
13    const int RUUDUN_KOKO = 40;
14    List<Pelaaja> pelaajat = new List<Pelaaja>();
15    int vuorossaOlevaPelaaja = 0;
16    PhysicsObject kori;
17
18    Pelihahmo pelaaja1;
19
20    Image pelaajanKuva = LoadImage("pelaaja1");
21    Image vastustajanKuva = LoadImage("Vastustaja");
22    Image tuomarinKuva = LoadImage("Tuomari");
23    Image korinKuva = LoadImage("tahti");
24    Image koripallonKuva = LoadImage("Koripallo");
25    Image koripallokorinKuva = LoadImage("Koripallokori");
26    Image nuolenkuva = LoadImage("Nuoli");
27    SoundEffect maaliAani = LoadSoundEffect("maali");
28
29    bool VoikoHeittaa = true;
30    int kenttaNro = 1;
31    IntMeter pelaajaLaskuri;
32
33    DoubleMeter heittovoima;
34
35    void LuoVoimamittari()
36    {
37        heittovoima = new DoubleMeter(0, 0, 100);
38        heittovoima.MaxValue = 10;
39        heittovoima.UpperLimit += delegate { heittovoima.Value = 0; };
40
41        ProgressBar heittoPalkki = new ProgressBar(150, 20);
42        heittoPalkki.X = Screen.Left + 15;
43        heittoPalkki.Y = 0;
44        heittoPalkki.Angle = Angle.RightAngle;
45        heittoPalkki.BindTo(heittovoima);
46        Add(heittoPalkki);
47    }
48    public override void Begin()
49    {
50        Level.Background.CreateGradient(Color.Black, Color.Orange);
51        Mouse.IsCursorVisible = true;
52        MultiSelectWindow alkuValikko = new MultiSelectWindow("Pelin alkuvalikko", "Aloita peli", "Lopeta");
53        alkuValikko.DefaultCancel = 1;
54        Add(alkuValikko);
55        alkuValikko.AddItemHandler(0, MontakoPelaajaa);
56        alkuValikko.AddItemHandler(1, Exit);
57    }
58
59    void MontakoPelaajaa()
60    {
61
62        pelaajaLaskuri = new IntMeter(1, 1, 10);
63        Label pelaajia = new Label();
64        pelaajia.BindTo(pelaajaLaskuri);
65        Add(pelaajia);
66
67        PushButton lisaa = new PushButton("Lisää");
68        lisaa.Position = pelaajia.Position + new Vector(0, -50);
69        lisaa.Clicked += delegate { pelaajaLaskuri.Value++; };
70        Add(lisaa);
71
72        PushButton vahenna = new PushButton("Vähennä");
73        vahenna.Position = lisaa.Position + new Vector(0, -50);
74        vahenna.Clicked += delegate { pelaajaLaskuri.Value--; };
75        Add(vahenna);
76
77        PushButton aloita = new PushButton("Aloita");
78        aloita.Position = vahenna.Position + new Vector(0, -50);
79        aloita.Clicked += AloitaPeli;
80        Add(aloita);
81
82    }
83
84    void AloitaPeli()
85    {
86        ClearAll();
87        AloitaKentta("kentta" + kenttaNro);
88
89    }
90
91
92    void AloitaKentta(string kentanNimi)
93    {
94        Gravity = new Vector(0, -1000);
95        for (int i = 0; i < pelaajaLaskuri.Value; i++)
96        {
97            Pelaaja pelaaja = new Pelaaja();
98            pelaaja.Pisteet.UpperLimit += VaihdaKenttaa;
99            pelaajat.Add(pelaaja);
100        }
101
102        Mouse.IsCursorVisible = true;
103
104        LuoKentta(kentanNimi);
105
106        double aika = 2;
107
108        Vector korinNopeus =  new Vector(0, 100);
109        if (kenttaNro == 2) korinNopeus = new Vector(-100, 0);
110        if (kenttaNro == 3) korinNopeus = new Vector(-100, 100);
111        if (kenttaNro == 4)
112        {
113            aika = 4;
114
115        }
116
117
118        if (kenttaNro > 1)
119        {
120            Vector[] korinPaikat = {korinNopeus, -korinNopeus };
121            kori.Velocity = korinPaikat[0];
122            Timer ajastin = new Timer();
123            ajastin.Start();
124            ajastin.Interval = aika;
125            ajastin.Timeout += delegate { LiikutaKoria(korinPaikat); };
126
127
128        }
129        LuoNaytot();
130        LuoVoimamittari();
131        LisaaNappaimet();
132        Camera.ZoomToLevel();
133    }
134
135    void LiikutaKoria(Vector[] positions)
136    {
137        if (kori.Velocity == positions[0])
138            kori.Velocity = positions[1];
139        else kori.Velocity = positions[0];
140    }
141
142
143    void VaihdaKenttaa()
144    {
145        ClearAll();
146        pelaajat.Clear();
147        vuorossaOlevaPelaaja = 0;
148        kenttaNro++;
149        if (kenttaNro > 4) Exit();
150        AloitaKentta("kentta" + kenttaNro);
151    }
152
153
154    void VaihdaPelaajaaVuorossa()
155    {
156        if (vuorossaOlevaPelaaja + 1 >= pelaajat.Count)
157            vuorossaOlevaPelaaja = 0;
158        else vuorossaOlevaPelaaja++;
159        MessageDisplay.Add("Pelaajan " + (vuorossaOlevaPelaaja + 1) + " vuoro");
160        pelaaja1.Position = new Vector(-200, 0);
161    }
162
163
164    void LuoNaytot()
165    {
166        Label ylareuna = new Label("Pisteet");
167        ylareuna.Position = new Vector(Screen.Right - 50, Screen.Top - 50);
168        int i = 1;
169        foreach (var item in pelaajat)
170        {
171            Label pisteet = new Label(100, 50);
172            pisteet.BindTo(item.Pisteet);
173            ylareuna.Add(pisteet);
174            pisteet.Position += new Vector(0, -i++ * 20);
175        }
176        Add(ylareuna);
177    }
178
179
180    void LuoKentta(string kentanNimi)
181    {
182        TileMap kentta = TileMap.FromLevelAsset(kentanNimi);
183        kentta.SetTileMethod('V', LisaaVastustaja);
184        kentta.SetTileMethod('#', LisaaTaso);
185        kentta.SetTileMethod('K', LisaaKori);
186        kentta.SetTileMethod('N', LisaaPelaaja);
187        kentta.SetTileMethod('T', LisaaTuomari);
188        kentta.Execute(RUUDUN_KOKO, RUUDUN_KOKO);
189
190        PhysicsObject ylaReuna = Level.CreateTopBorder();
191        ylaReuna.Tag = "reuna";
192   
193
194        Level.CreateHorizontalBorders(0, false, Color.Red);
195        Level.Background.CreateGradient(Color.Black, Color.Orange);
196        Level.Background.Image = LoadImage("Koripallokenttä");
197        Level.Background.FitToLevel();
198    }
199
200    void LisaaTuomari(Vector paikka, double leveys, double korkeus)
201    {
202        PhysicsObject Tuomari = PhysicsObject.CreateStaticObject(leveys * 1.2, 1.5 * korkeus);
203        Tuomari.IgnoresCollisionResponse = true;
204        Tuomari.Position = paikka;
205        Tuomari.Y += 10;
206        Tuomari.Image = tuomarinKuva;
207        Add(Tuomari);
208    }
209
210    void LisaaTaso(Vector paikka, double leveys, double korkeus)
211    {
212        PhysicsObject taso = PhysicsObject.CreateStaticObject(leveys, korkeus);
213        taso.Position = paikka;
214        taso.Color = Color.Green;
215        Add(taso);
216    }
217
218    void LisaaKori(Vector paikka, double leveys, double korkeus)
219    {
220        kori = PhysicsObject.CreateStaticObject(leveys * 1.2, korkeus * 1.2);
221        kori.IgnoresCollisionResponse = true;
222        kori.Position = paikka;
223        kori.Image = koripallokorinKuva;
224        kori.Tag = "kori";
225        Add(kori);
226    }
227
228    void LisaaPelaaja(Vector paikka, double leveys, double korkeus)
229    {
230        pelaaja1 = new Pelihahmo(leveys, korkeus * 1.5);
231        pelaaja1.Position = paikka;
232        pelaaja1.Mass = 4.0;
233        pelaaja1.Image = pelaajanKuva;
234        pelaaja1.CollisionIgnoreGroup = 1;
235        pelaaja1.KulmaNaytin = new GameObject(LoadImage("Nuoli"));
236        pelaaja1.KulmanayttimenEtaisyys = 50;
237        Add(pelaaja1.KulmaNaytin);
238        MuutaHeittokulmaa(new AnalogState(), pelaaja1);
239       
240        Add(pelaaja1);
241    }
242
243    void LisaaVastustaja(Vector paikka, double leveys, double korkeus)
244    {
245        PlatformCharacter Vastustaja = new PlatformCharacter(leveys, korkeus * 2);
246        Vastustaja.Position = paikka;
247        Vastustaja.Mass = 1000.0;
248        Vastustaja.Image = vastustajanKuva;
249        Add(Vastustaja);
250        Timer hyppyAjastin = new Timer();
251        hyppyAjastin.Start();
252        hyppyAjastin.Interval = 2;
253        hyppyAjastin.Timeout += delegate { if (Vastustaja != null) Vastustaja.Jump((kori.Y - Level.Bottom) * 4); };
254    }
255
256    PhysicsObject LisaaPallo()
257    {
258        PhysicsObject Pallo = new PhysicsObject(20, 20);
259        Pallo.Shape = Shape.Circle;
260        Pallo.Image = koripallonKuva;
261        Pallo.Position = pelaaja1.Position;
262        Pallo.CollisionIgnoreGroup = 1;
263        Add(Pallo);
264        return Pallo;
265    }
266
267
268
269    void LisaaNappaimet()
270    {
271        Keyboard.Listen(Key.F1, ButtonState.Pressed, ShowControlHelp, "Näytä ohjeet");
272        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
273
274        Keyboard.Listen(Key.A, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", pelaaja1, -nopeus);
275        Keyboard.Listen(Key.D, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", pelaaja1, nopeus);
276        Keyboard.Listen(Key.W, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", pelaaja1, hyppyNopeus);
277        Mouse.Listen(MouseButton.Left, ButtonState.Released, HeitaPallo, "Heitä pallo", pelaaja1);
278        Mouse.Listen(MouseButton.Left, ButtonState.Down, heittovoima.AddValue, null, 0.20);
279        Mouse.ListenMovement(0.1, MuutaHeittokulmaa, null, pelaaja1);
280
281        ControllerOne.Listen(Button.Back, ButtonState.Pressed, Exit, "Poistu pelistä");
282        ControllerOne.Listen(Button.DPadLeft, ButtonState.Down, Liikuta, "Pelaaja liikkuu vasemmalle", pelaaja1, -nopeus);
283        ControllerOne.Listen(Button.DPadRight, ButtonState.Down, Liikuta, "Pelaaja liikkuu oikealle", pelaaja1, nopeus);
284        ControllerOne.Listen(Button.X, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", pelaaja1, hyppyNopeus);
285        ControllerOne.Listen(Button.A, ButtonState.Down, heittovoima.AddValue, null, 0.20);
286        ControllerOne.Listen(Button.A, ButtonState.Released, HeitaPallo, "Heitä Pallo", pelaaja1);
287        ControllerOne.ListenAnalog(AnalogControl.LeftStick, 0.1, MuutaHeittokulmaa, null, pelaaja1);
288    }
289
290    void MuutaHeittokulmaa(AnalogState an, Pelihahmo pelihahmo)
291    {
292        Angle heittokulma = (Mouse.PositionOnWorld - pelihahmo.Position).Angle;
293        pelihahmo.KulmaNaytin.Position = pelihahmo.Position + Vector.FromLengthAndAngle(pelihahmo.KulmanayttimenEtaisyys, (Mouse.PositionOnWorld - pelihahmo.Position).Angle);
294        pelihahmo.KulmaNaytin.Angle = heittokulma;
295        pelihahmo.Heittokulma = heittokulma;
296        if (an.StateVector.Magnitude < 0.1) return;
297        heittokulma = an.StateVector.Angle;
298        pelihahmo.KulmaNaytin.Position = pelihahmo.Position + Vector.FromLengthAndAngle(pelihahmo.KulmanayttimenEtaisyys, an.StateVector.Angle);
299        pelihahmo.KulmaNaytin.Angle = heittokulma;
300        pelihahmo.Heittokulma = heittokulma;
301    }
302
303    void HeitaPallo(Pelihahmo pelihahmo)
304    {
305        if (!VoikoHeittaa) return;
306        VoikoHeittaa = false;
307        PhysicsObject pallo = LisaaPallo();
308       
309        Vector suunta = Vector.FromLengthAndAngle(1, pelihahmo.Heittokulma);
310        pallo.Hit(suunta * 150 * heittovoima.Value);
311        heittovoima.Value = 0;
312        AddCollisionHandler(pallo, PalloOsuu);
313    }
314
315
316    void PalloOsuu(PhysicsObject pallo, PhysicsObject kohde)
317    {
318        if ("reuna".Equals(kohde.Tag)) return;
319        pallo.Destroy();
320        if (kohde.Tag.Equals("kori")) pelaajat[vuorossaOlevaPelaaja].Pisteet.Value++;
321        pallo.Destroyed += delegate { VaihdaPelaajaaVuorossa(); };
322        Timer.SingleShot(1.0, delegate { VoikoHeittaa = true; });
323    }
324
325
326    void Liikuta(Pelihahmo hahmo, double nopeus)
327    {
328        if (hahmo.Position.X >= -200 && nopeus > 0)
329        {
330            hahmo.Velocity = new Vector(0, hahmo.Velocity.Y);
331            return;
332        }
333        hahmo.Walk(nopeus);
334    }
335
336    void Hyppaa(Pelihahmo hahmo, double nopeus)
337    {
338        hahmo.Jump(nopeus);
339    }
340
341   
342}
343
344public class Pelaaja
345{
346    IntMeter pisteet;
347    public IntMeter Pisteet { get { return pisteet; } }
348
349    public Pelaaja()
350    {
351        pisteet = new IntMeter(0, 0, 3);
352    }
353
354}
Note: See TracBrowser for help on using the repository browser.