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

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