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

Revision 4955, 11.7 KB checked in by otnarhi, 6 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    Vector aloitusPaikka;
21    List<Vector> polkuList;
22    SortedDictionary<int, Vector> polku = new SortedDictionary<int, Vector>();
23    DoubleMeter elamaLaskuri;
24   
25    bool ollaanRakentamassa = false;
26    IntMeter rahalaskuri = new IntMeter(800);
27    Label menuHelperNaytto;
28    private GameObject seurattava;
29
30    PushButton menuNappi;
31
32    public override void Begin()
33    {
34
35        LuoMenu();
36        LuoKentta();
37        LuoRahalaskuri();
38        LuoElamaLaskuri();
39
40        PhoneBackButton.Listen(ConfirmExit, "Lopeta peli");
41        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
42        Keyboard.Listen(Key.Insert, ButtonState.Pressed, HuijausKoodi, null);
43        Keyboard.Listen(Key.NumLock, ButtonState.Pressed, HuijausKoodi2, null);
44    }
45    void LuoKentta()
46    {
47        //1. Luetaan kuva uuteen ColorTileMappiin, kuvan nimen perässä ei .png-päätettä.
48        ColorTileMap ruudut = ColorTileMap.FromLevelAsset("kentanPohja");
49
50        //2. Kerrotaan mitä aliohjelmaa kutsutaan, kun tietyn värinen pikseli tulee vastaan kuvatiedostossa.
51        //ruudut.SetTileMethod(Color.Green, LuoPelaaja);
52        //ruudut.SetTileMethod(Color.Black, LuoTaso);
53        ruudut.SetTileMethod(Color.Red, Luokivi);
54        ruudut.SetTileMethod(Color.Black, LuoPolku);
55       
56        ruudut.SetTileMethod(new Color(0,38,255), delegate(Vector paikka, double leveys, double korkeus)
57        { LuoTorniNappula(paikka, leveys, korkeus, cannonTowerKuva, 80, 20); });
58
59        ruudut.SetTileMethod(Color.White, LuoVihuPolku, 0);
60        ruudut.SetTileMethod(Color.FromHexCode("00FFFF"), LuoTukikohta);
61        ruudut.SetTileMethod(Color.FromHexCode("ffff00"), LuoVihuPolku, 1);
62        ruudut.SetTileMethod(Color.FromHexCode("ffff01"), LuoVihuPolku, 2);
63        ruudut.SetTileMethod(Color.FromHexCode("ffff02"), LuoVihuPolku, 3);
64        ruudut.SetTileMethod(Color.FromHexCode("ffff03"), LuoVihuPolku, 4);
65        ruudut.SetTileMethod(Color.FromHexCode("ffff04"), LuoVihuPolku, 5);
66
67        ruudut.Execute(20, 20);
68
69        JarjestaVihuPolku();
70
71        Timer ajastin = new Timer();
72        ajastin.Interval = 0.3 ;
73        ajastin.Timeout += delegate { LuoVihu(15, 15); };
74        ajastin.Start();
75       
76        Level.Background.Color = Color.DarkGreen;
77        Camera.ZoomToLevel();
78        Level.Background.Image = ruohokuva;
79        Level.Background.TileToLevel();
80
81        IsMouseVisible = true;
82
83        Mouse.ListenMovement(1.0, HiirenLiikutus, null);
84
85        Mouse.Listen(MouseButton.Left, ButtonState.Pressed, HiirenKlikkaus, null);
86        Mouse.ListenMovement(1.0, delegate
87        {
88            if (!Mouse.IsCursorOn(menuNappi))
89                menuHelperNaytto.IsVisible = false;
90        }, null);
91    }
92
93    void HiirenLiikutus(AnalogState tila)
94    {
95        if (ollaanRakentamassa)
96        {
97            seurattava.Position = Mouse.PositionOnWorld;
98        }
99    }
100
101    int JarjestaVihut(AssaultRifle ase, GameObject a, GameObject b)
102    {
103        if (a == null || b == null) return 0;
104        return Vector.Distance(a.Position, ase.AbsolutePosition) > Vector.Distance(b.Position, ase.AbsolutePosition) ? 1 : -1;
105    }
106
107    void HiirenKlikkaus()
108    {
109        if (ollaanRakentamassa)
110        {
111            AssaultRifle ase = new AssaultRifle(30,30);
112            ase.IsVisible = false;
113            ase.ProjectileCollision = AmmusOsui;
114            seurattava.Add(ase);
115            Timer ajastin = new Timer();
116            ajastin.Interval = 0.4;
117            ajastin.Timeout += delegate
118            {
119                List<GameObject> vihut = GetObjectsWithTag("vihu");
120                if (vihut == null || vihut.Count == 0) return;
121
122                //vihut.Sort((a, b) => Vector.Distance(a.Position, ase.AbsolutePosition) > Vector.Distance(b.Position, ase.AbsolutePosition) ? 1 : -1);
123                vihut.Sort((a,b) => JarjestaVihut(ase, a, b));
124                ase.Angle = (vihut[0].Position - ase.AbsolutePosition).Angle;
125                PhysicsObject ammus = ase.Shoot();
126
127                if (ammus != null)
128                {
129                    ammus.Size *= 0.5;
130                    ammus.Image = cannonballKuva; 
131                    ammus.MaximumLifetime = TimeSpan.FromSeconds(2.0);
132                }
133            };
134            ajastin.Start();
135
136            ollaanRakentamassa = false;
137            seurattava = null;
138        }
139    }
140
141
142    void JarjestaVihuPolku()
143    {
144        polkuList = new List<Vector>();
145       
146        polkuList = polku.Values.ToList();
147        Vector viimeinen = new Vector((polkuList.ElementAt(polkuList.Count-1).X +40), (polkuList.ElementAt(polkuList.Count-1)).Y);
148        polkuList.Add(viimeinen);
149    }
150
151
152    void LuoPolku(Vector paikka, double leveys, double korkeus)
153    {
154        GameObject taso = new GameObject(leveys, korkeus);
155        taso.Position = paikka;
156        taso.Image = Hiekkakuva;
157        //taso.IgnoresCollisionResponse=true;
158        //taso.CollisionIgnoreGroup = 2;
159        Add(taso, -3);
160        taso.Color = Color.Brown;
161       
162    }
163
164    void Luokivi(Vector paikka, double leveys, double korkeus)
165    {
166        PhysicsObject taso = PhysicsObject.CreateStaticObject(leveys, korkeus);
167        taso.Position = paikka;
168        taso.Image = maakuva;
169        taso.CollisionIgnoreGroup = 1;
170        Add(taso);
171        taso.Color = Color.Gray;
172    }
173
174   
175   
176    void LuoVihuPolku(Vector paikka, double leveys, double korkeus, int reittiPisteenJarjestysnro)
177    {
178        PhysicsObject taso = PhysicsObject.CreateStaticObject(leveys, korkeus);
179        taso.Position = paikka;
180        if (reittiPisteenJarjestysnro == 0) aloitusPaikka = paikka;
181        polku.Add(reittiPisteenJarjestysnro, paikka);
182        taso.Image = Hiekkakuva;
183        taso.CollisionIgnoreGroup = 1;
184        Add(taso, -3);
185        taso.Color = Color.Brown;
186    }
187
188    void LuoVihu(double leveys, double korkeus)
189    {
190        Vihu vihu = new Vihu (51, 51);
191        vihu.Position = aloitusPaikka;
192        vihu.Image = norsukuva;
193        vihu.CollisionIgnoreGroup = 1;
194        vihu.Tag = "vihu";
195        vihu.CanRotate = false;
196        Add(vihu, 3);
197        AddCollisionHandler(vihu, "Tukikohta", ElamaMenetys);
198       
199
200        ProgressBar elamaPalkki = new ProgressBar(50, 5);
201        elamaPalkki.X = Screen.Left + 150;
202        elamaPalkki.Y = Screen.Top - 20;
203        elamaPalkki.BindTo(vihu.ElamaLaskuri);
204        Add(elamaPalkki);
205
206        Timer ajastin = new Timer();
207        ajastin.Interval = 0.01;
208        ajastin.Timeout += delegate
209        {
210            elamaPalkki.Position = Camera.WorldToScreen(vihu.Position)+new Vector(0,-30);
211        };
212        ajastin.Start();
213        vihu.Destroyed += delegate
214        {
215            elamaPalkki.Destroy();
216        };
217       
218        PathFollowerBrain polkuAivot = new PathFollowerBrain(polkuList);
219        polkuAivot.Speed = 80;
220        polkuAivot.Active = true;
221
222        vihu.Brain = polkuAivot;
223    }
224
225    void LuoTorniNappula(Vector paikka, double leveys, double korkeus, Image rakennusKuva, int hinta, int rakennusKoko)
226    {
227        menuNappi = new PushButton(leveys, korkeus, nappulaKuva);
228        menuNappi.Position = new Vector( 0,  (Level.Bottom));
229        menuNappi.Clicked += new Action(() => AnnaRakennus(rakennusKoko, rakennusKoko*2, hinta, rakennusKuva));
230        Add(menuNappi);
231        Mouse.ListenMovement(1.0, delegate
232        {
233            if (Mouse.IsCursorOn(menuNappi))
234            {
235                menuHelperNaytto.IsVisible = true;
236                menuHelperNaytto.Text = "Torni, " + hinta + " kultaa";
237                menuHelperNaytto.Position = Mouse.PositionOnWorld + new Vector(menuHelperNaytto.Width / 2 + 10, 0);
238            }
239        }, null
240            );
241    }
242
243
244    void LuoMenu()
245    {
246        menuHelperNaytto = new Label("");
247        menuHelperNaytto.XMargin = 7.0;
248        menuHelperNaytto.YMargin = 7.0;
249        menuHelperNaytto.Color = new Color(0, 0, 0, 100);
250        menuHelperNaytto.TextColor = Color.White;
251        menuHelperNaytto.IsVisible = false;
252        Add(menuHelperNaytto);
253    }
254
255    void AnnaRakennus(double leveys, double korkeus, int hinta, Image kuva)
256    {
257        if (ollaanRakentamassa) return;
258        if (hinta > rahalaskuri.Value) { MessageDisplay.Add("Ei tarpeeksi kultaa!"); return; }
259        rahalaskuri.Value -= hinta;
260
261        GameObject talo = new GameObject(leveys, korkeus);
262        talo.Color = Color.Black;
263        talo.Image = kuva;
264        talo.Position = Mouse.PositionOnScreen;
265        ollaanRakentamassa = true;
266        seurattava = talo;
267        Add(talo, 3);
268        //rakennetutTalot.Add(talotyyppi);
269    }
270
271    void LuoRahalaskuri()
272    {
273        rahalaskuri = new IntMeter(80, 0, int.MaxValue);
274
275        Label rahanaytto = new Label();
276        rahanaytto.X = Screen.Right - 70;
277        rahanaytto.Y = Screen.Top - 20;
278        rahanaytto.TextColor = Color.White;
279        rahanaytto.Color = new Color(0, 0, 0, 100);
280        rahanaytto.XMargin = 7.0;
281        rahanaytto.YMargin = 7.0;
282        rahanaytto.BindTo(rahalaskuri);
283        rahanaytto.IntFormatString = "Kultaa: {0:D1}";
284        Add(rahanaytto);
285    }
286    void AmmusOsui(PhysicsObject ammus, PhysicsObject kohde)
287    {
288        ammus.Destroy();
289        if (kohde.Tag.ToString() == "vihu")
290        {
291            Vihu vihu = kohde as Vihu;
292            vihu.ElamaLaskuri.Value -= 1;
293
294            if (vihu.ElamaLaskuri.Value == 0)
295            {
296
297                kohde.Destroy();
298                rahalaskuri.AddValue(10);
299            }
300        }
301    }
302
303    void LuoElamaLaskuri()
304    {
305        elamaLaskuri = new DoubleMeter(10);
306        elamaLaskuri.MaxValue = 10;
307        elamaLaskuri.LowerLimit += ElamaLoppui;
308
309        ProgressBar elamaPalkki = new ProgressBar(150, 20);
310        elamaPalkki.X = Screen.Right - 250;
311        elamaPalkki.Y = Screen.Top - 20;
312        elamaPalkki.BindTo(elamaLaskuri);
313        Add(elamaPalkki);
314    }
315
316    void ElamaLoppui()
317    {
318        MessageDisplay.Add("Hahaaaaaaa Hävisit :D.");
319        Timer.SingleShot(5, Exit);
320       
321    }
322
323    void LuoTukikohta(Vector paikka, double leveys, double korkeus)
324    {
325        PhysicsObject taso = PhysicsObject.CreateStaticObject(leveys, korkeus);
326        taso.Position = paikka;
327        taso.Image = Hiekkakuva;
328        Add(taso);
329        taso.Tag = "Tukikohta";
330       
331    }
332    void ElamaMenetys(PhysicsObject vihu, PhysicsObject Tukikohta)
333    {
334        elamaLaskuri.Value -= 1;
335        vihu.Destroy();
336    }
337
338    void HuijausKoodi()
339    {
340       rahalaskuri.AddValue(800);
341       MessageDisplay.Add("Koodi aktivoitu: Lisää rahaa");
342     
343    }
344    void HuijausKoodi2()
345    {
346        elamaLaskuri.Value += 10000;
347        MessageDisplay.Add("Koodi aktivoitu: Lisää elämiä");
348    }
349
350
351
352}
353class Vihu : PhysicsObject
354{
355    private IntMeter elamaLaskuri = new IntMeter(3, 0, 3);
356    public IntMeter ElamaLaskuri { get { return elamaLaskuri; } }
357
358    public Vihu(double leveys, double korkeus)
359        : base(leveys, korkeus)
360    {
361        //elamaLaskuri.LowerLimit += delegate { this.Destroy(); };
362
363    }
364
365}
Note: See TracBrowser for help on using the repository browser.