source: 2013/30/juiitamm/Koripallo/Koripallo/Koripallo/Peli.cs @ 4688

Revision 4688, 12.8 KB checked in by tojukarp, 8 years ago (diff)

Testi

Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4using Jypeli.Controls;
5using Jypeli.Widgets;
6using Jypeli.Assets;
7using Jypeli.WP7;
8
9public class Peli : PhysicsGame
10{
11    #region Muuttujat
12
13    int korinSuunta;
14    bool saakoHeittaa;
15    bool onHeittamassa = false;
16
17    /// <summary>
18    /// Tähän lisätään viimeisimmät hiiren/kosketuspaneelin liikkeet heiton aikana,
19    /// jotta heiton voima ei tulisi liian herkästi viimeisestä liikkeestä.
20    ///
21    /// Taulukon kokoa muuttamalla voi valita kuinka pitkältä ajalta heitto luetaan.
22    /// </summary>
23    Vector[] viimeisetLiikkeet = new Vector[8];
24
25    /// <summary>
26    /// Kuinka nopeasti heitto lähtee suhteessa hiiren tai kosketuspaneelin liikkeeseen.
27    /// </summary>
28    const double HeittoNopeus = 8;
29
30    int liikeIndeksi = 0;
31
32    PhysicsObject pallo;
33    PhysicsObject levy;
34    PhysicsObject koriVasen;
35    PhysicsObject koriOikea;
36    PhysicsObject koriKeskus;
37    PhysicsObject lattia;
38
39    GameObject korinVerkko;
40    GameObject pelaaja;
41   
42    Vector heittoVoima;
43    IntMeter kenttaLaskuri;
44    DoubleMeter voimaMittari;
45
46    SoundEffect pomppuAani = LoadSoundEffect("hit");
47
48    Timer liikkuvuusAjastin;
49    Timer KentanVaihtoAjastin;
50
51    Image[] pelaajanKuvat = LoadImages( "heittaja1", "heittaja2", "heittaja3" );
52    Image pallonKuva = LoadImage( "koripallo" );
53    Image verkonKuva = LoadImage( "kori" );
54    Image taustaKuva = LoadImage( "tausta" );
55
56    #endregion
57
58    void liikutaKoria()
59    {
60        if ((levy.Top >= Level.Top) || (korinVerkko.Bottom <= Level.Bottom))
61        {
62            korinSuunta = ((-1) * korinSuunta);
63        }
64
65        double korinSuuntaDoubleina = korinSuunta / 5.0;
66
67        levy.Y += korinSuuntaDoubleina;
68        koriKeskus.Y += korinSuuntaDoubleina;
69        koriOikea.Y += korinSuuntaDoubleina;
70        koriVasen.Y += korinSuuntaDoubleina;
71        korinVerkko.Y += korinSuuntaDoubleina;
72    }
73
74    void asetaPallo()
75    {
76        pallo.IgnoresGravity = true;
77        pallo.AngularVelocity = 0.0;
78        pallo.Velocity = Vector.Zero;
79        pallo.X = pelaaja.X;
80        pallo.Y = pelaaja.Top;
81        saakoHeittaa = true;
82    }
83
84    void luoPelaaja()
85    {
86        pelaaja = new GameObject(200, 200);
87        Animation heitto = new Animation(pelaajanKuvat);
88        heitto.FPS = 20;
89        pelaaja.Animation = heitto;
90        pelaaja.X = (0.80 * Level.Left);
91        pelaaja.Y = Level.Bottom + 100;
92        Add(pelaaja);
93    }
94
95    void luoPallo()
96    {
97        pallo = new PhysicsObject(50.0, 50.0, Shape.Circle);
98        pallo.Mass = 12.0;
99        pallo.Restitution = 0.8;
100        pallo.KineticFriction = 0.6;
101        pallo.AngularDamping = 0.99;
102        pallo.Image = pallonKuva;
103        asetaPallo();
104       
105        AddCollisionHandler(pallo, pallonTormayksenKasittely);
106        Add(pallo);
107    }
108
109    PhysicsObject teeKorinReunat(Vector v)
110    {
111        PhysicsObject reunaPallo = PhysicsObject.CreateStaticObject(v.X, v.Y);
112        reunaPallo.Shape = Shape.Circle;
113        return reunaPallo;
114    }
115
116    void luoKori()
117    {
118        levy = PhysicsObject.CreateStaticObject(13.0, 250.0);
119        levy.Shape = Shape.Rectangle;
120        levy.Y = 0.5 * Level.Top;
121        levy.X = Level.Right - 20.0;
122        Add(levy);
123
124        Vector pallonKoko = new Vector(5.0, 5.0);
125        koriVasen = teeKorinReunat(pallonKoko);
126        koriOikea = teeKorinReunat(pallonKoko);
127        koriKeskus = teeKorinReunat(pallonKoko);
128
129        koriOikea.Color = Color.Red;
130        koriOikea.Y = levy.Bottom + 20.0;
131        koriOikea.X = levy.Left - 15.0;
132        koriVasen.Color = Color.Red;
133        koriVasen.Y = levy.Bottom + 20.0;
134        koriVasen.X = levy.Left - 90.0;
135        koriKeskus.X = (koriOikea.X + koriVasen.X) / 2;
136        koriKeskus.Y = ((koriOikea.Y + koriVasen.Y) / 2) - 15.0;
137        koriKeskus.IgnoresCollisionResponse = true;
138        koriKeskus.IsVisible = false;
139
140        korinVerkko = new GameObject(90.0, 115.0);
141        korinVerkko.Shape = Shape.Rectangle;
142        korinVerkko.Image = verkonKuva;
143        korinVerkko.X = (levy.Left - 45.0);
144        korinVerkko.Y = (koriOikea.Top - 58);
145       
146        Add(koriOikea);
147        Add(koriVasen);
148        Add(koriKeskus);
149        Add(korinVerkko);
150    }
151
152    void luoKenttaNaytto(int kentanNro)
153    {
154        kenttaLaskuri = new IntMeter(kentanNro);
155
156        Widget kenttaRuutu = new Widget( 100, 50 );
157        kenttaRuutu.Color = Color.Transparent;
158        kenttaRuutu.BorderColor = Color.White;
159        kenttaRuutu.Layout = new VerticalLayout();
160        kenttaRuutu.X = Screen.LeftSafe + 75;
161        kenttaRuutu.Y = Screen.TopSafe - 40;
162        Add( kenttaRuutu );
163
164        Label kenttaTeksti = new Label( "Taso" );
165        kenttaTeksti.TextColor = Color.White;
166        kenttaRuutu.Add( kenttaTeksti );
167
168        Label kenttaNaytto = new Label();
169        kenttaNaytto.BindTo(kenttaLaskuri);
170        kenttaNaytto.TextColor = Color.White;
171        kenttaRuutu.Add(kenttaNaytto);
172    }
173
174    void luoVoimaMittari()
175    {
176        voimaMittari = new DoubleMeter(0);
177        voimaMittari.MaxValue = 30000;
178        BarGauge voimaPalkki = new BarGauge(10, 0.2 * Screen.HeightSafe);
179        voimaPalkki.BorderColor = Color.Black;
180        voimaPalkki.BindTo(voimaMittari);
181        voimaPalkki.X = (0.95 * Screen.LeftSafe);
182        voimaPalkki.Y = (0.05 * Screen.Height);
183        Add(voimaPalkki);
184    }
185
186    void luoKentta(double leveys, double korkeus, int kentanNro)
187    {
188        Level.Width = leveys;
189        Level.Height = korkeus;
190
191        Level.Background.Image = taustaKuva;
192        Level.Background.FitToLevel();
193        Gravity = new Vector(0, -1000.0);
194        Mouse.IsCursorVisible = true;
195
196        lattia = Level.CreateBottomBorder();
197        lattia.Restitution = 0.6;
198        lattia.KineticFriction = 0.2;
199        Level.CreateTopBorder();
200        Level.CreateLeftBorder();
201        Level.CreateRightBorder();
202
203        luoPelaaja();
204        luoPallo();
205        luoKori();
206        luoKenttaNaytto(kentanNro);
207        luoVoimaMittari();
208
209        if (kentanNro >= 2)
210        {
211            while (true)
212            {
213                korinSuunta = RandomGen.NextInt(-1, 2);
214                if (korinSuunta != 0) break;
215            }
216            korinSuunta = korinSuunta * kentanNro;
217            liikkuvuusAjastin.Start();
218        }
219
220        Camera.ZoomToLevel();
221
222#if WINDOWS_PHONE
223        Camera.Follow(pallo);
224        Camera.StayInLevel = true;
225#endif
226    }
227
228    void seuraavaKentta()
229    {
230        kenttaLaskuri.Value++;
231        ClearAll();
232
233#if WINDOWS_PHONE
234        // Ei kasvateta kenttää puhelinversiossa.
235        luoKentta(Level.Width, Level.Height, kenttaLaskuri.Value);
236#else
237        luoKentta(1.1 * Level.Width, 1.1 * Level.Height, kenttaLaskuri.Value);
238#endif
239
240        asetaNapit();
241    }
242
243    void pallonTormayksenKasittely(PhysicsObject pallo, PhysicsObject kohde)
244    {
245        if ((kohde != pelaaja) && (kohde != koriKeskus))
246        {
247            pomppuAani.Play();
248        }
249
250        if (!KentanVaihtoAjastin.Enabled && (kohde == koriKeskus) && (pallo.Velocity.Y <= 0))
251        {
252            pallo.Velocity = new Vector(0, 0.1*pallo.Velocity.Y);
253            liikkuvuusAjastin.Stop();
254            KentanVaihtoAjastin.Start(1);
255        }
256    }
257
258    void laskeVoima()
259    {
260        if (saakoHeittaa)
261        {
262            Vector hiirenPaikka = Mouse.PositionOnWorld;
263            heittoVoima.X += (hiirenPaikka.X - pallo.X);
264            heittoVoima.Y += (hiirenPaikka.Y - pallo.Y);
265            voimaMittari.Value = heittoVoima.Magnitude;
266        }
267    }
268
269    void laskeVoimaPadilla()
270    {
271        if (saakoHeittaa)
272        {
273            heittoVoima.X += (ControllerOne.LeftThumbDirection.X * 250);
274            heittoVoima.Y += (ControllerOne.LeftThumbDirection.Y * 250);
275            voimaMittari.Value = heittoVoima.Magnitude;
276        }
277    }
278
279    void heitaPallo()
280    {
281        pelaaja.Animation.Start(1);
282        saakoHeittaa = false;
283        pallo.IgnoresGravity = false;
284        pallo.Hit(heittoVoima);
285        heittoVoima = Vector.Zero;
286        voimaMittari.Reset();
287    }
288
289    void pyoritaPalloa(double kulmanopeus)
290    {
291        if (saakoHeittaa)
292        {
293            pallo.AngularVelocity += kulmanopeus;
294        }
295    }
296
297    void pyoritaPalloaPadilla()
298    {
299        if (saakoHeittaa)
300        {
301            pallo.AngularVelocity += ControllerOne.RightThumbDirection.X;
302        }
303    }
304
305    bool OnPallonPaalla(Vector paikka)
306    {
307        return Vector.Distance(paikka, pallo.Position) < (pallo.Width / 2);
308    }
309
310    void HeitaHiirella(AnalogState state)
311    {
312        if (onHeittamassa)
313        {
314            pallo.Position = Mouse.PositionOnWorld;
315            LisaaLiike(state.MouseMovement);
316        }
317    }
318
319    void AloitaHeitto()
320    {
321        pallo.Stop();
322        pallo.IgnoresGravity = true;
323        onHeittamassa = true;
324        for (int i = 0; i < viimeisetLiikkeet.Length; i++)
325            viimeisetLiikkeet[i] = Vector.Zero;
326    }
327
328    void AloitaHeittoHiirella()
329    {
330        if (OnPallonPaalla(Mouse.PositionOnWorld))
331        {
332            AloitaHeitto();
333        }
334    }
335
336    void LopetaHeitto()
337    {
338        if (onHeittamassa)
339        {
340            onHeittamassa = false;
341            pallo.IgnoresGravity = false;
342            double xSumma = 0, ySumma = 0;
343            for (int i = 0; i < viimeisetLiikkeet.Length; i++)
344            {
345                xSumma += viimeisetLiikkeet[i].X;
346                ySumma += viimeisetLiikkeet[i].Y;
347            }
348
349            pallo.Velocity = new Vector(xSumma, ySumma) * HeittoNopeus;
350        }
351    }
352
353    void AloitaHeittoKosketuksella(Touch kosketus)
354    {
355        if (OnPallonPaalla(kosketus.PositionOnWorld))
356        {
357            AloitaHeitto();
358        }
359    }
360
361    void LopetaHeittoKosketuksella(Touch kosketus)
362    {
363        LopetaHeitto();
364    }
365
366    void LisaaLiike(Vector liike)
367    {
368        if (liikeIndeksi == viimeisetLiikkeet.Length)
369            liikeIndeksi = 0;
370        viimeisetLiikkeet[liikeIndeksi++] = liike;
371    }
372
373    void HeitaKosketuksella(Touch kosketus)
374    {
375        if (onHeittamassa)
376        {
377            pallo.Position = kosketus.PositionOnWorld;
378            LisaaLiike(kosketus.MovementOnWorld);
379        }
380    }
381
382    void asetaNapit()
383    {
384        Mouse.Listen(MouseButton.Left, ButtonState.Pressed, AloitaHeittoHiirella, null);
385        Mouse.Listen(MouseButton.Left, ButtonState.Released, LopetaHeitto, null);
386        Mouse.Listen(MouseButton.Right, ButtonState.Pressed, asetaPallo, "Palauta pallo alkutilanteeseen");
387        Mouse.ListenMovement(0.1, HeitaHiirella, null);
388
389        TouchPanel.Listen(ButtonState.Pressed, AloitaHeittoKosketuksella, null);
390        TouchPanel.Listen(ButtonState.Released, LopetaHeittoKosketuksella, null);
391        TouchPanel.Listen(ButtonState.Down, HeitaKosketuksella, null);
392        PhoneBackButton.Listen(ConfirmExit,"Lopettaa pelin");
393
394        Keyboard.Listen(Key.Space, ButtonState.Down, laskeVoima, "Pidä pohjassa heiton voimakk5uuden säätämiseen.");
395        Keyboard.Listen(Key.Space, ButtonState.Released, heitaPallo, null);
396        Keyboard.Listen(Key.Left, ButtonState.Down, pyoritaPalloa, "Anna pallolle alakierrettä.", 0.2);
397        Keyboard.Listen(Key.Right, ButtonState.Down, pyoritaPalloa, "Anna pallolle yläkierrettä.", -0.2);
398
399        Keyboard.Listen(Key.F1, ButtonState.Pressed, ShowControlHelp, "Näytä ohjeet");
400        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Poistu");
401
402        ControllerOne.Listen(Button.RightTrigger, ButtonState.Down, laskeVoimaPadilla, "Pidä pohjassa heiton voimakkuuden säätämiseen.");
403        ControllerOne.Listen(Button.RightTrigger, ButtonState.Released, heitaPallo, null);
404        ControllerOne.Listen(Button.RightStick, ButtonState.Up, pyoritaPalloaPadilla, "Anna pallolle kierrettä.");
405        ControllerOne.Listen(Button.A, ButtonState.Pressed, asetaPallo, "Palauta pallo alkutilanteeseen");
406
407        ControllerOne.Listen(Button.Start, ButtonState.Pressed, ShowControlHelp, "Näytä ohjeet");
408        ControllerOne.Listen(Button.Back, ButtonState.Pressed, Exit, "Poistu");
409     }
410
411    public override void Begin()
412    {
413        Phone.DisplayOrientation = DisplayOrientation.Portrait;
414
415#if WINDOWS_PHONE
416        Level.Width = 350;
417        Level.Height = 650;
418#endif
419        liikkuvuusAjastin = new Timer();
420        liikkuvuusAjastin.Interval = 0.003;
421        liikkuvuusAjastin.Timeout += liikutaKoria;
422
423        KentanVaihtoAjastin = new Timer();
424        KentanVaihtoAjastin.Interval = 1.5;
425        KentanVaihtoAjastin.Timeout += seuraavaKentta;
426
427        luoKentta(Level.Width, Level.Height, 1);
428        asetaNapit();
429    }
430}
Note: See TracBrowser for help on using the repository browser.