source: 2014/24/OttoN/Towerdefence/Towerdefence/Towerdefence/Towerdefence.cs @ 5012

Revision 5012, 15.1 KB checked in by otnarhi, 5 years ago (diff)
Line 
1using System;
2using System.Linq;
3using System.Collections.Generic;
4using Jypeli;
5using Jypeli.Assets;
6using Jypeli.Controls;
7using Jypeli.Effects;
8using Jypeli.Widgets;
9using System.Collections.Generic;
10
11public class Towerdefence : PhysicsGame
12{
13    Image maakuva = LoadImage("kivi");
14    Image ruohokuva = LoadImage("ruoho");
15    Image Hiekkakuva = LoadImage("hiekka");
16    Image norsukuva = LoadImage("norsu");
17    Image cannonTowerKuva = LoadImage("CannonTower");
18    Image nappulaKuva = LoadImage("nappula");
19    Image cannonballKuva = LoadImage("CannonBall");
20    Image[] Tornikuvat = LoadImages("Cannontower", "Cannontower2", "CannonTower3", "CannonTower4", "CannonTower5", "CannonTower6","CannonTower7");
21    SoundEffect Tykki = LoadSoundEffect("Cannon");
22    Vector aloitusPaikka;
23    List<Vector> polkuList;
24    SortedDictionary<int, Vector> polku = new SortedDictionary<int, Vector>();
25    DoubleMeter elamaLaskuri;
26    List<Vihu> vihulista;
27   
28    bool ollaanRakentamassa = false;
29    IntMeter rahalaskuri = new IntMeter(800);
30    Label menuHelperNaytto;
31    private GameObject seurattava;
32
33    PushButton menuNappi;
34
35    public override void Begin()
36    {
37
38        LuoMenu();
39        LuoKentta();
40        LuoRahalaskuri();
41        LuoElamaLaskuri();
42
43        PhoneBackButton.Listen(ConfirmExit, "Lopeta peli");
44        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
45        Keyboard.Listen(Key.Insert, ButtonState.Pressed, HuijausKoodi, null);
46        Keyboard.Listen(Key.NumLock, ButtonState.Pressed, HuijausKoodi2, null);
47        Keyboard.Listen(Key.NumLock, ButtonState.Pressed, HuijausKoodi22, null);
48        Keyboard.Listen(Key.P, ButtonState.Pressed, Pause, "Pysäyttää pelin");
49    }
50    void LuoKentta()
51    {
52        //1. Luetaan kuva uuteen ColorTileMappiin, kuvan nimen perässä ei .png-päätettä.
53        ColorTileMap ruudut = ColorTileMap.FromLevelAsset("kentanPohja");
54        vihulista = new List<Vihu>();
55
56        //2. Kerrotaan mitä aliohjelmaa kutsutaan, kun tietyn värinen pikseli tulee vastaan kuvatiedostossa.
57        //ruudut.SetTileMethod(Color.Green, LuoPelaaja);
58        //ruudut.SetTileMethod(Color.Black, LuoTaso);
59        ruudut.SetTileMethod(Color.Red, Luokivi);
60        ruudut.SetTileMethod(Color.Black, LuoPolku);
61
62        ruudut.SetTileMethod(new Color(0, 38, 255), delegate(Vector paikka, double leveys, double korkeus)
63        { LuoTorniNappula(paikka, leveys, korkeus, cannonTowerKuva, 80, 20); });
64
65        ruudut.SetTileMethod(Color.White, LuoVihuPolku, 0);
66        ruudut.SetTileMethod(Color.FromHexCode("00FFFF"), LuoTukikohta);
67        ruudut.SetTileMethod(Color.FromHexCode("ffff00"), LuoVihuPolku, 1);
68        ruudut.SetTileMethod(Color.FromHexCode("ffff01"), LuoVihuPolku, 2);
69        ruudut.SetTileMethod(Color.FromHexCode("ffff02"), LuoVihuPolku, 3);
70        ruudut.SetTileMethod(Color.FromHexCode("ffff03"), LuoVihuPolku, 4);
71        ruudut.SetTileMethod(Color.FromHexCode("ffff04"), LuoVihuPolku, 5);
72
73        ruudut.Execute(20, 20);
74
75        JarjestaVihuPolku();
76
77        IntMeter i = new IntMeter(0, 0, int.MaxValue);
78        Label pisteNaytto = new Label();
79        pisteNaytto.X = Screen.Left + 100;
80        pisteNaytto.Y = Screen.Top - 100;
81        pisteNaytto.TextColor = Color.Black;
82        pisteNaytto.Color = Color.DarkGreen;
83        pisteNaytto.BindTo(i);
84        Add(pisteNaytto);
85        pisteNaytto.Title = "Aalto";
86
87        Timer ajastin = new Timer();
88        ajastin.Interval = 5;
89        ajastin.Timeout += delegate { Aalto(i.Value); i.Value++; ajastin.Interval = 25; };
90        ajastin.Start();
91
92
93
94        Level.Background.Color = Color.DarkGreen;
95        Camera.ZoomToLevel();
96        Level.Background.Image = ruohokuva;
97        Level.Background.TileToLevel();
98
99        IsMouseVisible = true;
100
101        Mouse.ListenMovement(1.0, HiirenLiikutus, null);
102
103        Mouse.Listen(MouseButton.Left, ButtonState.Pressed, HiirenKlikkaus, null);
104        Mouse.ListenMovement(1.0, delegate
105        {
106            if (!Mouse.IsCursorOn(menuNappi))
107                menuHelperNaytto.IsVisible = false;
108
109            List<Torni> tornit = GetObjectsWithTag("torni").Cast<Torni>().ToList();
110            foreach (Torni torni in tornit)
111            {
112                if (Mouse.IsCursorOn(torni))
113                {
114                    menuHelperNaytto.IsVisible = true;
115                    menuHelperNaytto.Text = "Torni, " + torni.taso;
116                    menuHelperNaytto.Position = Mouse.PositionOnScreen + new Vector(menuHelperNaytto.Width / 2 + 10, 0);
117                }
118            }
119        }, null);
120    }
121   
122
123    void HuijausKoodi22()
124    {
125        elamaLaskuri.Value += 10000;
126        elamaLaskuri.MaxValue = 10000;
127       
128    }
129   
130    void HiirenLiikutus(AnalogState tila)
131    {
132        if (ollaanRakentamassa)
133        {
134            seurattava.Position = Mouse.PositionOnWorld;
135        }
136    }
137
138    int JarjestaVihut(AssaultRifle ase, GameObject a, GameObject b)
139    {
140        if (a == null || b == null) return 0;
141        return Vector.Distance(a.Position, ase.AbsolutePosition) > Vector.Distance(b.Position, ase.AbsolutePosition) ? 1 : -1;
142    }
143
144    void HiirenKlikkaus()
145    {
146        if (ollaanRakentamassa)
147        {
148            AssaultRifle ase = new AssaultRifle(30, 30);
149            ase.IsVisible = false;
150            ase.FireRate = 2;
151            ase.ProjectileCollision = AmmusOsui;
152            seurattava.Add(ase);
153            (seurattava as Torni).ase = ase;
154            Timer ajastin = new Timer();
155            ajastin.Interval = 0.01;
156            ajastin.Timeout += delegate
157            {
158                //List<GameObject> vihut = GetObjectsWithTag("vihu");
159                var vihut = vihulista;
160                if (vihut == null || vihut.Count == 0) return;
161
162                double etäisyys = Vector.Distance(ase.AbsolutePosition, vihut[0].Position);
163                if (etäisyys > 200 + 100 * (ase.Parent as Torni).taso) return;
164
165
166                //vihut.Sort((a, b) => Vector.Distance(a.Position, ase.AbsolutePosition) > Vector.Distance(b.Position, ase.AbsolutePosition) ? 1 : -1);
167                vihut.Sort((a, b) => JarjestaVihut(ase, a, b));
168                ase.Angle = (vihut[0].Position - ase.AbsolutePosition).Angle;
169                PhysicsObject ammus = ase.Shoot();
170
171                if (ammus != null)
172                {
173                    ammus.Size *= 0.5;
174                    ammus.Image = cannonballKuva;
175                    ammus.MaximumLifetime = TimeSpan.FromSeconds(2.0);
176                    Tykki.Play();
177                }
178            };
179            ajastin.Start();
180
181            ollaanRakentamassa = false;
182            seurattava = null;
183        }
184        else
185        {
186            List<Torni> tornit = GetObjectsWithTag("torni").Cast<Torni>().ToList();
187            foreach (Torni torni in tornit)
188            {
189                int hinta = 40 + 20 * torni.taso;
190                if (Mouse.IsCursorOn(torni) && torni.taso < Tornikuvat.Length)
191                {
192                    if (rahalaskuri.Value >= hinta)
193                    {
194
195
196                        torni.taso += 1;
197                        torni.ase.FireRate = 1 + torni.taso;
198                        rahalaskuri.Value -= hinta;
199                        torni.Image = Tornikuvat[torni.taso - 1];
200                    }
201                    else
202                    {
203                        MessageDisplay.Add("Ei tarpeeksi rahaa. Päivitys maksaa " + hinta);
204
205                    }
206                }
207               
208            }
209        }
210    }
211
212
213    void JarjestaVihuPolku()
214    {
215        polkuList = new List<Vector>();
216
217        polkuList = polku.Values.ToList();
218        Vector viimeinen = new Vector((polkuList.ElementAt(polkuList.Count - 1).X + 40), (polkuList.ElementAt(polkuList.Count - 1)).Y);
219        polkuList.Add(viimeinen);
220    }
221
222
223    void LuoPolku(Vector paikka, double leveys, double korkeus)
224    {
225        GameObject taso = new GameObject(leveys, korkeus);
226        taso.Position = paikka;
227        taso.Image = Hiekkakuva;
228        //taso.IgnoresCollisionResponse=true;
229        //taso.CollisionIgnoreGroup = 2;
230        Add(taso, -3);
231        taso.Color = Color.Brown;
232
233    }
234
235    void Luokivi(Vector paikka, double leveys, double korkeus)
236    {
237        PhysicsObject taso = PhysicsObject.CreateStaticObject(leveys, korkeus);
238        taso.Position = paikka;
239        taso.Image = maakuva;
240        taso.CollisionIgnoreGroup = 1;
241        Add(taso);
242        taso.Color = Color.Gray;
243    }
244
245
246
247    void LuoVihuPolku(Vector paikka, double leveys, double korkeus, int reittiPisteenJarjestysnro)
248    {
249        GameObject taso = new GameObject(leveys, korkeus);
250        taso.Position = paikka;
251        if (reittiPisteenJarjestysnro == 0) aloitusPaikka = paikka;
252        polku.Add(reittiPisteenJarjestysnro, paikka);
253        taso.Image = Hiekkakuva;
254        //taso.CollisionIgnoreGroup = 1;
255        Add(taso, -3);
256        taso.Color = Color.Brown;
257    }
258
259    void LuoVihu(double leveys, double korkeus, int elama, int nopeus)
260    {
261        Vihu vihu = new Vihu(51, 51, elama);
262        vihu.Position = aloitusPaikka;
263        vihu.Image = norsukuva;
264        vihu.CollisionIgnoreGroup = 1;
265        vihu.Tag = "vihu";
266        vihu.CanRotate = false;
267        Add(vihu, 3);
268        AddCollisionHandler(vihu, "Tukikohta", ElamaMenetys);
269
270
271        ProgressBar elamaPalkki = new ProgressBar(50, 5);
272        elamaPalkki.X = Screen.Left + 150;
273        elamaPalkki.Y = Screen.Top - 20;
274        elamaPalkki.BindTo(vihu.ElamaLaskuri);
275        Add(elamaPalkki);
276
277        Timer ajastin = new Timer();
278        ajastin.Interval = 0.01;
279        ajastin.Timeout += delegate
280        {
281            elamaPalkki.Position = Camera.WorldToScreen(vihu.Position) + new Vector(0, -30);
282        };
283        ajastin.Start();
284        vihu.Destroyed += delegate
285        {
286            elamaPalkki.Destroy();
287            vihulista.Remove(vihu);
288        };
289
290        PathFollowerBrain polkuAivot = new PathFollowerBrain(polkuList);
291        polkuAivot.Speed = nopeus;
292        polkuAivot.Active = true;
293
294        vihu.Brain = polkuAivot;
295        vihulista.Add(vihu);
296    }
297
298    void LuoTorniNappula(Vector paikka, double leveys, double korkeus, Image rakennusKuva, int hinta, int rakennusKoko)
299    {
300        menuNappi = new PushButton(leveys*2, korkeus*2, nappulaKuva);
301        menuNappi.Position = new Vector(0, (Screen.Bottom + 30));
302        menuNappi.Clicked += new Action(() => AnnaRakennus(rakennusKoko, rakennusKoko * 2, hinta, rakennusKuva));
303        Add(menuNappi);
304        Mouse.ListenMovement(1.0, delegate
305        {
306            if (Mouse.IsCursorOn(menuNappi))
307            {
308                menuHelperNaytto.IsVisible = true;
309                menuHelperNaytto.Text = "Torni, " + hinta + " kultaa";
310                menuHelperNaytto.Position = Mouse.PositionOnScreen + new Vector(menuHelperNaytto.Width / 2 + 10, 0);
311            }
312
313        }, null
314            );
315    }
316
317
318    void LuoMenu()
319    {
320        menuHelperNaytto = new Label("");
321        menuHelperNaytto.XMargin = 7.0;
322        menuHelperNaytto.YMargin = 7.0;
323        menuHelperNaytto.Color = new Color(0, 0, 0, 100);
324        menuHelperNaytto.TextColor = Color.White;
325        menuHelperNaytto.IsVisible = false;
326        Add(menuHelperNaytto);
327    }
328
329    void AnnaRakennus(double leveys, double korkeus, int hinta, Image kuva)
330    {
331        if (ollaanRakentamassa) return;
332        if (hinta > rahalaskuri.Value) { MessageDisplay.Add("Ei tarpeeksi kultaa!"); return; }
333        rahalaskuri.Value -= hinta;
334
335        Torni talo = new Torni(leveys, korkeus);
336        talo.Color = Color.Black;
337        talo.Image = kuva;
338        talo.Position = Mouse.PositionOnScreen;
339        talo.Tag = "torni";
340        ollaanRakentamassa = true;
341        seurattava = talo;
342        Add(talo, 3);
343
344       
345    }
346
347    void LuoRahalaskuri()
348    {
349        rahalaskuri = new IntMeter(140, 0, int.MaxValue);
350
351        Label rahanaytto = new Label();
352        rahanaytto.X = Screen.Right - 70;
353        rahanaytto.Y = Screen.Top - 20;
354        rahanaytto.TextColor = Color.White;
355        rahanaytto.Color = new Color(0, 0, 0, 100);
356        rahanaytto.XMargin = 7.0;
357        rahanaytto.YMargin = 7.0;
358        rahanaytto.BindTo(rahalaskuri);
359        rahanaytto.IntFormatString = "Kultaa: {0:D1}";
360        Add(rahanaytto);
361    }
362    void AmmusOsui(PhysicsObject ammus, PhysicsObject kohde)
363    {
364        ammus.Destroy();
365        if (kohde.Tag.ToString() == "vihu")
366        {
367            Vihu vihu = kohde as Vihu;
368            vihu.ElamaLaskuri.Value -= 1;
369
370            if (vihu.ElamaLaskuri.Value == 0)
371            {
372
373                kohde.Destroy();
374                rahalaskuri.AddValue(3);
375            }
376        }
377    }
378
379    void LuoElamaLaskuri()
380    {
381        elamaLaskuri = new DoubleMeter(10);
382        elamaLaskuri.MaxValue = 10;
383        elamaLaskuri.LowerLimit += ElamaLoppui;
384
385        ProgressBar elamaPalkki = new ProgressBar(150, 20);
386        elamaPalkki.X = Screen.Right - 250;
387        elamaPalkki.Y = Screen.Top - 20;
388        elamaPalkki.BindTo(elamaLaskuri);
389        Add(elamaPalkki);
390    }
391
392    void ElamaLoppui()
393    {
394        MessageDisplay.Add("Hahaaaaaaa Hävisit :D.");
395        Timer.SingleShot(5, Exit);
396
397
398    }
399
400    void LuoTukikohta(Vector paikka, double leveys, double korkeus)
401    {
402        PhysicsObject taso = PhysicsObject.CreateStaticObject(leveys, korkeus);
403        taso.Position = paikka;
404        taso.Image = Hiekkakuva;
405        Add(taso);
406        taso.Tag = "Tukikohta";
407
408    }
409    void ElamaMenetys(PhysicsObject vihu, PhysicsObject Tukikohta)
410    {
411        elamaLaskuri.Value -= 1;
412        vihu.Destroy();
413    }
414    void Pause()
415    {
416   
417    MessageDisplay.Add("Pausella");
418 
419    }
420
421   
422   
423
424    void HuijausKoodi()
425    {
426        rahalaskuri.AddValue(800);
427        MessageDisplay.Add("Koodi aktivoitu: Lisää rahaa");
428
429    }
430    void HuijausKoodi2()
431    {
432        elamaLaskuri.Value += 10000;
433        MessageDisplay.Add("Koodi aktivoitu: Lisää elämiä");
434    }
435
436    void Aalto(int numero)
437    {
438        int i = 0;
439        Timer ajastin = new Timer();
440        ajastin.Interval = Math.Max(0.2, 1.5 - 0.2 * numero);
441        //ajastin.Times.Value = 10;
442        //ajastin.TimesLimited = true;
443        ajastin.Timeout += delegate
444        {
445            LuoVihu(15, 15, (int)(3 + 0.5 * numero), 60 + 10 * numero);
446            i++;
447            if (i > 4+6 * numero)
448                ajastin.Stop();
449        };
450        ajastin.Start();
451    }
452   
453
454}
455class Vihu : PhysicsObject
456{
457    private IntMeter elamaLaskuri;
458    public IntMeter ElamaLaskuri { get { return elamaLaskuri; } }
459
460    public Vihu(double leveys, double korkeus, int elama)
461        : base(leveys, korkeus)
462    {
463        elamaLaskuri = new IntMeter(elama, 0, elama);
464        //elamaLaskuri.LowerLimit += delegate { this.Destroy(); };
465
466    }
467
468}
469class Torni : GameObject
470{
471    public int taso = 1;
472    public AssaultRifle ase;
473    public Torni(double leveys, double korkeus)
474        : base(leveys, korkeus)
475    {
476
477
478    }
479
480}
Note: See TracBrowser for help on using the repository browser.