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

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