source: 2011/31/TeemuT/Diamond TD/Diamond TD/Diamond TD/Peli.cs @ 10334

Revision 2599, 12.3 KB checked in by tenituun, 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 Peli : PhysicsGame
10{
11    List<Label> valikonKohdat;
12    List<Vector> polku = new List<Vector>();
13    List<GameObject> ruohoelementit = new List<GameObject>();
14    Vector[] reitti;
15    int montakoRiviaKentassa = 55;
16    int montakoSarakettaKentassa = 74;
17    int vihujenElamat = 3;
18    GameObject start;
19    PhysicsObject maali;
20    Image ruohokuva = LoadImage("ruoho");
21    ScoreList topLista = new ScoreList(10, false, 0);
22
23
24    bool asetetaanTykkia = false;
25    //double kuvaruudunLeveys = Screen.Width;
26    //double kuvaruudunKorkeus = Screen.Height;
27    double ruudunLeveys;
28    double ruudunKorkeus;
29    int tykinHinta = 500;
30    int pisteitaVihusta = 50;
31    IntMeter rahaMaara = new IntMeter(1000);
32    IntMeter elamaLaskuri = new IntMeter(50);
33    IntMeter aaltolaskin = new IntMeter(0);
34    SoundEffect ampuaani = LoadSoundEffect("kk");
35
36
37
38    public override void Begin()
39    {
40        Valikko();       
41        if (DataStorage.Exists("pisteet.xml"))
42            topLista = DataStorage.Load<ScoreList>(topLista, "pisteet.xml");
43
44    }
45
46    void Valikko()
47    {
48        ClearAll();
49
50        valikonKohdat = new List<Label>();
51
52        Label kohta1 = new Label("Aloita uusi peli");
53        kohta1.Position = new Vector(0, 40);
54        valikonKohdat.Add(kohta1);
55
56        Label kohta2 = new Label("Lopeta");
57        kohta2.Position = new Vector(0, -40);
58        valikonKohdat.Add(kohta2);
59
60        foreach (Label valikonKohta in valikonKohdat)
61        {
62            Add(valikonKohta);
63        }
64
65        Mouse.ListenOn(kohta1, MouseButton.Left, ButtonState.Pressed, AloitaPeli, null);
66        Mouse.ListenOn(kohta2, MouseButton.Left, ButtonState.Pressed, Exit, null);
67
68        Mouse.IsCursorVisible = true;
69        Mouse.ListenMovement(1.0, ValikossaLiikkuminen, null);
70        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Exit, "");
71
72
73
74    }
75
76    void ValikossaLiikkuminen(AnalogState hiirenTila)
77    {
78        foreach (Label kohta in valikonKohdat)
79        {
80            if (Mouse.IsCursorOn(kohta))
81            {
82                kohta.TextColor = Color.Red;
83            }
84            else
85            {
86                kohta.TextColor = Color.Black;
87            }
88
89        }
90    }
91
92    void AloitaPeli()
93    {
94        ClearAll();
95        TeeKentta();
96        TeeKayttoliittyma();
97
98        vihujenElamat = 3;
99        pisteitaVihusta = 50;
100
101        LuoPolku();
102        /*
103        Timer ajastin = new Timer();
104        ajastin.Interval = 5;
105        ajastin.Timeout += LahetaAalto;
106        ajastin.Start(10);
107         */
108        Mouse.IsCursorVisible = true;
109        // Tähän tulee kaikki kentän luomiset ym. alustukset...
110        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Valikko, "Palaa valikkoon");
111    }
112
113
114
115
116    void LahetaAalto()
117    {
118        if (viholliset.Count != 0) return;
119        Timer ajastin = new Timer();
120        ajastin.Interval = 0.2;
121        ajastin.Timeout += delegate { LuoVihollinen(vihujenElamat); };
122        ajastin.Start(5 + vihujenElamat * 2);
123        Timer.SingleShot(5, delegate { vihujenElamat++; });
124        aaltolaskin.Value = aaltolaskin.Value + 1;
125    }
126
127    void TeeKentta()
128    {
129        Level.BackgroundColor = Color.ForestGreen;
130        TileMap ruudut = TileMap.FromLevelAsset("kentta2");
131        ruudut.SetTileMethod('=', LuoPalikka);
132        ruudut.SetTileMethod('o', LuoPalikka);
133        ruudut.SetTileMethod('a', LuoWaypoint);
134        ruudut.SetTileMethod('s', LuoStartti);
135        ruudut.SetTileMethod('l', LuoMaali);
136        ruudut.SetTileMethod('r', LuoRuoho);
137        ruudunLeveys = Screen.Width / montakoSarakettaKentassa;
138        ruudunKorkeus = Screen.Height / montakoRiviaKentassa;
139        ruudut.Execute(ruudunLeveys, ruudunKorkeus);
140        Level.CreateBorders(1.0, true);
141        Camera.ZoomToLevel();
142    }
143    void LuoRuoho(Vector paikka, double leveys, double korkeus)
144    {
145        GameObject ruoho = new GameObject(leveys, korkeus);
146        ruoho.Position = paikka;
147        ruoho.Image = ruohokuva;
148        Add(ruoho);
149        ruohoelementit.Add(ruoho);
150
151    }
152
153    void TeeKayttoliittyma()
154    {
155        Widget playnappula = new Widget(90, 90);
156        playnappula.Bottom = Screen.Bottom + 10;
157        playnappula.Left = Screen.Left + 20;
158        playnappula.Image = LoadImage("play");
159        Add(playnappula);
160        Mouse.ListenOn(playnappula, MouseButton.Left, ButtonState.Pressed, LahetaAalto, null);
161
162        Widget tykkinappula = new Widget(90, 90);
163        tykkinappula.Left = playnappula.Right + 10;
164        tykkinappula.Bottom = playnappula.Bottom;
165        Add(tykkinappula);
166       
167        Mouse.ListenOn(tykkinappula, MouseButton.Left, ButtonState.Pressed, NappiPainettu, null, tykkinappula);
168
169        Label rahaNaytto = new Label();
170        rahaNaytto.Right = Screen.Right-100;
171        rahaNaytto.Bottom = Screen.Bottom;
172        Add(rahaNaytto);
173        rahaMaara.MinValue = 0;
174        rahaNaytto.Title = "Rahat";
175        rahaNaytto.BindTo(rahaMaara);
176
177        Label elamaNaytto = new Label();
178        elamaNaytto.Right = Screen.Right - 300;
179        elamaNaytto.Bottom = Screen.Bottom;
180        Add(elamaNaytto);
181        elamaLaskuri.MinValue = -1;
182        elamaNaytto.Title = "Elämät";
183        elamaNaytto.BindTo(elamaLaskuri);
184
185        Label aaltonaytto = new Label();
186        aaltonaytto.Right = Screen.Right - 500;
187        aaltonaytto.Bottom = Screen.Bottom;
188        Add(aaltonaytto);
189        aaltolaskin.MinValue = -1;
190        aaltonaytto.Title = "Aallot";
191        aaltonaytto.BindTo(aaltolaskin);
192
193    }
194
195    void NappiPainettu(Widget w)
196    {
197        asetetaanTykkia = true;
198        Mouse.Listen(MouseButton.Left, ButtonState.Pressed, AsetaTykki, null, w);
199        w.Color = Color.Black;
200        // Voit muuttaa kuvaa
201    }
202
203    void AsetaTykki(Widget w)
204    {
205        if (asetetaanTykkia && rahaMaara.Value >= tykinHinta)
206        {
207            GameObject allaolevaruoho = ruohoelementit[0];
208            int i = 0;
209            while (i < ruohoelementit.Count)
210            {
211                if (Mouse.IsCursorOn(ruohoelementit[i]))
212                {
213                    allaolevaruoho = ruohoelementit[i];
214                    LuoTykki(allaolevaruoho.Position);
215                    rahaMaara.Value -= tykinHinta;
216                    break;
217                }
218                i++;
219            }
220        }
221        w.Color = Color.White;
222        asetetaanTykkia = false;
223
224    }
225
226    void LuoTykki(Vector paikka)
227    {
228
229        GameObject tykki = new GameObject(ruudunLeveys, ruudunKorkeus);
230        Add(tykki);
231        tykki.Position = paikka;
232        // Ajastin, jonka avulla ammutaan
233        Timer ajastin = new Timer();
234        ajastin.Interval = 0.4;
235        ajastin.Timeout += delegate { tykkiAmpuu(tykki); };
236        ajastin.Start();
237    }
238
239    void tykkiAmpuu(GameObject tykki)
240    {
241        PhysicsObject vihu = EtsiLahinVihu(tykki.Position);
242
243
244
245        if (vihu != null && !vihu.IsDestroyed)
246        {
247            PhysicsObject ammus = new PhysicsObject(5, 5, Shape.Circle);
248            ampuaani.Play();
249            Add(ammus);
250            ammus.Color = Color.Black;
251            AddCollisionHandler(ammus, KasitteleAmmuksenTormaus);
252            ammus.Tag = "ammus";
253            ammus.Position = tykki.Position;
254
255            Vector suunta = (vihu.Position - tykki.Position);
256            double voima = 1000;
257
258            ammus.Hit((suunta / suunta.Magnitude) * voima);
259        }
260
261    }
262
263    void KasitteleAmmuksenTormaus(PhysicsObject ammus, PhysicsObject kohde)
264    {
265        ammus.Destroy();
266    }
267
268
269
270
271    PhysicsObject EtsiLahinVihu(Vector position)
272    {
273        double pieninEtaisyys = 10000000.0;
274        PhysicsObject lahin = null;
275
276        foreach (PhysicsObject vihu in viholliset)
277        {
278            double etaisyys = Vector.Distance(vihu.Position, position);
279            if (!vihu.IsDestroyed && etaisyys < pieninEtaisyys)
280            {
281                pieninEtaisyys = etaisyys;
282                lahin = vihu;
283            }
284        }
285
286        return lahin;
287    }
288
289    void LuoPolku()
290    {
291        reitti = ParsiReitti(start, polku);
292    }
293
294    void LuoWaypoint(Vector paikka, double leveys, double korkeus)
295    {
296        polku.Add(paikka);
297    }
298
299    void LuoStartti(Vector paikka, double leveys, double korkeus)
300    {
301        start = new GameObject(1, 1);
302        start.Position = paikka;
303    }
304
305    void LuoMaali(Vector paikka, double lev, double korkeus)
306    {
307        maali = PhysicsObject.CreateStaticObject(20, 20);
308        polku.Add(paikka);
309        maali.Position = paikka;
310        Add(maali);
311        AddCollisionHandler(maali, KasitteleMaalinTormaus);
312        maali.IsVisible = false;
313
314    }
315
316    void KasitteleMaalinTormaus(PhysicsObject maali, PhysicsObject vih)
317    {
318        elamaLaskuri.Value = elamaLaskuri.Value - 1;
319        viholliset.Remove(vih);
320
321        if (elamaLaskuri.Value == 0)
322        {
323            elamaLaskuri.Value = -1;
324            Timer.SingleShot(4, HighScore);
325
326            Label havio = new Label("Game over");
327            Add(havio);
328        }
329        vih.Destroy();
330    }
331
332    List<PhysicsObject> viholliset = new List<PhysicsObject>();
333
334    void HighScore()
335    {
336       
337        HighScoreWindow topIkkuna = new HighScoreWindow("Pelin nimi tai jotain",
338                             "Parhaat pisteet",
339                             "Onneksi olkoon, pääsit listalle pisteillä %p! Syötä nimesi:",
340                             topLista, aaltolaskin.Value);
341        topIkkuna.Closed += TallennaPisteet;
342        Add(topIkkuna);
343    }
344    void TallennaPisteet(Window sender)
345    {
346        DataStorage.Save<ScoreList>(topLista, "pisteet.xml");
347        Valikko();
348    }
349
350
351    void LuoVihollinen(int elamapisteet)
352    {
353        Vihollinen vihu = new Vihollinen(20, 20);
354        vihu.Elamat = elamapisteet;
355        vihu.Position = start.Position;
356        vihu.IgnoresCollisionResponse = true;
357        viholliset.Add(vihu);
358
359        PathFollowerBrain testiaivot = new PathFollowerBrain();
360        testiaivot.Path = reitti;
361        testiaivot.Speed = 200;
362        testiaivot.Loop = false;
363
364        vihu.Brain = testiaivot;
365        Add(vihu);
366        vihu.Color = Color.Red;
367        vihu.Shape = Shape.Circle;
368        AddCollisionHandler(vihu, VihuOsui);
369    }
370
371    void VihuOsui(PhysicsObject vihu, PhysicsObject kohde)
372    {
373        if (kohde.Tag.ToString() == "ammus")
374        {
375            Vihollinen v = (Vihollinen)vihu;
376            v.Elamat--; // Vähennetään yksi elämäpiste
377            if (v.Elamat < 0)
378            {
379                v.Destroy(); // Jos elämät menee alle 0 niin tuhotaan vihu
380                viholliset.Remove(v);
381                rahaMaara.Value += pisteitaVihusta;
382            }
383        }
384    }
385
386    void LuoPalikka(Vector paikka, double leveys, double korkeus)
387    {
388        GameObject palikka = new GameObject(leveys, korkeus);
389        palikka.Position = paikka;
390        palikka.Shape = Shape.Rectangle;
391        palikka.Color = Color.Gray;
392        Add(palikka);
393
394    }
395
396    Vector[] ParsiReitti(GameObject npc, List<Vector> waypoints)
397    {
398        int n = waypoints.Count;
399        Vector[] reitti = new Vector[n];
400        Vector v = npc.Position;
401
402        for (int i = 0; i < n; i++)
403        {
404            v = FindNearest(waypoints, v);
405            waypoints.Remove(v);
406            reitti[i] = v;
407        }
408
409        return reitti;
410    }
411
412    Vector FindNearest(IEnumerable<Vector> list, Vector vector)
413    {
414        Vector nearest = Vector.Zero;
415        double minDistance = double.PositiveInfinity;
416
417        foreach (Vector candidate in list)
418        {
419            double d = Vector.Distance(vector, candidate);
420
421            if (d < minDistance)
422            {
423                nearest = candidate;
424                minDistance = d;
425            }
426        }
427
428        return nearest;
429
430
431
432
433
434
435    }
436}
437
438class Vihollinen : PhysicsObject
439{
440    public int Elamat = 3;
441
442    public Vihollinen(double leveys, double korkeus)
443        : base(leveys, korkeus)
444    {
445    }
446}
447
Note: See TracBrowser for help on using the repository browser.