source: 2015/26/TopiL/Spike Fall 2015/Spike Fall/Spike Fall/Spike_Fall.cs @ 6461

Revision 6461, 17.1 KB checked in by tolappal, 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;
8
9public class Spike_Fall : PhysicsGame
10{
11    EasyHighScore topLista = new EasyHighScore();
12
13
14
15    public override void Begin()
16    {
17        SetWindowSize(1280, 1024, true);
18        Valikko();
19    }
20
21
22
23    // "Räjähdys"juuba
24    ExplosionSystem es;
25
26
27    // Alkuvalikko
28    void Valikko()
29    {
30        ClearAll();
31        MultiSelectWindow alkuValikko = new MultiSelectWindow("Alkuvalikko",
32        "Pelaa peliä", "Lopeta");
33        Add(alkuValikko);
34        alkuValikko.ItemSelected += PainettiinValikonNappia;
35    }
36
37    // Menu
38    void PainettiinValikonNappia(int valinta)
39    {
40        switch (valinta)
41        {
42            case 0:
43                AloitaPeli();
44                break;
45            case 1:
46                Exit();
47                break;
48        }
49    }
50
51
52    // Hävitty peli
53    void LopetaPeli()
54    {
55        Keyboard.DisableAll();
56        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
57        Keyboard.Listen(Key.R, ButtonState.Pressed, AloitaPeli, null);
58        //topLista.EnterAndShow();
59        //topLista.HighScoreWindow.Closed += Valikko;
60    }
61
62
63
64    // Tawaraa
65    void AloitaPeli()
66    {
67        ClearAll();
68       
69
70        Timer.SingleShot(1, LuoAikaLaskuri);
71        Timer.SingleShot(1, AjastinPiikit);
72        Timer.SingleShot(1, AjastinKisu);
73
74        Timer.SingleShot(15.0, Ilmoitus1);
75        Timer.SingleShot(30.0, Ilmoitus2);
76        Timer.SingleShot(45.0, Ilmoitus3);
77        Timer.SingleShot(60.0, Ilmoitus4);
78
79        Gravity = new Vector(0, -700);
80
81        Level.CreateBorders(1.0, false);
82        Level.Background.CreateGradient(new Color(0, 0, 0), new Color(60, 60, 60));
83
84        Camera.ZoomToLevel();
85
86
87        // Veri-effectin tippuminen
88        Wind = new Vector(0, -300);
89        es = new ExplosionSystem(LoadImage("veri"), 3000);
90        es.MaxLifetime = 15;
91        es.MinLifetime = 10;
92        es.MinScale = 20;
93        es.MaxScale = 30;
94        es.MaxVelocity = 30;
95        es.MinVelocity = 5;
96        es.MaxAcceleration = 40;
97        es.MinAcceleration = 30;
98        es.IgnoreWind = false;
99        Add(es);
100
101        CollisionShapeParameters parameters = new CollisionShapeParameters();
102        parameters.DistanceGridSpacing = 1;
103        parameters.MaxVertexDistance = 1;
104
105
106        // Tästä voi muuttaa koko hahmon kokoa
107        PhysicsObject paa = new PhysicsObject(25, 30, Shape.Circle, parameters);
108        paa.CollisionIgnoreGroup = 1;
109        paa.Color = Color.Silver;
110        Add(paa);
111
112        paa.MaxVelocity = 400;
113
114
115        // Tästä voi vaihtaa koko hahmon vartalon kokoa
116        // paa.Width = ruumiinosien paksuus (suurempi luku = ohuempia)
117        // paa.Height = ruumiinosien pituus ( pienempi = lyhyempiä)
118        PhysicsObject vartalo = new PhysicsObject(paa.Width / 2.75, paa.Height * 2.25, Shape.Rectangle, parameters);
119        vartalo.Position = paa.Position + new Vector(0, -paa.Height / 2 - vartalo.Height / 2);
120        vartalo.Image = Image.FromGradient((int)vartalo.Width, (int)vartalo.Height, Color.Ivory, Color.Charcoal);
121        Add(vartalo);
122        AxleJoint vartaloLiitos = new AxleJoint(paa, vartalo, new Vector(vartalo.X, vartalo.Top));
123        vartaloLiitos.Softness = 0.05;
124        Add(vartaloLiitos);
125
126        AddCollisionHandler(paa, "piikki", delegate(PhysicsObject p, PhysicsObject piikki)
127        {
128            es.AddEffect(p.Position, 50);
129            vartaloLiitos.Destroy();
130            LopetaPeli();
131        });
132
133        // Kädet
134        PhysicsObject vasenKasi = new PhysicsObject(vartalo.Width, vartalo.Height / 1.4, Shape.Rectangle, parameters);
135        vasenKasi.Angle = vartalo.Angle + Angle.FromDegrees(-15);
136        vasenKasi.Top = vartalo.Top;
137        vasenKasi.Right = vartalo.Left;
138        vasenKasi.Image = Image.FromGradient((int)vartalo.Width, (int)vartalo.Height, Color.Ivory, Color.Charcoal);
139        Add(vasenKasi);
140        AxleJoint vasenKasiLiitos = new AxleJoint(vartalo, vasenKasi, new Vector(vartalo.Left, vartalo.Top));
141        vasenKasiLiitos.Softness = 0.6;
142        vasenKasi.CollisionIgnoreGroup = 2;
143        Add(vasenKasiLiitos);
144
145        AddCollisionHandler(vasenKasi, "piikki", delegate(PhysicsObject kasi, PhysicsObject piikki)
146        {
147            es.AddEffect(vasenKasiLiitos.AxlePoint, 50);
148            vasenKasiLiitos.Destroy();
149        });
150
151
152 
153
154
155
156
157        //PhysicsObject vasenKasiKammen = new PhysicsObject(vartalo.Width, vartalo.Height / 2, Shape.Rectangle, parameters);
158        //
159        //vasenKasiKammen.Top = vasenKasi.Bottom;
160        //vasenKasiKammen.Right = vasenKasi.Left;
161        //vasenKasiKammen.Image = Image.FromGradient((int)vartalo.Width, (int)vartalo.Height, Color.Charcoal, Color.Ivory);
162        //Add(vasenKasiKammen);
163        //AxleJoint vasenKasiKammenLiitos = new AxleJoint(vasenKasi, vasenKasiKammen, new Vector(vasenKasi.Top, vasenKasi.Bottom));
164        //vasenKasiKammenLiitos.Softness = 0.05;
165        //vasenKasiKammen.CollisionIgnoreGroup = 2;
166        //Add(vasenKasiKammenLiitos);
167        //
168        //AddCollisionHandler(vasenKasiKammen, "piikki", delegate(PhysicsObject kasi, PhysicsObject piikki)
169        //{
170        //    es.AddEffect(vasenKasiKammenLiitos.AxlePoint, 50);
171        //    vasenKasiKammenLiitos.Destroy();
172        //});
173
174
175
176
177
178
179
180        PhysicsObject oikeaKasi = new PhysicsObject(vartalo.Width, vartalo.Height / 1.4, Shape.Rectangle, parameters);
181        oikeaKasi.Angle = vartalo.Angle + Angle.FromDegrees(15);
182        oikeaKasi.Top = vartalo.Top;
183        oikeaKasi.Left = vartalo.Right;
184        oikeaKasi.Image = Image.FromGradient((int)vartalo.Width, (int)vartalo.Height, Color.Ivory, Color.Charcoal);
185        Add(oikeaKasi);
186        AxleJoint oikeaKasiLiitos = new AxleJoint(vartalo, oikeaKasi, new Vector(vartalo.Right, vartalo.Top));
187        oikeaKasiLiitos.Softness = 0.6;
188        oikeaKasi.CollisionIgnoreGroup = 2;
189        Add(oikeaKasiLiitos);
190
191        AddCollisionHandler(oikeaKasi, "piikki", delegate(PhysicsObject kasi, PhysicsObject piikki)
192        {
193            es.AddEffect(oikeaKasiLiitos.AxlePoint, 50);
194            oikeaKasiLiitos.Destroy();
195        });
196
197        // Jalat
198        PhysicsObject vasenJalka = new PhysicsObject(vartalo.Width, vartalo.Height / 1.1, Shape.Rectangle, parameters);
199        vasenJalka.Angle = vartalo.Angle + Angle.FromDegrees(-15);
200        vasenJalka.Top = vartalo.Bottom;
201        vasenJalka.Right = vartalo.Left;
202        vasenJalka.Image = Image.FromGradient((int)paa.Width, (int)paa.Height, Color.Charcoal, Color.Ivory);
203        Add(vasenJalka);
204        AxleJoint vasenJalkaLiitos = new AxleJoint(vartalo, vasenJalka, new Vector(vartalo.Left, vartalo.Bottom));
205        vasenJalkaLiitos.Softness = 0.5;
206        vasenJalka.CollisionIgnoreGroup = 1;
207        Add(vasenJalkaLiitos);
208
209        AddCollisionHandler(vasenJalka, "piikki", delegate(PhysicsObject jalka, PhysicsObject piikki)
210        {
211            es.AddEffect(vasenJalkaLiitos.AxlePoint, 50);
212            vasenJalkaLiitos.Destroy();
213        });
214
215        PhysicsObject oikeaJalka = new PhysicsObject(vartalo.Width, vartalo.Height / 1.1, Shape.Rectangle, parameters);
216        oikeaJalka.Angle = vartalo.Angle + Angle.FromDegrees(15);
217        oikeaJalka.Top = vartalo.Bottom; 
218        oikeaJalka.Left = vartalo.Right;
219        oikeaJalka.Image = Image.FromGradient((int)vartalo.Width, (int)vartalo.Height, Color.Charcoal, Color.Ivory);
220       
221        Add(oikeaJalka);
222        AxleJoint oikeaJalkaLiitos = new AxleJoint(vartalo, oikeaJalka, new Vector(vartalo.Right, vartalo.Bottom));
223        oikeaJalkaLiitos.Softness = 0.5;
224        oikeaJalka.CollisionIgnoreGroup = 1;
225        Add(oikeaJalkaLiitos);
226
227        AddCollisionHandler(oikeaJalka, "piikki", delegate(PhysicsObject jalka, PhysicsObject piikki)
228        {
229            es.AddEffect(oikeaJalkaLiitos.AxlePoint, 50);
230            oikeaJalkaLiitos.Destroy();
231        });
232
233        AddCollisionHandler(vartalo, "piikki", delegate(PhysicsObject v, PhysicsObject piikki)
234        {
235            es.AddEffect(v.Position, 300);
236            oikeaKasiLiitos.Destroy();
237            vasenKasiLiitos.Destroy();
238            //vasenKasiKammenLiitos.Destroy();
239            vasenJalkaLiitos.Destroy();
240            oikeaJalkaLiitos.Destroy();
241            vartaloLiitos.Destroy();
242            vasenJalka.Hit(RandomGen.NextVector(100, 500));
243            oikeaJalka.Hit(RandomGen.NextVector(100, 500));
244            oikeaKasi.Hit(RandomGen.NextVector(100, 500));
245            vasenKasi.Hit(RandomGen.NextVector(100, 500));
246            //vasenKasiKammen.Hit(RandomGen.NextVector(100, 500));
247            LopetaPeli();
248           
249        });
250
251        // Kissan popsiminen
252        AddCollisionHandler(paa, "Kisu", CollisionHandler.IncreaseObjectSize(-3, -3));
253        AddCollisionHandler(vartalo, "Kisu", CollisionHandler.IncreaseObjectSize(-3, -3));
254        AddCollisionHandler(vasenKasi, "Kisu", CollisionHandler.IncreaseObjectSize(-3, -3));
255        AddCollisionHandler(oikeaKasi, "Kisu", CollisionHandler.IncreaseObjectSize(-3, -3));
256        AddCollisionHandler(vasenJalka, "Kisu", CollisionHandler.IncreaseObjectSize(-3, -3));
257        AddCollisionHandler(oikeaJalka, "Kisu", CollisionHandler.IncreaseObjectSize(-3, -3));
258
259
260
261        //PhysicsObject Kisu = new PhysicsObject(100, 100);
262        //Kisu.Image = LoadImage("Kisu");
263        //Kisu.Tag = "Kisu";
264        //Add(Kisu);
265       
266        // Näppäimet
267        Keyboard.Listen(Key.Left, ButtonState.Down, Liikuta, "Liiku vasemmalle", paa, new Vector(-110, 0));
268        Keyboard.Listen(Key.Right, ButtonState.Down, Liikuta, "Liiku oikealle", paa, new Vector(110, 0));
269        Keyboard.Listen(Key.Up, ButtonState.Down, Liikuta, "Liiku ylös", paa, new Vector(0, 160));
270        Keyboard.Listen(Key.Down, ButtonState.Down, Liikuta, "Liiku alas", paa, new Vector(0, -50));
271
272        Keyboard.Listen(Key.A, ButtonState.Down, Liikuta, "Liiku vasemmalle", paa, new Vector(-110, 0));
273        Keyboard.Listen(Key.D, ButtonState.Down, Liikuta, "Liiku oikealle", paa, new Vector(110, 0));
274        Keyboard.Listen(Key.W, ButtonState.Down, Liikuta, "Liiku ylös", paa, new Vector(0, 160));
275        Keyboard.Listen(Key.S, ButtonState.Down, Liikuta, "Liiku alas", paa, new Vector(0, -50));
276
277
278        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
279        Keyboard.Listen(Key.F1, ButtonState.Pressed, ShowControlHelp, "Näytä ohjeet");
280        Keyboard.Listen(Key.R, ButtonState.Pressed, AloitaPeli, "Resetoi taso");
281        Keyboard.Listen(Key.K, ButtonState.Pressed, Kisu, null);
282
283
284        // "Supermies" moodi
285        //vasenJalka.Oscillate(Vector.UnitX, 2, 1);
286        //oikeaJalka.Oscillate(Vector.UnitX, 2, 1);
287        //vartalo.Oscillate(Vector.UnitX, 2, 1);
288        //Gravity = new Vector(0, -50);
289
290
291       
292    }
293
294    // Aikalaskuri
295    void LuoAikaLaskuri()
296    {
297        Timer aikaLaskuri = new Timer();
298        aikaLaskuri.Start();
299
300        Label aikaNaytto = new Label();
301        aikaNaytto.TextColor = Color.Silver;
302        aikaNaytto.Font = Font.DefaultLargeBold;
303        aikaNaytto.DecimalPlaces = 1;
304        aikaNaytto.BindTo(aikaLaskuri.SecondCounter);
305        Add(aikaNaytto);
306       
307    }
308
309    // Ajastetut "ilmoitukset"
310    void Ilmoitus1()
311    {
312        MessageDisplay.Add("Alku hyvin, kaikki hyvin?");
313    }
314
315    void Ilmoitus2()
316    {
317        MessageDisplay.Add("No problemos?");
318    }
319
320    void Ilmoitus3()
321    {
322        MessageDisplay.Add("No problemos!");
323    }
324
325    void Ilmoitus4()
326    {
327        MessageDisplay.Add("Whoa.");
328    }
329
330
331
332
333    // Piikkien luominen
334    void LuoPiikki1(double x, double y)
335    {
336        PhysicsObject Piikki1 = new PhysicsObject(20, 90);
337        Piikki1.Image = LoadImage("piikki1");
338        Piikki1.Position = new Vector(x, y);
339        Piikki1.Tag = "piikki";
340        Piikki1.IgnoresCollisionResponse = true;
341        AddCollisionHandler(Piikki1, CollisionHandler.DestroyObject);
342        Add(Piikki1);
343        // Laita ylläoleva rivi kommentiksi = piercing
344    }
345
346    void LuoPiikki2(double x, double y)
347    {
348        PhysicsObject Piikki2 = new PhysicsObject(20, 90);
349        Piikki2.Image = LoadImage("piikki2");
350        Piikki2.Position = new Vector(x, y);
351        Piikki2.Tag = "piikki";
352        Piikki2.IgnoresCollisionResponse = true;
353        AddCollisionHandler(Piikki2, CollisionHandler.DestroyObject);
354        Add(Piikki2);
355        // Laita ylläoleva rivi kommentiksi = piercing
356    }
357
358    void LuoPiikki3(double x, double y)
359    {
360        PhysicsObject Piikki3 = new PhysicsObject(20, 90);
361        Piikki3.Image = LoadImage("piikki1");
362        Piikki3.Position = new Vector(x, y);
363        Piikki3.Tag = "piikki";
364        Piikki3.IgnoresCollisionResponse = true;
365        AddCollisionHandler(Piikki3, CollisionHandler.DestroyObject);
366        Add(Piikki3);
367        // Laita ylläoleva rivi kommentiksi = piercing
368    }
369
370    void LuoPiikki4(double x, double y)
371    {
372        PhysicsObject Piikki4 = new PhysicsObject(20, 90);
373        Piikki4.Image = LoadImage("piikki2");
374        Piikki4.Position = new Vector(x, y);
375        Piikki4.Tag = "piikki";
376        Piikki4.IgnoresCollisionResponse = true;
377        AddCollisionHandler(Piikki4, CollisionHandler.DestroyObject);
378        Add(Piikki4);
379        // Laita ylläoleva rivi kommentiksi = piercing
380    }
381
382    void LuoPiikki5(double x, double y)
383    {
384        PhysicsObject Piikki5 = new PhysicsObject(35, 120);
385        Piikki5.Image = LoadImage("piikki3");
386        Piikki5.Position = new Vector(x, y);
387        Piikki5.Tag = "piikki";
388        Piikki5.IgnoresCollisionResponse = true;
389        //AddCollisionHandler(Piikki5, CollisionHandler.DestroyObject);
390        Add(Piikki5);
391        // Ez modi - poista ylläoleva kommentti "rivi" --> No piercing
392    }
393
394
395    // Piikkien spawnit
396    void Piikit1()
397    {
398        LuoPiikki1(RandomGen.NextDouble(Level.Left, Level.Right), 330);
399    }
400
401    void Piikit2()
402    {
403        LuoPiikki2(RandomGen.NextDouble(Level.Left, Level.Right), 330);
404        LuoPiikki2(RandomGen.NextDouble(Level.Left, Level.Right), 330);
405    }
406
407    void Piikit3()
408    {
409        LuoPiikki3(RandomGen.NextDouble(Level.Left, Level.Right), 330);
410        LuoPiikki3(RandomGen.NextDouble(Level.Left, Level.Right), 330);
411        LuoPiikki3(RandomGen.NextDouble(Level.Left, Level.Right), 330);
412    }
413
414    void Piikit4()
415    {
416        LuoPiikki4(RandomGen.NextDouble(Level.Left, Level.Right), 330);
417        LuoPiikki4(RandomGen.NextDouble(Level.Left, Level.Right), 330);
418        LuoPiikki4(RandomGen.NextDouble(Level.Left, Level.Right), 330);
419    }
420
421    void Piikit5()
422    {
423        LuoPiikki5(RandomGen.NextDouble(Level.Left, Level.Right), 330);
424        LuoPiikki5(RandomGen.NextDouble(Level.Left, Level.Right), 330);
425    }
426
427
428    // Piikkien ajastimet
429    void AjastinPiikit()
430    {
431        Timer ajastin1 = new Timer();
432        ajastin1.Interval = RandomGen.NextInt(1, 1);
433        ajastin1.Timeout += Piikit1;
434        ajastin1.Start();
435
436        Timer ajastin2 = new Timer();
437        ajastin2.Interval = RandomGen.NextInt(2, 5);
438        ajastin2.Timeout += Piikit2;
439        ajastin2.Start();
440
441        Timer ajastin3 = new Timer();
442        ajastin3.Interval = RandomGen.NextInt(1, 6);
443        ajastin3.Timeout += Piikit3;
444        ajastin3.Start();
445
446        Timer ajastin4 = new Timer();
447        ajastin4.Interval = RandomGen.NextInt(4, 9);
448        ajastin4.Timeout += Piikit4;
449        ajastin4.Start();
450
451        Timer ajastin5 = new Timer();
452        ajastin5.Interval = RandomGen.NextInt(6, 11);
453        ajastin5.Timeout += Piikit5;
454        ajastin5.Start();
455    }
456
457    // Kisu osio
458    void LuoKisu(double x, double y)
459    {
460        PhysicsObject LuoKisu = new PhysicsObject(40, 40);
461        LuoKisu.Image = LoadImage("Kisu");
462        LuoKisu.Position = new Vector(x, y);
463        LuoKisu.Tag = "Kisu";
464        //AddCollisionHandler(LuoKisu, CollisionHandler.ExplodeObject(200, true));
465        AddCollisionHandler(LuoKisu, CollisionHandler.DestroyObject);
466        LuoKisu.IgnoresCollisionResponse = true;
467        Add(LuoKisu);
468    }
469
470    void Kisu()
471    {
472        LuoKisu(RandomGen.NextDouble(Level.Left, Level.Right), 340);
473    }
474
475    void AjastinKisu()
476    {
477        Timer ajastinKisu = new Timer();
478        ajastinKisu.Interval = RandomGen.NextInt(30, 120);
479        ajastinKisu.Timeout += Kisu;
480        ajastinKisu.Start();
481    }
482
483
484    void Liikuta(PhysicsObject paa, Vector suunta)
485    {
486        paa.Hit(suunta);
487    }
488
489}
490
491// https://www.flickr.com/photos/islespunkfan/5390977532/in/photostream/
492// https://www.flickr.com/photos/waltstoneburner/2853100795/in/photostream/
493// https://www.flickr.com/photos/codex41/9728393404/in/photostream/
494// http://freeaussiestock.com/free/New_South_Wales/slides/wombeyan_caves.htm
495// https://www.flickr.com/photos/aa3sd/3163406773
496// https://www.flickr.com/photos/tydence/3711291971
497// https://commons.wikimedia.org/wiki/File:Dolls_Theater_in_Carlsbad_Cavern-120.JPG
Note: See TracBrowser for help on using the repository browser.