source: 2014/koodauskerho/38/JaakkoS/FarmDefense/FarmDefense/FarmDefense/FarmDefense.cs @ 5818

Revision 5818, 8.5 KB checked in by sieerinn, 7 years ago (diff)
Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4using Jypeli.Assets;
5using Jypeli.Controls;
6using Jypeli.Effects;
7using Jypeli.Widgets;
8using System.Linq;
9
10public class FarmDefense : PhysicsGame
11{
12    Image nurmikonKuva = LoadImage("nurmikko");
13    Image tienKuva = LoadImage("tie");
14    Image kanankuva = LoadImage("kana");
15    Image kananmuna = LoadImage("muna1");
16    Image[] Sudenkuvat = LoadImages("sus1", "sus2");
17
18    List<Vector> pisteet;
19    Vector[] pisteTaulu;
20    List<Vector> rahat;
21    Vector[] rahaTaulu;
22
23    int aalto = 1;
24    IntMeter elämät;
25    IntMeter rahaLaskuri;
26
27    GameObject cursor;
28
29    public override void Begin()
30    {
31        IsMouseVisible = true;
32        SmoothTextures = false;
33        Aloitapeli();
34    }
35
36    void Aloitapeli()
37    {
38        ClearAll();
39        PhoneBackButton.Listen(ConfirmExit, "Lopeta peli");
40        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
41
42        pisteet = new List<Vector>();
43        pisteTaulu = new Vector[10];
44
45        elämät = new IntMeter(10, 0, 10);
46
47        Label pisteNaytto = new Label();
48        pisteNaytto.X = Screen.Left + 100;
49        pisteNaytto.Y = Screen.Top - 100;
50        pisteNaytto.TextColor = Color.Black;
51        pisteNaytto.Color = Color.White;
52        pisteNaytto.BindTo(elämät);
53        Add(pisteNaytto);
54
55        elämät.LowerLimit += GameOver;
56
57
58        rahaLaskuri = new IntMeter(20, 0, 9999 );
59
60        Label rahaNaytto = new Label();
61        rahaNaytto.X = Screen.Right - 100;
62        rahaNaytto.Y = Screen.Top - 100;
63        rahaNaytto.TextColor = Color.White;
64        rahaNaytto.Color = Color.Blue;
65        rahaNaytto.Title = "Rahat";
66        rahaNaytto.BindTo(rahaLaskuri);
67        Add(rahaNaytto);
68
69
70        TileMap ruudut = TileMap.FromLevelAsset("kenttä1");
71
72        ruudut.SetTileMethod('.', LuoNurmikko);
73        ruudut.SetTileMethod('T', LuoTie);
74        ruudut.SetTileMethod('0', LuoKulma, 0);
75        ruudut.SetTileMethod('1', LuoKulma, 1);
76        ruudut.SetTileMethod('2', LuoKulma, 2);
77        ruudut.SetTileMethod('3', LuoKulma, 3);
78        ruudut.SetTileMethod('4', LuoKulma, 4);
79        ruudut.SetTileMethod('5', LuoKulma, 5);
80        ruudut.SetTileMethod('6', LuoKulma, 6);
81        ruudut.SetTileMethod('7', LuoKulma, 7);
82        ruudut.SetTileMethod('8', LuoKulma, 8);
83        ruudut.SetTileMethod('9', LuoKulma, 9);
84        ruudut.Execute(70, 100);
85
86        foreach (Vector p in pisteTaulu)
87        {
88            if (p != Vector.Zero)
89            {
90                pisteet.Add(p);
91            }
92        }
93
94        Timer.SingleShot(2, Luoaalto);
95
96        Luopainikkeet();
97
98        cursor = new GameObject(50, 50);
99        cursor.Color = Color.Transparent;
100        Add(cursor);
101        Mouse.ListenMovement(0, hiirenliikutus, null);
102        Mouse.Listen(MouseButton.Left, ButtonState.Released, LuoKana, null);
103    }
104
105    void LuoKana()
106    {
107        if (cursor.Image == null)
108        {
109            return;
110        }
111
112        GameObject kana = new GameObject(50, 50);
113        kana.Image = cursor.Image;
114        kana.Position = Mouse.PositionOnWorld;
115        Add(kana);
116
117        AssaultRifle ase;
118        ase = new AssaultRifle(30, 10);
119        ase.ProjectileCollision = AmmusOsui;
120        ase.IsVisible = false;
121        kana.Add(ase);
122
123        Timer ajastin = new Timer();
124        ajastin.Interval = 0.8;
125        ajastin.Timeout += delegate
126        {
127            var vihut = GetObjectsWithTag("susi").Where((GameObject o) => Vector.Distance(kana.Position, o.Position) < 300).ToList();
128            vihut.Sort((GameObject o1, GameObject o2) => Vector.Distance(o1.Position, kana.Position).CompareTo(Vector.Distance(o2.Position, kana.Position)));
129
130            if (vihut.Count > 0)
131            {
132                ase.AbsoluteAngle = (vihut[0].Position - kana.Position).Angle;
133                AmmuAseella(ase);
134            }
135        };
136        ajastin.Start();
137
138        cursor.Image = null;
139    }
140
141    void AmmusOsui(PhysicsObject ammus, PhysicsObject kohde)
142    {
143        ammus.Destroy();
144        if (kohde.Tag == "susi")
145        {
146            Vihu vihu = (Vihu)kohde;
147            vihu.Elamalaskuri.Value--;
148            if (vihu.Elamalaskuri.Value == vihu.Elamalaskuri.MinValue) rahaLaskuri.Value += 1;
149        }
150    }
151
152    void AmmuAseella(AssaultRifle ase)
153    {
154        PhysicsObject ammus = ase.Shoot();
155
156        if (ammus != null)
157        {
158            ammus.Size *= 1.5;
159            ammus.Image = kananmuna;
160            ammus.MaximumLifetime = TimeSpan.FromSeconds(8.0);
161        }
162    }
163
164    void hiirenliikutus(AnalogState hiirenTila)
165    {
166        cursor.X = Mouse.PositionOnWorld.X;
167        cursor.Y = Mouse.PositionOnWorld.Y;
168    }
169
170
171    void Luopainikkeet()
172    {
173        GameObject kana = new GameObject(50, 50);
174        kana.Image = kanankuva;
175        kana.Position = new Vector(Level.Right - 50, 0);
176        Add(kana);
177        Mouse.ListenOn(kana, MouseButton.Left, ButtonState.Pressed, delegate
178        {
179            if (rahaLaskuri.Value >= 10)
180            {
181                rahaLaskuri.Value -= 10;
182                cursor.Image = kana.Image;
183            }
184
185        }, null);
186
187    }
188
189    void GameOver()
190    {
191        MultiSelectWindow valikko = new MultiSelectWindow("Hävisit!", "Uudestaan", "Lopeta");
192        valikko.ItemSelected += PainettiinValikonNappia;
193        Add(valikko);
194    }
195
196    void PainettiinValikonNappia(int valinta)
197    {
198        switch (valinta)
199        {
200            case 0:
201                Aloitapeli();
202                break;
203            case 1:
204                Exit();
205                break;
206        }
207    }
208
209
210    void LuoKentta()
211    {
212        TileMap ruudut = TileMap.FromLevelAsset("kenttä1");
213        ruudut.SetTileMethod('T', LuoTie);
214        ruudut.SetTileMethod('.', LuoNurmikko);
215        ruudut.Execute(20, 20);
216    }
217    void LuoNurmikko(Vector paikka, double leveys, double korkeus)
218    {
219        GameObject nurmikko = new GameObject(leveys, korkeus);
220        nurmikko.Position = paikka;
221        nurmikko.Shape = Shape.Rectangle;
222        nurmikko.Tag = "nurmikko";
223        nurmikko.Image = nurmikonKuva;
224        Add(nurmikko, -1);
225    }
226
227    void LuoTie(Vector paikka, double leveys, double korkeus)
228    {
229        GameObject tie = new GameObject(leveys, korkeus);
230        tie.Position = paikka;
231        tie.Shape = Shape.Rectangle;
232        tie.Tag = "tie";
233        tie.Image = tienKuva;
234        Add(tie, -1);
235    }
236
237    void LuoKulma(Vector paikka, double leveys, double korkeus, int numero)
238    {
239        GameObject tie = new GameObject(leveys, korkeus);
240        tie.Position = paikka;
241        tie.Shape = Shape.Rectangle;
242        tie.Tag = "tie";
243        tie.Image = tienKuva;
244        Add(tie, -1);
245
246        pisteTaulu[numero] = paikka;
247    }
248
249    void Luoaalto()
250    {
251        int susia = 5 + aalto * 3;
252
253        Timer ajastin = new Timer();
254        ajastin.Interval = 1.5;
255        ajastin.Timeout += delegate
256        {
257            if (susia > 0)
258            {
259                susia--;
260                MessageDisplay.Add("Uusi susi energiamäärällä: " + 3 * (aalto / 2.0));
261                LuoSusi(3 * (aalto / 2.0 ));
262            }
263            else
264            {
265                ajastin.Stop();
266                MessageDisplay.Add("Aalto loppui, seuraava 10s kuluttua!");
267                aalto++;
268                Timer.SingleShot(10, Luoaalto);
269            }
270        };
271        ajastin.Start();
272
273    }
274
275    void LuoSusi(double kestavyys)
276    {
277        Vihu susi = new Vihu(70, 100);
278        susi.Image = Sudenkuvat[0];
279        Animation animaatio = new Animation(Sudenkuvat);
280        animaatio.FPS = 4;
281        susi.Animation = animaatio;
282        susi.Position = pisteet[0];
283        susi.Animation.Start();
284        susi.CollisionIgnoreGroup = 1;
285        susi.CanRotate = false;
286        susi.Tag = "susi";
287        susi.MuutaElamamaara(kestavyys);
288        Add(susi);
289
290        Timer sudenkaanto = new Timer();
291        sudenkaanto.Interval = 0.1;
292        sudenkaanto.Timeout += delegate { KaannaSusi(susi); };
293        sudenkaanto.Start();
294
295
296        PathFollowerBrain Aivo = new PathFollowerBrain();
297        Aivo.Path = pisteet;
298        Aivo.Speed = 100;
299        Aivo.ArrivedAtEnd += delegate
300        {
301         
302            elämät.Value--;
303            susi.Destroy();
304        };
305        susi.Brain = Aivo;
306    }
307    void KaannaSusi(Vihu susi)
308    {
309        susi.Angle = susi.Velocity.Angle;
310    }
311
312
313}
314
Note: See TracBrowser for help on using the repository browser.