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

Revision 2595, 12.3 KB checked in by tenituun, 10 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        Mouse.ListenOn(tykkinappula, MouseButton.Left, ButtonState.Pressed, NappiPainettu, null, tykkinappula);
167
168        Label rahaNaytto = new Label();
169        rahaNaytto.Right = Screen.Right-100;
170        rahaNaytto.Bottom = Screen.Bottom;
171        Add(rahaNaytto);
172        rahaMaara.MinValue = 0;
173        rahaNaytto.Title = "Rahat";
174        rahaNaytto.BindTo(rahaMaara);
175
176        Label elamaNaytto = new Label();
177        elamaNaytto.Right = Screen.Right - 300;
178        elamaNaytto.Bottom = Screen.Bottom;
179        Add(elamaNaytto);
180        elamaLaskuri.MinValue = -1;
181        elamaNaytto.Title = "Elämät";
182        elamaNaytto.BindTo(elamaLaskuri);
183
184        Label aaltonaytto = new Label();
185        aaltonaytto.Right = Screen.Right - 500;
186        aaltonaytto.Bottom = Screen.Bottom;
187        Add(aaltonaytto);
188        aaltolaskin.MinValue = -1;
189        aaltonaytto.Title = "Aallot";
190        aaltonaytto.BindTo(aaltolaskin);
191
192    }
193
194    void NappiPainettu(Widget w)
195    {
196        asetetaanTykkia = true;
197        Mouse.Listen(MouseButton.Left, ButtonState.Pressed, AsetaTykki, null, w);
198        w.Color = Color.Black;
199        // Voit muuttaa kuvaa
200    }
201
202    void AsetaTykki(Widget w)
203    {
204        if (asetetaanTykkia && rahaMaara.Value >= tykinHinta)
205        {
206            GameObject allaolevaruoho = ruohoelementit[0];
207            int i = 0;
208            while (i < ruohoelementit.Count)
209            {
210                if (Mouse.IsCursorOn(ruohoelementit[i]))
211                {
212                    allaolevaruoho = ruohoelementit[i];
213                    LuoTykki(allaolevaruoho.Position);
214                    rahaMaara.Value -= tykinHinta;
215                    break;
216                }
217                i++;
218            }
219        }
220        w.Color = Color.White;
221        asetetaanTykkia = false;
222
223    }
224
225    void LuoTykki(Vector paikka)
226    {
227
228        GameObject tykki = new GameObject(ruudunLeveys, ruudunKorkeus);
229        Add(tykki);
230        tykki.Position = paikka;
231        // Ajastin, jonka avulla ammutaan
232        Timer ajastin = new Timer();
233        ajastin.Interval = 0.4;
234        ajastin.Timeout += delegate { tykkiAmpuu(tykki); };
235        ajastin.Start();
236    }
237
238    void tykkiAmpuu(GameObject tykki)
239    {
240        PhysicsObject vihu = EtsiLahinVihu(tykki.Position);
241
242
243
244        if (vihu != null && !vihu.IsDestroyed)
245        {
246            PhysicsObject ammus = new PhysicsObject(5, 5, Shape.Circle);
247            ampuaani.Play();
248            Add(ammus);
249            ammus.Color = Color.Black;
250            AddCollisionHandler(ammus, KasitteleAmmuksenTormaus);
251            ammus.Tag = "ammus";
252            ammus.Position = tykki.Position;
253
254            Vector suunta = (vihu.Position - tykki.Position);
255            double voima = 1000;
256
257            ammus.Hit((suunta / suunta.Magnitude) * voima);
258        }
259
260    }
261
262    void KasitteleAmmuksenTormaus(PhysicsObject ammus, PhysicsObject kohde)
263    {
264        ammus.Destroy();
265    }
266
267
268
269
270    PhysicsObject EtsiLahinVihu(Vector position)
271    {
272        double pieninEtaisyys = 10000000.0;
273        PhysicsObject lahin = null;
274
275        foreach (PhysicsObject vihu in viholliset)
276        {
277            double etaisyys = Vector.Distance(vihu.Position, position);
278            if (!vihu.IsDestroyed && etaisyys < pieninEtaisyys)
279            {
280                pieninEtaisyys = etaisyys;
281                lahin = vihu;
282            }
283        }
284
285        return lahin;
286    }
287
288    void LuoPolku()
289    {
290        reitti = ParsiReitti(start, polku);
291    }
292
293    void LuoWaypoint(Vector paikka, double leveys, double korkeus)
294    {
295        polku.Add(paikka);
296    }
297
298    void LuoStartti(Vector paikka, double leveys, double korkeus)
299    {
300        start = new GameObject(1, 1);
301        start.Position = paikka;
302    }
303
304    void LuoMaali(Vector paikka, double lev, double korkeus)
305    {
306        maali = PhysicsObject.CreateStaticObject(20, 20);
307        polku.Add(paikka);
308        maali.Position = paikka;
309        Add(maali);
310        AddCollisionHandler(maali, KasitteleMaalinTormaus);
311        maali.IsVisible = false;
312
313    }
314
315    void KasitteleMaalinTormaus(PhysicsObject maali, PhysicsObject vih)
316    {
317        elamaLaskuri.Value = elamaLaskuri.Value - 1;
318        viholliset.Remove(vih);
319
320        if (elamaLaskuri.Value == 0)
321        {
322            elamaLaskuri.Value = -1;
323            Timer.SingleShot(4, HighScore);
324
325            Label havio = new Label("Game over");
326            Add(havio);
327        }
328        vih.Destroy();
329    }
330
331    List<PhysicsObject> viholliset = new List<PhysicsObject>();
332
333    void HighScore()
334    {
335       
336        HighScoreWindow topIkkuna = new HighScoreWindow("Pelin nimi tai jotain",
337                             "Parhaat pisteet",
338                             "Onneksi olkoon, pääsit listalle pisteillä %p! Syötä nimesi:",
339                             topLista, aaltolaskin.Value);
340        topIkkuna.Closed += TallennaPisteet;
341        Add(topIkkuna);
342    }
343    void TallennaPisteet(Window sender)
344    {
345        DataStorage.Save<ScoreList>(topLista, "pisteet.xml");
346        Valikko();
347    }
348
349
350    void LuoVihollinen(int elamapisteet)
351    {
352        Vihollinen vihu = new Vihollinen(20, 20);
353        vihu.Elamat = elamapisteet;
354        vihu.Position = start.Position;
355        vihu.IgnoresCollisionResponse = true;
356        viholliset.Add(vihu);
357
358        PathFollowerBrain testiaivot = new PathFollowerBrain();
359        testiaivot.Path = reitti;
360        testiaivot.Speed = 200;
361        testiaivot.Loop = false;
362
363        vihu.Brain = testiaivot;
364        Add(vihu);
365        vihu.Color = Color.Red;
366        vihu.Shape = Shape.Circle;
367        AddCollisionHandler(vihu, VihuOsui);
368    }
369
370    void VihuOsui(PhysicsObject vihu, PhysicsObject kohde)
371    {
372        if (kohde.Tag.ToString() == "ammus")
373        {
374            Vihollinen v = (Vihollinen)vihu;
375            v.Elamat--; // Vähennetään yksi elämäpiste
376            if (v.Elamat < 0)
377            {
378                v.Destroy(); // Jos elämät menee alle 0 niin tuhotaan vihu
379                viholliset.Remove(v);
380                rahaMaara.Value += pisteitaVihusta;
381            }
382        }
383    }
384
385    void LuoPalikka(Vector paikka, double leveys, double korkeus)
386    {
387        GameObject palikka = new GameObject(leveys, korkeus);
388        palikka.Position = paikka;
389        palikka.Shape = Shape.Rectangle;
390        palikka.Color = Color.Gray;
391        Add(palikka);
392
393    }
394
395    Vector[] ParsiReitti(GameObject npc, List<Vector> waypoints)
396    {
397        int n = waypoints.Count;
398        Vector[] reitti = new Vector[n];
399        Vector v = npc.Position;
400
401        for (int i = 0; i < n; i++)
402        {
403            v = FindNearest(waypoints, v);
404            waypoints.Remove(v);
405            reitti[i] = v;
406        }
407
408        return reitti;
409    }
410
411    Vector FindNearest(IEnumerable<Vector> list, Vector vector)
412    {
413        Vector nearest = Vector.Zero;
414        double minDistance = double.PositiveInfinity;
415
416        foreach (Vector candidate in list)
417        {
418            double d = Vector.Distance(vector, candidate);
419
420            if (d < minDistance)
421            {
422                nearest = candidate;
423                minDistance = d;
424            }
425        }
426
427        return nearest;
428
429
430
431
432
433
434    }
435}
436
437class Vihollinen : PhysicsObject
438{
439    public int Elamat = 3;
440
441    public Vihollinen(double leveys, double korkeus)
442        : base(leveys, korkeus)
443    {
444    }
445}
446
Note: See TracBrowser for help on using the repository browser.