source: 2016/koodauskerho/EeroP/Tower_Defence/Tower_Defence/Tower_Defence/Tower_Defence.cs @ 8363

Revision 8363, 7.4 KB checked in by koannak, 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
9class Vihollinen : PhysicsObject
10{
11    public IntMeter ElamaLaskuri { get; private set; }
12
13    public Vihollinen(double leveys, double korkeus, int elamat)
14        :base(leveys, korkeus)
15    {
16        ElamaLaskuri = new IntMeter(elamat, 0, elamat);
17        ElamaLaskuri.LowerLimit += Destroy;
18        Tag = "vihu";
19        CanRotate = false;
20
21        ProgressBar elamaPalkki = new ProgressBar(leveys * 1.2, 10, ElamaLaskuri);
22        elamaPalkki.BarColor = Color.DarkRed;
23        elamaPalkki.Color = Color.Black;
24        elamaPalkki.Bottom = Top + 5;
25        this.Add(elamaPalkki);
26    }
27}
28class Dog : GameObject
29{
30    public DogPaivitys Paivitys { get; set; }
31
32    public Timer AmpumisAjastin { get; set; }
33
34    public Dog(Double leveys, double korkeus, DogPaivitys paivitys)
35        : base(leveys, korkeus)
36    {
37        Paivitys = paivitys;
38        Image = Paivitys.Kuva;
39    }
40
41    public void OsuuVihuun(PhysicsObject ammus, PhysicsObject vihu)
42    {
43        ammus.Destroy();
44        ((Vihollinen)vihu).ElamaLaskuri.Value -= Paivitys.Vahinko;
45    }
46}
47
48class DogPaivitys
49{
50    public int Hinta { get; set; }
51    public int Vahinko { get; set; }
52    public Image Kuva { get; set; }
53    public DogPaivitys Seuraava { get; set; }
54}
55
56public class Tower_Defence : PhysicsGame
57{
58    SortedList<char, Vector> polku;
59
60    IntMeter raha;
61
62    Image vihunKuva = LoadImage("papyrus");
63    Image koirankuva = LoadImage("Dog");
64    Image kotiKuva = LoadImage("house");
65    Image polkuKuva = LoadImage("polku");
66    Image nurmiKuva = LoadImage("nurmikko");
67    Image boneKuva = LoadImage("bone");
68
69    int vihunNumero = 0;
70
71    DogPaivitys alkuPaivitys;
72    public override void Begin()
73    {
74        LuoKentta();
75        LuoRahaLaskuri();
76        LuoPaivitykset();
77        AsetaOhjaimet();
78
79        IsMouseVisible = true;
80
81        Timer vihuAjastin = new Timer();
82        vihuAjastin.Interval = 1.5;
83        vihuAjastin.Timeout += LuoVihollinen;
84        vihuAjastin.Start();
85    }
86    void LuoKentta()
87    {
88        polku = new SortedList<char, Vector>();
89
90        TileMap ruudut = TileMap.FromLevelAsset("kentta1");
91        ruudut.SetTileMethod('!', LuoKoti);
92        ruudut.SetTileMethod('%', LuoPolku);
93        for (char merkki = 'A'; merkki <= 'Z'; merkki++)
94        {
95            ruudut.SetTileMethod(merkki, LuoKulma, merkki);
96        }
97
98        ruudut.Execute(30, 30);
99        Level.Background.Image = nurmiKuva;
100        Level.Background.TileToLevel();
101
102    }
103
104    void LuoPolku(Vector paikka, double leveys, double korkeus)
105    {
106        GameObject polku = new GameObject(leveys, korkeus);
107        polku.Position = paikka;
108        polku.Image = polkuKuva;
109        Add(polku, -1);
110    }
111
112    void LuoKulma (Vector paikka, double leveys, double korkeus, char merkki)
113    {
114        polku.Add(merkki, paikka);
115        LuoPolku(paikka, leveys, korkeus);
116    }
117    void LuoVihollinen()
118    {
119        vihunNumero++;
120
121        Vihollinen vihu = new Vihollinen(30, 30, elamat: vihunNumero * 3);
122        vihu.Image = vihunKuva;
123        vihu.Position = polku.Values[0];
124        Add(vihu);
125
126        PathFollowerBrain polkuAivot = new PathFollowerBrain(new List<Vector>(polku.Values));
127        polkuAivot.Speed = 100 + 5 * vihunNumero;
128        vihu.Brain = polkuAivot;
129    }
130    void LuoRahaLaskuri()
131    {
132        raha = new IntMeter(0);
133
134        Label rahaNaytto = new Label(raha);
135        rahaNaytto.Left = Screen.Right - 100;
136        rahaNaytto.Top = Screen.Top - 100;
137        rahaNaytto.IntFormatString = "Money: {0}";
138        Add(rahaNaytto);
139
140        Timer rahaAjastin = new Timer();
141        rahaAjastin.Interval = 0.5;
142        rahaAjastin.Timeout += delegate { raha.Value += 15; };
143        rahaAjastin.Start();
144    }
145    void AsetaOhjaimet()
146    {
147        Mouse.Listen(MouseButton.Left, ButtonState.Pressed, OstaDog, "Buy a Dog. It's fast and cheap but weak");
148
149        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Quit game");
150    }
151    void OstaDog()
152    {
153        if (raha.Value >= alkuPaivitys.Hinta)
154        {
155            raha.Value -= alkuPaivitys.Hinta;
156
157            Dog dog = new Dog(75, 60, alkuPaivitys);
158            dog.Image = koirankuva;
159            dog.Position = Mouse.PositionOnWorld;
160            dog.AmpumisAjastin = new Timer();
161            dog.AmpumisAjastin.Interval = 0.30;
162            dog.AmpumisAjastin.Timeout += delegate { DogAmpuu(dog); };
163            dog.AmpumisAjastin.Start();
164            Add(dog);
165
166            Mouse.ListenOn(dog, MouseButton.Right, ButtonState.Pressed, delegate { PaivitaDog(dog); }, "Upgrade your tower");
167        }
168    }
169    void PaivitaDog(Dog dog)
170    {
171        DogPaivitys uusiPaivitys = dog.Paivitys.Seuraava;
172        if (uusiPaivitys != null)
173        {
174            int paivityksenHinta = uusiPaivitys.Hinta - dog.Paivitys.Hinta;
175            if (raha.Value >= paivityksenHinta)
176            {
177                raha.Value -= paivityksenHinta;
178                dog.Paivitys = uusiPaivitys;
179                dog.Image = uusiPaivitys.Kuva;
180            }
181            else
182            {
183                MessageDisplay.Add("You don't have enough money. Upgrade costs " + paivityksenHinta);
184            }
185        }
186    }
187    void LuoPaivitykset()
188    {
189        DogPaivitys normaali = new DogPaivitys { Kuva = LoadImage("Dog"), Hinta = 70, Vahinko = 1 };
190        DogPaivitys liekki = new DogPaivitys { Kuva = LoadImage("Dog2"), Hinta = 120, Vahinko = 2 };
191        DogPaivitys nukkuva = new DogPaivitys { Kuva = LoadImage("Dog3"), Hinta = 250, Vahinko = 3 };
192        DogPaivitys vartija = new DogPaivitys { Kuva = LoadImage("Dog4"), Hinta = 550, Vahinko = 4 };
193
194        normaali.Seuraava = liekki;
195        liekki.Seuraava = nukkuva;
196        nukkuva.Seuraava = vartija;
197
198        alkuPaivitys = normaali;
199    }
200    void DogAmpuu(Dog dog)
201    {
202        GameObject kohde = null;
203        double lyhin = double.MaxValue;
204        foreach (GameObject vihu in GetObjectsWithTag("vihu"))
205        {
206            double etaisyys = Vector.Distance(vihu.Position, dog.Position);
207
208            if (etaisyys < lyhin)
209            {
210                lyhin = etaisyys;
211                kohde = vihu;
212            }
213        }
214        if (kohde != null)
215        {
216            PhysicsObject ammus = new PhysicsObject(10, 10, Shape.Diamond);
217            ammus.Position = dog.Position;
218            ammus.Image = boneKuva;
219            ammus.LifetimeLeft = TimeSpan.FromSeconds(2);
220            Add(ammus);
221
222            double ammuksenNopeus = 500;
223            Vector suunta = (kohde.Position - dog.Position).Normalize();
224            ammus.Hit(suunta * ammuksenNopeus);
225
226            AddCollisionHandler(ammus, "vihu", dog.OsuuVihuun);
227        }
228    }
229    void LuoKoti(Vector paikka, double leveys, double korkeus)
230    {
231        PhysicsObject koti = PhysicsObject.CreateStaticObject(leveys * 6, korkeus * 4);
232        koti.Position = paikka;
233        koti.Image = kotiKuva;
234        Add(koti);
235
236        AddCollisionHandler(koti, "vihu", PeliOhi);
237    }
238    void PeliOhi(PhysicsObject koti, PhysicsObject vihu)
239    {
240        ClearAll();
241        Label viesti = new Label("You lose!");
242        Add(viesti);
243
244        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Quit game");
245    }
246}
Note: See TracBrowser for help on using the repository browser.