source: esimerkit/2015k/live/live18/PallojaKarkuun/PallojaKarkuun/PallojaKarkuun.cs @ 1404

Revision 1092, 8.7 KB checked in by anlakane, 3 years ago (diff)
Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4using Jypeli.Assets;
5using Jypeli.Controls;
6using Jypeli.Effects;
7using Jypeli.Widgets;
8
9/// @author Antti-Jussi Lakanen
10/// @version 11.3.2015
11///
12/// <summary>
13/// Pieni peli missä mennään palloja karkuun
14/// </summary>
15public class PallojaKarkuun : PhysicsGame
16{
17    const double PIENEN_KOKO = 40;
18    private static readonly Image vihu = LoadImage("vihu");
19    private static readonly Image rage = LoadImage("rage");
20    const int PALLOJA_ALUKSI = 5;
21
22    ScoreList topLista = new ScoreList(10, false, 0);
23    private const double VAROETAISYYS = 200;
24
25    /// <summary>
26    /// Alustukset ja kuuntelijat sekä
27    /// poistoajastimen käynnistys.
28    /// </summary>
29    public override void Begin()
30    {
31        topLista = DataStorage.TryLoad<ScoreList>(topLista, "pisteet.xml");
32
33        List<PhysicsObject> pallot = new List<PhysicsObject>();
34
35        Level.Size = new Vector(1024, 768);
36        SetWindowSize(1024, 768);
37        Level.CreateBorders();
38        Level.Background.Image = Image.FromGradient(1024, 768, new Color(40, 40, 90), new Color(90, 90, 120));
39        DoNextUpdate(Camera.ZoomToLevel);
40
41        PhysicsObject pelaaja = LuoPelaaja();
42        Add(pelaaja);
43
44        #region Pistelaskuri
45        IntMeter pistelaskuri = new IntMeter(0, 0, int.MaxValue);
46        Label pistenaytto = new Label();
47        pistenaytto.Position = new Vector(Screen.Right - 50, Screen.Top - 50);
48        pistenaytto.Color = Color.White;
49        pistenaytto.TextColor = Color.Black;
50        Add(pistenaytto);
51        pistenaytto.BindTo(pistelaskuri);
52        #endregion
53
54
55        AddCollisionHandler(pelaaja, delegate(PhysicsObject tormaaja, PhysicsObject kohde)
56        {
57            PelaajaTormasi(tormaaja, kohde, pistelaskuri);
58        });
59
60        LisaaPallot(pallot, PALLOJA_ALUKSI, pelaaja.Position);
61
62        PhysicsObject lahinPallo = LahinPallo(pallot, pelaaja.Position);
63
64        KorostaLahin(pallot, lahinPallo, pelaaja.Position);
65
66        // Mouse.IsCursorVisible = true; // jos haluat kursorin näkyviin
67
68        Mouse.ListenMovement(0.1, delegate { lahinPallo = LiikutaPelaajaa(pelaaja, pallot, lahinPallo); }, "Liikuta pelaajaa");
69        // Mouse.Listen(MouseButton.Left, ButtonState.Pressed, LisaaPallo, "Lisää pallo", pallot);
70
71        Timer pallojenLisaysAjastin = new Timer();
72        pallojenLisaysAjastin.Interval = 0.5;
73        pallojenLisaysAjastin.Timeout += delegate()
74        {
75            LisaaPallot(pallot, 1, pelaaja.Position);
76            pistelaskuri.Value++;
77        };
78        pallojenLisaysAjastin.Start();
79
80        Timer lahimmanLiikutusAjastin = new Timer();
81        lahimmanLiikutusAjastin.Interval = 0.01;
82        lahimmanLiikutusAjastin.Timeout += delegate
83        {
84            SiirraPalloa(lahinPallo, pelaaja.Position);
85        };
86        lahimmanLiikutusAjastin.Start();
87
88        /*
89        Timer poistoAjastin = new Timer();
90        poistoAjastin.Interval = 0.5;
91        poistoAjastin.Timeout += delegate
92        {
93            PoistaEka(pallot);
94        };
95        poistoAjastin.Start();
96
97         */
98
99        PhoneBackButton.Listen(ConfirmExit, "Lopeta peli");
100        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
101    }
102
103    void PelaajaTormasi(PhysicsObject tormaaja, PhysicsObject kohde, IntMeter pistelaskuri)
104    {
105        MessageDisplay.Add("Törmäys");
106        ClearAll();
107        NaytaTopTen(pistelaskuri.Value);
108    }
109
110    void NaytaTopTen(int pisteet)
111    {
112        HighScoreWindow topIkkuna = new HighScoreWindow(
113                                     "Parhaat pisteet",
114                                     "Onneksi olkoon, pääsit listalle pisteillä %p! Syötä nimesi:",
115                                     topLista, pisteet);
116        topIkkuna.Closed += TallennaPisteet;
117        topIkkuna.Closed += delegate(Window sender) { Begin(); };
118        Add(topIkkuna);
119    }
120
121    void TallennaPisteet(Window sender)
122    {
123        DataStorage.Save<ScoreList>(topLista, "pisteet.xml");
124    }
125
126
127    /// <summary>
128    /// Lisää useita palloja satunnaisiin paikkoihin.
129    /// </summary>
130    /// <param name="pallot"></param>
131    /// <param name="montako"></param>
132    public void LisaaPallot(List<PhysicsObject> pallot, int montako, Vector pelaajanPaikka)
133    {
134        for (int i = 0; i < montako; i++)
135        {
136            Vector pallonPaikka;
137
138            do
139            {
140                pallonPaikka = RandomGen.NextVector(Level.BoundingRect);
141               
142            } while (Vector.Distance(pallonPaikka, pelaajanPaikka) < VAROETAISYYS);
143
144            LisaaPallo(pallot, pallonPaikka);
145        }
146    }
147
148    void SiirraPalloa(PhysicsObject pallo, Vector kohde)
149    {
150        pallo.Position += (kohde - pallo.Position).Normalize();
151    }
152
153    /// <summary>
154    /// Poista eka alkio näytöltä ja listasta.
155    /// </summary>
156    /// <param name="pallot">Lista josta eka poistetaan.</param>
157    private void PoistaEka(List<PhysicsObject> pallot)
158    {
159        if (pallot.Count == 0) return;
160        PhysicsObject olio = pallot[0];
161        pallot.RemoveAt(0);
162        olio.Destroy();
163    }
164
165    /// <summary>
166    /// Lisää pallo listaan ja ruudulle.
167    /// </summary>
168    /// <param name="pallot">Pallot</param>
169    private void LisaaPallo(List<PhysicsObject> pallot, Vector paikka)
170    {
171        PhysicsObject pallo = new PhysicsObject(PIENEN_KOKO, PIENEN_KOKO, Shape.Circle);
172        pallo.Image = vihu;
173        Add(pallo);
174        pallo.Position = paikka;
175        pallot.Add(pallo);
176    }
177
178    /// <summary>
179    /// Liikuta pelaajaa. Samalla päivitetään lähin pallo ja palautetaan "pääohjelmaan",
180    /// jotta taas seuraavalla liikutuskerralla voidaan sytyttää tarvittaessa uusi lähin
181    /// jne.
182    /// </summary>
183    /// <param name="liikutettava">Liikuteltava pelaaja</param>
184    /// <param name="pallot">Pallot</param>
185    /// <param name="nykyinenLahin">Nykyinen lähin</param>
186    /// <returns>Uusi lähin</returns>
187    private PhysicsObject LiikutaPelaajaa(PhysicsObject liikutettava, List<PhysicsObject> pallot, PhysicsObject nykyinenLahin)
188    {
189        // liikutettava.Position = Mouse.PositionOnWorld;
190        liikutettava.X = Mouse.PositionOnWorld.X;
191        liikutettava.Y = Mouse.PositionOnWorld.Y;
192        // PhysicsObject lahin = KorostaLahin(pallot, liikutettava.Position);
193        // return lahin;
194        return KorostaLahin(pallot, nykyinenLahin, liikutettava.Position);
195
196    }
197
198    /// <summary>
199    /// 1) Poistaa korostuksen vanhasta lähimmästä.
200    /// 2) Korostaa uuden lähimmän
201    /// 3) Palauttaa uuden lähimmän.
202    /// </summary>
203    /// <param name="pallot">Pallot josta lähintä etsitään</param>
204    /// <param name="nykyinenLahin">Nykyinen lähin</param>
205    /// <param name="havaintopiste">Piste, jota lähintä etsitään.</param>
206    /// <returns>Uusi lähin.</returns>
207    private PhysicsObject KorostaLahin(List<PhysicsObject> pallot, PhysicsObject nykyinenLahin, Vector havaintopiste)
208    {
209        if (pallot.Count == 0) return null;
210        if (nykyinenLahin != null)
211        {
212            nykyinenLahin.Image = vihu;
213        }
214        PhysicsObject lahinPallo = LahinPallo(pallot, havaintopiste); // etsi uusi lähin
215        lahinPallo.Image = rage;
216        nykyinenLahin = lahinPallo;
217        return lahinPallo;
218    }
219
220    /// <summary>
221    /// Etsii listan lähimmän alkion
222    /// </summary>
223    /// <param name="pallot">Fysiikkaoliot joista etsitään</param>
224    /// <param name="pelaajanPaikka">Havaintopiste, jota lähintä pistettä etsitään.</param>
225    /// <returns>Lähin olio</returns>
226    private PhysicsObject LahinPallo(List<PhysicsObject> pallot, Vector pelaajanPaikka)
227    {
228        if (pallot.Count == 0) return null;
229        PhysicsObject lahinPallo = pallot[0];
230
231        double lahimmanEtaisyys = Vector.Distance(pallot[0].Position, pelaajanPaikka);
232        foreach (PhysicsObject pallo in pallot)
233        {
234            double tamanPallonEtaisyys = Vector.Distance(pallo.Position, pelaajanPaikka);
235            if (tamanPallonEtaisyys < lahimmanEtaisyys)
236            {
237                lahinPallo = pallo;
238                lahimmanEtaisyys = tamanPallonEtaisyys;
239            }
240        }
241        return lahinPallo;
242    }
243
244    /// <summary>
245    /// Luodaan pelaaja.
246    /// </summary>
247    /// <returns>Pelaaja.</returns>
248    private PhysicsObject LuoPelaaja()
249    {
250        PhysicsObject pallo = PhysicsObject.CreateStaticObject(80, 80, Shape.Circle);
251        pallo.Image = LoadImage("pelaaja");
252        Add(pallo, 1);
253        return pallo;
254    }
255}
Note: See TracBrowser for help on using the repository browser.