source: 2011/31/TeemuT/Diamond TD/Diamond TD/Diamond TD/Peli.cs @ 2548

Revision 2548, 7.8 KB checked in by tenituun, 8 years ago (diff)

Talletus.

Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4using Jypeli.Assets;
5using Jypeli.Controls;
6using Jypeli.Effects;
7using Jypeli.Widgets;
8
9public class Peli : PhysicsGame
10{
11    List<Vector> polku = new List<Vector>();
12    List<GameObject> ruohoelementit = new List<GameObject>();
13    Vector[] reitti;
14    int montakoRiviaKentassa = 55;
15    int montakoSarakettaKentassa = 74;
16    GameObject start;
17    PhysicsObject maali;
18    Image ruohokuva = LoadImage("ruoho");
19
20    bool asetetaanTykkia = false;
21    //double kuvaruudunLeveys = Screen.Width;
22    //double kuvaruudunKorkeus = Screen.Height;
23    double ruudunLeveys;
24    double ruudunKorkeus;
25
26    public override void Begin()
27    {
28        TeeKentta();
29        TeeKayttoliittyma();
30        LuoPolku();
31        /*
32        Timer ajastin = new Timer();
33        ajastin.Interval = 5;
34        ajastin.Timeout += LahetaAalto;
35        ajastin.Start(10);
36         */
37        Mouse.IsCursorVisible = true;
38    }
39       
40
41    void LahetaAalto()
42    {
43        Timer ajastin = new Timer();
44        ajastin.Interval = 0.2;
45        ajastin.Timeout += delegate { LuoVihollinen(3); };
46        ajastin.Start(10);
47    }
48
49    void TeeKentta()
50    {
51        Level.BackgroundColor = Color.ForestGreen;
52        TileMap ruudut = TileMap.FromLevelAsset("kentta2");       
53        ruudut.SetTileMethod('=', LuoPalikka);
54        ruudut.SetTileMethod('o', LuoPalikka);
55        ruudut.SetTileMethod('a', LuoWaypoint);
56        ruudut.SetTileMethod('s', LuoStartti);
57        ruudut.SetTileMethod('l', LuoMaali);
58        ruudut.SetTileMethod('r', LuoRuoho);
59        ruudunLeveys = Screen.Width / montakoSarakettaKentassa;
60        ruudunKorkeus = Screen.Height / montakoRiviaKentassa;
61        ruudut.Execute(ruudunLeveys, ruudunKorkeus);
62        Level.CreateBorders(1.0, true);
63        Camera.ZoomToLevel();
64    }
65    void LuoRuoho(Vector paikka, double leveys, double korkeus)
66    {
67        GameObject ruoho = new GameObject(leveys, korkeus);
68        ruoho.Position = paikka;
69        ruoho.Image = ruohokuva;
70        Add(ruoho);
71        ruohoelementit.Add(ruoho);
72
73    }
74
75    void TeeKayttoliittyma()
76    {
77        Widget playnappula = new Widget(90, 90);
78        playnappula.Bottom = Screen.Bottom + 10;
79        playnappula.Left = Screen.Left + 20;
80        playnappula.Image = LoadImage("play");
81        Add(playnappula);
82        Mouse.ListenOn(playnappula, MouseButton.Left, ButtonState.Pressed, LahetaAalto, null);
83
84        Widget tykkinappula = new Widget(90, 90);
85        tykkinappula.Left = playnappula.Right + 10;
86        tykkinappula.Bottom = playnappula.Bottom;
87        Add(tykkinappula);
88        Mouse.ListenOn(tykkinappula, MouseButton.Left, ButtonState.Pressed, NappiPainettu, null, tykkinappula);
89
90
91    }
92
93    void NappiPainettu(Widget w)
94    {
95        asetetaanTykkia = true;
96        Mouse.Listen(MouseButton.Left, ButtonState.Pressed, AsetaTykki, null, w);
97        w.Color = Color.Black;
98        // Voit muuttaa kuvaa
99    }
100
101    void AsetaTykki(Widget w)
102    {
103        if (asetetaanTykkia)
104        {
105            GameObject allaolevaruoho = ruohoelementit[0];
106            int i = 0;
107            while (i < ruohoelementit.Count)
108            {
109                if (Mouse.IsCursorOn(ruohoelementit[i]))
110                {
111                    allaolevaruoho = ruohoelementit[i];
112                    LuoTykki(allaolevaruoho.Position);
113                    break;
114                }
115                i++;
116            }
117            w.Color = Color.White;
118            asetetaanTykkia = false;
119        }
120    }
121
122    void LuoTykki(Vector paikka)
123    {
124
125        GameObject tykki = new GameObject(ruudunLeveys, ruudunKorkeus);
126        Add(tykki);
127        tykki.Position = paikka;
128        // Ajastin, jonka avulla ammutaan
129        Timer ajastin = new Timer();
130        ajastin.Interval = 0.2;
131        ajastin.Timeout += delegate { tykkiAmpuu(tykki); };
132        ajastin.Start();
133    }
134
135    void tykkiAmpuu(GameObject tykki)
136
137    {
138        PhysicsObject ammus = new PhysicsObject(5, 5, Shape.Circle);
139        Add(ammus);
140        ammus.Color = Color.Black;
141        ammus.Tag = "ammus";
142        ammus.Position = tykki.Position;
143        ammus.Hit(new Vector(0, 1000));
144
145        PhysicsObject vihu = EtsiLahinVihu(tykki.Position);
146
147    }
148
149    PhysicsObject EtsiLahinVihu(Vector position)
150    {
151        double pieninEtaisyys = 10000000.0;
152        PhysicsObject lahin = null;
153
154        foreach (PhysicsObject vihu in viholliset)
155        {
156            double etaisyys = Vector.Distance(vihu.Position, position);
157            if (etaisyys < pieninEtaisyys)
158            {
159                pieninEtaisyys = etaisyys;
160                lahin = vihu;
161            }
162        }
163
164        return lahin;
165    }
166
167    void LuoPolku()
168    {
169        reitti = ParsiReitti(start, polku);
170    }
171
172    void LuoWaypoint(Vector paikka, double leveys, double korkeus)
173    {
174        polku.Add(paikka);
175    }
176
177    void LuoStartti(Vector paikka, double leveys, double korkeus)
178    {
179        start = new GameObject(1, 1);
180        start.Position = paikka;
181    }
182
183    void LuoMaali(Vector paikka, double lev, double korkeus)
184    {
185        maali = PhysicsObject.CreateStaticObject(20, 20);
186        polku.Add(paikka);
187        maali.Position = paikka;
188        Add(maali);
189        AddCollisionHandler(maali, KasitteleMaalinTormaus);
190        maali.IsVisible = false;
191
192    }
193
194    void KasitteleMaalinTormaus(PhysicsObject maali, PhysicsObject vih)
195    {
196        vih.Destroy();
197    }
198
199    List<PhysicsObject> viholliset = new List<PhysicsObject>();
200
201    void LuoVihollinen(int elamapisteet)
202    {
203        Vihollinen vihu = new Vihollinen(20, 20);
204        vihu.Elamat = elamapisteet;
205        vihu.Position = start.Position;
206        vihu.IgnoresCollisionResponse = true;
207        viholliset.Add(vihu);
208
209        PathFollowerBrain testiaivot = new PathFollowerBrain();
210        testiaivot.Path = reitti;
211        testiaivot.Speed = 200;
212        testiaivot.Loop = false;
213
214        vihu.Brain = testiaivot;
215        Add(vihu);
216        vihu.Color = Color.Red;
217        vihu.Shape = Shape.Circle;
218        AddCollisionHandler(vihu, VihuOsui);
219    }
220
221    void VihuOsui(PhysicsObject vihu, PhysicsObject kohde)
222    {
223        if (kohde.Tag.ToString() == "ammus")
224        {
225            Vihollinen v = (Vihollinen)vihu;
226            v.Elamat--; // Vähennetään yksi elämäpiste
227            if (v.Elamat < 0) v.Destroy(); // Jos elämät menee alle 0 niin tuhotaan vihu
228        }
229    }
230
231    void LuoPalikka(Vector paikka, double leveys, double korkeus)
232    {
233        GameObject palikka = new GameObject(leveys, korkeus);
234        palikka.Position = paikka;
235        palikka.Shape = Shape.Rectangle;
236        palikka.Color = Color.Gray;
237        Add(palikka);
238
239    }
240
241    Vector[] ParsiReitti(GameObject npc, List<Vector> waypoints)
242    {
243        int n = waypoints.Count;
244        Vector[] reitti = new Vector[n];
245        Vector v = npc.Position;
246
247        for (int i = 0; i < n; i++)
248        {
249            v = FindNearest(waypoints, v);
250            waypoints.Remove(v);
251            reitti[i] = v;
252        }
253
254        return reitti;
255    }
256
257    Vector FindNearest(IEnumerable<Vector> list, Vector vector)
258    {
259        Vector nearest = Vector.Zero;
260        double minDistance = double.PositiveInfinity;
261
262        foreach (Vector candidate in list)
263        {
264            double d = Vector.Distance(vector, candidate);
265
266            if (d < minDistance)
267            {
268                nearest = candidate;
269                minDistance = d;
270            }
271        }
272
273        return nearest;
274
275
276
277
278
279
280    }
281}
282
283class Vihollinen : PhysicsObject
284{
285    public int Elamat = 3;
286
287    public Vihollinen(double leveys, double korkeus)
288        : base(leveys, korkeus)
289    {
290    }
291}
292
Note: See TracBrowser for help on using the repository browser.