source: 2013/23/OsamaA/Magneta/Magneta/Magneta/Magneta.cs @ 4039

Revision 4039, 17.8 KB checked in by osomalab, 6 years ago (diff)
Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4using Jypeli.Assets;
5using Jypeli.Controls;
6using Jypeli.Effects;
7using Jypeli.Widgets;
8
9namespace MagnetaNS
10{
11    public partial class Magneta : PhysicsGame
12    {
13        bool toiminta;
14        Seurattava pelaaja;
15        Vector suunta;
16        GameObject nelio;
17        Timer tarkistaValtaus;
18        List<Seuraaja> minionit;
19        List<Seuraaja> valitutMinionit;
20        List<Tukikohta> valitutTukikohdat;
21        List<Seuraaja> hirviot;
22        List<Tukikohta> tukikohdat;
23        List<Seurattava> pelaajanTKValtauskentat;
24
25        public override void Begin()
26        {
27            // TODO: Kirjoita ohjelmakoodisi tähän
28            IsFullScreen = false;
29            PhoneBackButton.Listen(ConfirmExit, "Lopeta peli");
30            Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
31            IsMouseVisible = true;
32            luoKentta();
33            asetaNappaimet();
34        }
35
36        public void luoKentta()
37        {
38            minionit = new List<Seuraaja>();
39            valitutMinionit = new List<Seuraaja>();
40            valitutTukikohdat = new List<Tukikohta>();
41            hirviot = new List<Seuraaja>();
42            tukikohdat = new List<Tukikohta>();
43            pelaajanTKValtauskentat = new List<Seurattava>();
44            tarkistaValtaus = new Timer();
45            tarkistaValtaus.Interval = 0.1;
46            tarkistaValtaus.Start();
47            tarkistaValtaus.Timeout += timeout;
48            toiminta = false;
49            suunta = Vector.Zero;
50            Level.CreateBorders();
51            Level.Background.Image = LoadImage("Osamapelin_wheedi");
52            Level.Background.TileToLevel();
53            luoPelaaja();
54            Image image = LoadImage("Osamapeli_valloituskentta_hirvion");
55            AddCollisionHandler(pelaaja, "hirvio", CollisionHandler.AddMeterValue(pelaaja.HP, -1));
56            luoTukikohta(50, 0, 40, true, delegate { luoMinioni(50, 0); }, new Vector(100, 100), 1);
57            luoTukikohta(-200, -200, 40, false, delegate { luoHirvio(-200, -200); }, new Vector(-50, 100), 1);
58            luoTukikohta(-250, 150, 40, false, delegate { luoHirvio(-250, 150); }, new Vector(0, 70), 1);
59            luoTukikohta(460, 300, 40, false, delegate { luoHirvio(460, 300); }, new Vector(-80, 30), 1);
60            luoTukikohta(300, -199, 40, false, delegate { luoHirvio(300, -199); }, new Vector(50, -100), 1);
61            luoTukikohta(150, -250, 40, true, delegate { luoMinioni(150, -250); }, new Vector(50, -100), 1);
62            luoTukikohta(0, 350, 40, true, delegate { luoMinioni(0, 350); }, new Vector(50, -100), 1);
63        }
64
65        public void eiMitaan(int a, int b)
66        {
67        }
68
69        public void luoPelaaja()
70        {
71
72            pelaaja = new Seurattava(20, 20, 10);
73            pelaaja.Image = LoadImage("Osamapelin_Sankari");
74            pelaaja.CanRotate = false;
75            pelaaja.Restitution = 0.0;
76            pelaaja.LinearDamping = 0.95;
77            pelaaja.Shape = Shape.Circle;
78            pelaaja.Mass = 20;
79            pelaaja.Tag = "pelaaja";
80            Add(pelaaja, -2);
81
82        }
83
84        public void luoKentta(int tukikohtienmaara, int tukikohtiaPelaajalla, int minEtaisyys)
85        {
86            {
87                double tukikohtaX;
88                double tukikohtaY;
89                double maxEtaisyys = Level.Left;
90                int mones;
91                Vector tukikohta_sijainti;
92                Vector valloituskentta_sijainti;
93                for (int i = 0; i < tukikohtienmaara; i++)
94                {
95                    mones = 300;
96                    do
97                    {
98                        do
99                        {
100                            tukikohtaX = RandomGen.NextDouble(Level.Left, Level.Right);
101                            tukikohtaY = RandomGen.NextDouble(Level.Bottom, Level.Top);
102                            tukikohta_sijainti = new Vector(tukikohtaX, tukikohtaY);
103                            mones--;
104                        } while (!onkoLiianLahella(tukikohta_sijainti, mones) || mones < minEtaisyys);
105                        mones = 200;
106                        do
107                        {
108                            valloituskentta_sijainti = RandomGen.NextVector(50, mones);
109                        } while (!onkoLiianLahella(valloituskentta_sijainti, mones) || mones < minEtaisyys);
110                    } while (maxEtaisyys > minEtaisyys);
111                }
112            }
113        }
114
115        public bool onkoLiianLahella(Vector piste, double etaisyys)
116        {
117            foreach (var item in tukikohdat)
118            {
119                if ((item.Position - piste).Magnitude < 300 || (item.Valtauskentta.Position - piste).Magnitude < 300)
120                {
121                    return true;
122                }
123            }
124            return false;
125        }
126
127        public void luoMinioni(double x, double y)
128        {
129            this.luoMinioni(new Vector(x, y));
130        }
131
132        public void luoMinioni(Vector sijainti, Vector minne)
133        {
134            Seuraaja minioni = new Seuraaja(20, 20, 2);
135            minioni.Image = LoadImage("Osamapelin_minioni");
136            minioni.Position = sijainti;
137            minioni.Restitution = 0.0;
138            minioni.LinearDamping = 0.75;
139            minioni.Shape = Shape.Circle;
140            minioni.Mass = 0.1;
141            minioni.Tag = "minioni";
142            minionit.Add(minioni);
143            AddCollisionHandler(minioni, "hirvio", CollisionHandler.AddMeterValue(minioni.HP, -1));
144            minioni.Destroyed +=
145            delegate
146            {
147                minionit.Remove(minioni);
148            };
149            Add(minioni, -3);
150            minioni.MoveTo(minne, 100);
151        }
152        public void luoMinioni(Vector sijainti)
153        {
154            luoMinioni(sijainti, RandomGen.NextVector(100, 100));
155        }
156
157        public void luoHirvio(double x, double y)
158        {
159            this.luoHirvio(new Vector(x, y));
160        }
161
162        public void luoHirvio(Vector v)
163        {
164            Seuraaja hirvio = new Seuraaja(20, 20, 1);
165            hirvio.Image = LoadImage("Osamapelin_orkkeli");
166            hirvio.Position = v;
167            hirvio.Restitution = 0.0;
168            hirvio.LinearDamping = 0.75;
169            hirvio.Shape = Shape.Circle;
170            hirvio.Color = Color.Brown;
171            hirvio.Tag = "hirvio";
172            AddCollisionHandler(hirvio, "minioni", CollisionHandler.AddMeterValue(hirvio.HP, -1));
173            hirvio.Mass = 15;
174            hirvio.Destroyed += delegate
175            {
176                hirviot.Remove(hirvio);
177            };
178            hirviot.Add(hirvio);
179            Add(hirvio, -2);
180
181        }
182
183        public void luoTukikohta(double x, double y, double spawnausAika, bool onkoPelaajan, Action tapahtuuSpawnatessa, Vector ase, double valtausAika)
184        {
185            Tukikohta tukikohta = new Tukikohta(x, y, 
186                valtausAika, onkoPelaajan, delegate { tapahtuuSpawnatessa(); }, ase, 
187                spawnausAika, LoadImage("Osamapelin_minionitorneli"), LoadImage("Osamapelin_orkkelimokkeli"),
188                LoadImage("Osamapeli_valloituskentta_pelaajan"), LoadImage("Osamapeli_valloituskentta_hirvion"));
189            tukikohdat.Add(tukikohta);
190            if (onkoPelaajan == true)
191            {
192                pelaajanTKValtauskentat.Add(tukikohta.Valtauskentta);
193            }
194            Add(tukikohta, -1);
195        }
196
197        public void timeout()
198        {
199            tarkistaValtauskentat();
200            jokamiesLiikkeelle();
201        }
202
203        /// <summary>
204        ///
205        /// </summary>
206        public void tarkistaValtauskentat()
207        {
208            for (int i = 0; i < tukikohdat.Count; i++)
209            {
210                int ii = i;
211                List<Seurattava> sisalla = tukikohdat[ii].KetaOnSisalla<Seurattava>(GetObjects(x => true));
212                if (sisalla.Count == 0) continue;
213                Seurattava seurattava = null;
214                if (tukikohdat[ii].OnkoPelaajan == true)        //jos pelaajan, etsii hirviön
215                {
216                    foreach (var item in sisalla)
217                    {
218                        if (item.Tag.ToString() == "hirvio")
219                        {
220                            seurattava = item;
221                            continue;
222                        }
223                    }
224                }
225                else
226                {
227                    foreach (var item in sisalla)
228                    {
229                        if (item.Tag.ToString() == "pelaaja")
230                        {
231                            seurattava = item;
232                            continue;
233                        }
234                    }
235                }
236                if (seurattava == null) continue;
237                if (tukikohdat[ii].AloitaValtaus(seurattava))    // Aloittaa valtauksen, jos saa vallatuksi, suorittaa
238                {
239                    if (tukikohdat[ii].OnkoPelaajan)             // jos pelaaja saa vallatuksi
240                    {
241                        pelaajanTKValtauskentat.Add(tukikohdat[ii].Valtauskentta);
242                        tukikohdat[ii].TapahtuuSpawnatessa = delegate
243                        {
244                            luoMinioni(tukikohdat[ii].Position);
245                        };
246                        continue;
247                    }
248                    tukikohdat[ii].TapahtuuSpawnatessa = delegate { luoHirvio(tukikohdat[ii].Position); };       // jos hirviö saa vallatuksi
249                    foreach (var item in hirviot)
250                    {
251                        item.PoistaSeurattava();
252                    }
253                    pelaajanTKValtauskentat.Remove(tukikohdat[ii].Valtauskentta);
254                    valitutTukikohdat.Remove(tukikohdat[ii]);
255                }
256            }
257        }
258
259        public void asetaNappaimet()
260        {
261            Mouse.Listen(MouseButton.Left, ButtonState.Pressed, valintanelio, "Valitsee minionit valitulta alueelta");
262            Mouse.Listen(MouseButton.Left, ButtonState.Released, suoritaValinta, "Liikuttaa valitut minionit haluamaan paikkaan");
263            Mouse.Listen(MouseButton.Right, ButtonState.Pressed, suoritaKomento, "Suorittaa komennon");
264            Keyboard.Listen(Key.W, ButtonState.Pressed, asetaSuunta, "ylös", pelaaja, new Vector(0.0, 1.0));
265            Keyboard.Listen(Key.A, ButtonState.Pressed, asetaSuunta, "vasen", pelaaja, new Vector(-1.0, 0.0));
266            Keyboard.Listen(Key.S, ButtonState.Pressed, asetaSuunta, "alas", pelaaja, new Vector(0.0, -1.0));
267            Keyboard.Listen(Key.D, ButtonState.Pressed, asetaSuunta, "oikea", pelaaja, new Vector(1.0, 0.0));
268            Keyboard.Listen(Key.W, ButtonState.Released, asetaSuunta, null, pelaaja, new Vector(0.0, -1.0));
269            Keyboard.Listen(Key.A, ButtonState.Released, asetaSuunta, null, pelaaja, new Vector(1.0, 0.0));
270            Keyboard.Listen(Key.S, ButtonState.Released, asetaSuunta, null, pelaaja, new Vector(0.0, 1.0));
271            Keyboard.Listen(Key.D, ButtonState.Released, asetaSuunta, null, pelaaja, new Vector(-1.0, 0.0));
272            Keyboard.Listen(Key.W, ButtonState.Down, liikutaPelaajaa, null);
273            Keyboard.Listen(Key.A, ButtonState.Down, liikutaPelaajaa, null);
274            Keyboard.Listen(Key.S, ButtonState.Down, liikutaPelaajaa, null);
275            Keyboard.Listen(Key.D, ButtonState.Down, liikutaPelaajaa, null);
276            Keyboard.Listen(Key.Q, ButtonState.Pressed, valitseKaikkiMinionit, null);
277            Keyboard.Listen(Key.F, ButtonState.Pressed, Seuraa, null, valitutMinionit, pelaaja);
278            Keyboard.Listen(Key.LeftShift, ButtonState.Pressed, onkoToiminnassa, "Lisää näppäimiä hiirelle", true);
279            Keyboard.Listen(Key.LeftShift, ButtonState.Released, onkoToiminnassa, "Lisää näppäimiä hiirelle", false);
280        }
281
282        public void asetaSuunta(PhysicsObject obj, Vector lisaa)
283        {
284            pelaaja.Velocity = Vector.Zero;
285            suunta += lisaa;
286        }
287
288        public void liikutaPelaajaa()
289        {
290            if (suunta == Vector.Zero)
291            {
292                pelaaja.Velocity = Vector.Zero;
293            }
294            else
295            {
296                pelaaja.Velocity = Vector.FromLengthAndAngle(200.0, suunta.Angle);
297            }
298        }
299
300        public void valintanelio()
301        {
302            Vector null1 = Mouse.PositionOnWorld;
303            nelio = new GameObject(0.0, 0.0);
304            nelio.Color = new Color(255, 255, 255, 100);
305            Add(nelio);
306            Mouse.ListenMovement(0.0, seuraaHiirta, "Siirtää valintaneliön nurkkaa", nelio, null1);
307        }
308
309        void seuraaHiirta(AnalogState hiirenTila, GameObject obj, Vector v)
310        {
311            Vector u = Mouse.PositionOnWorld;
312            obj.Position = new Vector((v.X + u.X) / 2, (v.Y + u.Y) / 2);
313            obj.Size = new Vector(Math.Abs(u.X - v.X), Math.Abs(u.Y - v.Y));
314        }
315
316        public void suoritaValinta()
317        {
318            if (toiminta == false)
319            {
320                valitutMinionit.Clear();
321                valitutTukikohdat.Clear();
322            }
323            if (nelio.Size.Magnitude < 10)
324            {
325                foreach (var item in tukikohdat)
326                {
327                    if (item.IsInside(nelio.Position) && item.OnkoPelaajan == true) 
328                    { 
329                        valitutTukikohdat.Add(item);
330                        Remove(nelio);
331                        return;
332                    }
333                }
334                foreach (var item in minionit)
335                {
336                    if (item.IsInside(nelio.Position))
337                    { 
338                        valitutMinionit.Add(item); 
339                        Remove(nelio);
340                        return; 
341                    }                   
342                }
343
344            }
345            for (int i = 0; i < minionit.Count; i++)
346            {
347                // Valitaan minionit, jotka on neliövalinnan sisäpuolella
348                if (nelio.IsInside(minionit[i].Position))
349                {
350                    valitutMinionit.Add(minionit[i]);
351                }
352            }
353            Remove(nelio);
354        }
355
356        public void valitseKaikkiMinionit()
357        {
358            valitutMinionit.Clear();
359            foreach (var item in minionit)
360            {
361                valitutMinionit.Add(item);
362            }
363        }
364
365        public void onkoToiminnassa(bool onko)
366        {
367            toiminta = onko;
368        }
369
370        public void suoritaKomento()
371        {
372            Vector sijainti = Mouse.PositionOnWorld;
373            List<GameObject> oliotHiirenAlla = GetObjectsAt(sijainti).FindAll(x => x is Seurattava);
374            foreach (var item in valitutTukikohdat)
375            {
376                item.TapahtuuSpawnatessa = delegate { luoMinioni(item.Position, sijainti); };
377            }
378            if (oliotHiirenAlla.Count == 0)
379            {
380                foreach (var item in valitutMinionit)
381                {
382                    item.lopetaSeuraaminen();
383                    item.MoveTo(Mouse.PositionOnWorld, 100);
384                }
385                return;
386            }
387
388            Seurattava olioHiirenAlla = (Seurattava)oliotHiirenAlla[0];
389            Seuraa(valitutMinionit, olioHiirenAlla);
390        }
391
392        public void jokamiesLiikkeelle()
393        {
394            if (pelaajanTKValtauskentat.Count == 0) Seuraa(hirviot, pelaaja);
395            Seuraa(hirviot, pelaajanTKValtauskentat);
396            //if (pelaajanTKValtauskentat.Count > 2)
397            //{
398                double etaisyysPelaajasta;
399                double etaisyysSeurattavasta;
400                foreach (var item in hirviot)
401                {
402                    etaisyysPelaajasta = (item.Position - pelaaja.Position).Magnitude;
403                    etaisyysSeurattavasta = (item.Position - item.olioJotaSeurataan.Position).Magnitude;
404                    if (etaisyysPelaajasta < etaisyysSeurattavasta)
405                    {
406                        Seuraa(item, pelaaja);
407                    }
408                }
409            //}
410            Seuraa(minionit);
411            liikkumisAnimaatio(hirviot);
412            liikkumisAnimaatio(minionit);
413            List<Seurattava> pelaaa = new List<Seurattava>();
414            pelaaa.Add(pelaaja);
415            liikkumisAnimaatio(pelaaa);
416        }
417
418
419
420        //public void LiikutaSeuraajia(List<Seuraaja> lista, Seurattava seurattava)
421        //{
422        //    foreach (var item in lista)
423        //    {
424        //        item.MoveTo(seurattava.Position, 100);
425        //    }
426        //}
427
428        public void liikkumisAnimaatio(List<Seuraaja> seuraajat)
429        {
430            if (seuraajat.Count > 0)
431            {
432                for (int i = 0; i < seuraajat.Count; i++)
433                {
434                    seuraajat[i].Angle = seuraajat[i].Velocity.Angle + Angle.FromDegrees(-90);
435                    if (seuraajat[i].Velocity.Magnitude >= 1)
436                    {
437                        seuraajat[i].AngularVelocity = 5;
438                    }
439                    else seuraajat[i].AngularVelocity = 0;
440                }
441            }
442        }
443        public void liikkumisAnimaatio(List<Seurattava> seuraajat)
444        {
445            if (seuraajat.Count > 0)
446            {
447                for (int i = 0; i < seuraajat.Count; i++)
448                {
449                    seuraajat[i].Angle = seuraajat[i].Velocity.Angle + Angle.FromDegrees(-90);
450                    if (seuraajat[i].Velocity.Magnitude >= 1)
451                    {
452                        seuraajat[i].AngularVelocity = 5;
453                    }
454                    else seuraajat[i].AngularVelocity = 0;
455                }
456            }
457        }
458    }
459
460}
Note: See TracBrowser for help on using the repository browser.