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

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