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

Revision 8338, 7.2 KB checked in by sieerinn, 3 years ago (diff)
RevLine 
[8338]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
66    int vihunNumero = 0;
67
68    DogPaivitys alkuPaivitys;
69    public override void Begin()
70    {
71        LuoKentta();
72        LuoRahaLaskuri();
73        LuoPaivitykset();
74        AsetaOhjaimet();
75
76        IsMouseVisible = true;
77
78        Timer vihuAjastin = new Timer();
79        vihuAjastin.Interval = 0.5;
80        vihuAjastin.Timeout += LuoVihollinen;
81        vihuAjastin.Start();
82    }
83    void LuoKentta()
84    {
85        polku = new SortedList<char, Vector>();
86
87        TileMap ruudut = TileMap.FromLevelAsset("kentta1");
88        ruudut.SetTileMethod('!', LuoKoti);
89        ruudut.SetTileMethod('%', LuoPolku);
90        for (char merkki = 'A'; merkki <= 'Z'; merkki++)
91        {
92            ruudut.SetTileMethod(merkki, LuoKulma, merkki);
93        }
94
95        ruudut.Execute(30, 30);
96
97    }
98
99    void LuoPolku(Vector paikka, double leveys, double korkeus)
100    {
101        GameObject polku = new GameObject(leveys, korkeus);
102        polku.Position = paikka;
103        polku.Color = Color.LightGreen;
104        Add(polku, -1);
105    }
106
107    void LuoKulma (Vector paikka, double leveys, double korkeus, char merkki)
108    {
109        polku.Add(merkki, paikka);
110        LuoPolku(paikka, leveys, korkeus);
111    }
112    void LuoVihollinen()
113    {
114        vihunNumero++;
115
116        Vihollinen vihu = new Vihollinen(30, 30, elamat: vihunNumero * 3);
117        vihu.Image = vihunKuva;
118        vihu.Position = polku.Values[0];
119        Add(vihu);
120
121        PathFollowerBrain polkuAivot = new PathFollowerBrain(new List<Vector>(polku.Values));
122        polkuAivot.Speed = 100 + 5 * vihunNumero;
123        vihu.Brain = polkuAivot;
124    }
125    void LuoRahaLaskuri()
126    {
127        raha = new IntMeter(0);
128
129        Label rahaNaytto = new Label(raha);
130        rahaNaytto.Left = Screen.Right - 100;
131        rahaNaytto.Top = Screen.Top - 100;
132        rahaNaytto.IntFormatString = "Money: {0}";
133        Add(rahaNaytto);
134
135        Timer rahaAjastin = new Timer();
136        rahaAjastin.Interval = 0.7;
137        rahaAjastin.Timeout += delegate { raha.Value += 10; };
138        rahaAjastin.Start();
139    }
140    void AsetaOhjaimet()
141    {
142        Mouse.Listen(MouseButton.Left, ButtonState.Pressed, OstaDog, "Buy a Dog. It's fast and cheap but weak");
143
144        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Quit game");
145    }
146    void OstaDog()
147    {
148        if (raha.Value >= alkuPaivitys.Hinta)
149        {
150            raha.Value -= alkuPaivitys.Hinta;
151
152            Dog dog = new Dog(75, 60, alkuPaivitys);
153            dog.Image = koirankuva;
154            dog.Position = Mouse.PositionOnWorld;
155            dog.AmpumisAjastin = new Timer();
156            dog.AmpumisAjastin.Interval = 0.35;
157            dog.AmpumisAjastin.Timeout += delegate { DogAmpuu(dog); };
158            dog.AmpumisAjastin.Start();
159            Add(dog);
160
161            Mouse.ListenOn(dog, MouseButton.Right, ButtonState.Pressed, delegate { PaivitaDog(dog); }, "Upgrade your tower");
162        }
163    }
164    void PaivitaDog(Dog dog)
165    {
166        DogPaivitys uusiPaivitys = dog.Paivitys.Seuraava;
167        if (uusiPaivitys != null)
168        {
169            int paivityksenHinta = uusiPaivitys.Hinta - dog.Paivitys.Hinta;
170            if (raha.Value >= paivityksenHinta)
171            {
172                raha.Value -= paivityksenHinta;
173                dog.Paivitys = uusiPaivitys;
174                dog.Image = uusiPaivitys.Kuva;
175            }
176            else
177            {
178                MessageDisplay.Add("You don't have enough money. Upgrade costs " + paivityksenHinta);
179            }
180        }
181    }
182    void LuoPaivitykset()
183    {
184        DogPaivitys normaali = new DogPaivitys { Kuva = LoadImage("Dog"), Hinta = 70, Vahinko = 1 };
185        DogPaivitys liekki = new DogPaivitys { Kuva = LoadImage("Dog2"), Hinta = 120, Vahinko = 2 };
186        DogPaivitys nukkuva = new DogPaivitys { Kuva = LoadImage("Dog3"), Hinta = 250, Vahinko = 3 };
187        DogPaivitys vartija = new DogPaivitys { Kuva = LoadImage("Dog4"), Hinta = 550, Vahinko = 4 };
188
189        normaali.Seuraava = liekki;
190        liekki.Seuraava = nukkuva;
191        nukkuva.Seuraava = vartija;
192
193        alkuPaivitys = normaali;
194    }
195    void DogAmpuu(Dog dog)
196    {
197        GameObject kohde = null;
198        double lyhin = double.MaxValue;
199        foreach (GameObject vihu in GetObjectsWithTag("vihu"))
200        {
201            double etaisyys = Vector.Distance(vihu.Position, dog.Position);
202
203            if (etaisyys < lyhin)
204            {
205                lyhin = etaisyys;
206                kohde = vihu;
207            }
208        }
209        if (kohde != null)
210        {
211            PhysicsObject ammus = new PhysicsObject(10, 10, Shape.Diamond);
212            ammus.Position = dog.Position;
213            ammus.Color = Color.Wheat;
214            ammus.LifetimeLeft = TimeSpan.FromSeconds(2);
215            Add(ammus);
216
217            double ammuksenNopeus = 500;
218            Vector suunta = (kohde.Position - dog.Position).Normalize();
219            ammus.Hit(suunta * ammuksenNopeus);
220
221            AddCollisionHandler(ammus, "vihu", dog.OsuuVihuun);
222        }
223    }
224    void LuoKoti(Vector paikka, double leveys, double korkeus)
225    {
226        PhysicsObject koti = PhysicsObject.CreateStaticObject(leveys * 6, korkeus * 4);
227        koti.Position = paikka;
228        koti.Image = kotiKuva;
229        Add(koti);
230
231        AddCollisionHandler(koti, "vihu", PeliOhi);
232    }
233    void PeliOhi(PhysicsObject koti, PhysicsObject vihu)
234    {
235        ClearAll();
236        Label viesti = new Label("You lose!");
237        Add(viesti);
238
239        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Quit game");
240    }
241}
Note: See TracBrowser for help on using the repository browser.