source: 2014/koodauskerho/38/PietuR/MagicalFlowerParty/MagicalFlowerParty/MagicalFlowerParty/MagicalFlowerParty.cs @ 7969

Revision 7969, 14.9 KB checked in by pimaeeru, 4 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
9class Pelaaja: PhysicsObject
10{
11    public bool stamina = true;
12
13    public bool osunut = false;
14   
15
16    public DoubleMeter kerroin { get;}
17
18    public ProgressBar aika { get; }
19    public DoubleMeter Loppuajastin;
20
21    public Pelaaja(double width, double height)
22        : base(width, height){
23        kerroin = new DoubleMeter(100, 0, 300);
24        Loppuajastin = new DoubleMeter(3, 0, 3);
25
26        aika = new ProgressBar(100, 10);
27        aika.BindTo(Loppuajastin);
28        aika.IsVisible = true;
29        Add(aika);
30        aika.Position -= new Vector(-15, height/2);
31        Loppuajastin.LowerLimit += delegate { this.Destroy(); };
32       
33
34    }
35}
36
37class Kilpi : PhysicsObject
38{
39    public DoubleMeter kestavyys { get; }
40
41    public Kilpi(double width, double height)
42        : base(width, height)
43    {
44        kestavyys = new DoubleMeter(3, 0, 3);
45    }
46}
47
48public class MagicalFlowerParty : PhysicsGame
49{
50    Image finnypic = LoadImage("Finny");
51    Image wibblypic = LoadImage("Wibbly");
52    Image puffypic = LoadImage("Puffy");
53    Image kookypic = LoadImage("Kooky");
54    Image arenapic = LoadImage("Arena");
55    Image bgpic = LoadImage("Background");
56    Image bgpic2 = LoadImage("Background2");
57
58    Image dandy = LoadImage("Dandelion");
59    Image leaf = LoadImage("leaf");
60    Image[] bumblebee = LoadImages("Bumblebee", "Bumblebee2", "Bumblebee3", "bumblebee2");
61    Image bumbly = LoadImage("bumblebee");
62
63
64    Image wall = LoadImage("Wall");
65    Image wall2 = LoadImage("Wall2");
66    Image wall3 = LoadImage("Wall3");
67    Image wallp = LoadImage("WallP");
68    Image wallp2 = LoadImage("WallP2");
69    Image wallp3 = LoadImage("WallP3");
70
71    SoundEffect bounce = LoadSoundEffect("Bounce");
72    SoundEffect glass = LoadSoundEffect("Glass");
73
74    Pelaaja pelaaja1;
75    Pelaaja pelaaja2;
76    Pelaaja pelaaja3;
77    Pelaaja pelaaja4;
78    GameObject tausta;
79    PhysicsObject este;
80
81    PhysicsObject arena;
82    public override void Begin()
83    {
84        Camera.ZoomFactor = 0.8;
85
86        //Level.Background.Image = bgpic;
87        tausta = new GameObject(Window.Width * 1.25, Window.Height * 1.25);
88        tausta.Image = bgpic;
89        Add(tausta, -3);
90
91         arena = new PhysicsObject(1244, 1244);
92        //arena.Shape = Shape.FromImage(arenapic);
93        arena.Shape = Shape.Circle;
94        arena.Color = Color.HotPink;
95        arena.Image = arenapic;
96        arena.Tag = "arena";
97        arena.IgnoresCollisionResponse = true;
98        Add(arena, -1);
99
100
101        Luokilpi(220, 530, wall, 67.5);
102        Luokilpi(530, 220, wall, 22.5);
103        Luokilpi(-220, 530, wall, 112.5);
104        Luokilpi(-530, 220, wall, 157.5);
105        Luokilpi(-220, -530, wall, 247.5);
106        Luokilpi(-530, -220, wall, 202.5);
107        Luokilpi(220, -530, wall, 292.5);
108        Luokilpi(530, -220, wall, 337.5);
109
110
111
112        pelaaja1 = new Pelaaja(60, 60);
113        pelaaja1.Position = new Vector(-100, 100);
114        pelaaja1.CanRotate = false;
115        pelaaja1.LinearDamping = 0.95;
116        pelaaja1.Image = finnypic;
117        pelaaja1.Shape = Shape.Circle;
118        pelaaja1.Tag = "pallero";
119        AddCollisionHandler(pelaaja1, "pallero", PelaajaOsuu);
120        AddCollisionHandler(pelaaja1, "shield", KilpeenOsuu);
121        AddCollisionHandler(pelaaja1, Osuma);
122        Add(pelaaja1);
123       
124
125
126        LuoKerroin(pelaaja1);
127
128        pelaaja2 = new Pelaaja(60, 60);
129        pelaaja2.Position = new Vector(100, 100);
130        pelaaja2.CanRotate = false;
131        pelaaja2.LinearDamping = 0.95;
132        pelaaja2.Image = wibblypic;
133        pelaaja2.Shape = Shape.Circle;
134        pelaaja2.Tag = "pallero";
135        AddCollisionHandler(pelaaja2, "pallero", PelaajaOsuu);
136        AddCollisionHandler(pelaaja2, "shield", KilpeenOsuu);
137        Add(pelaaja2);
138       
139        LuoKerroin(pelaaja2);
140
141        pelaaja3 = new Pelaaja(60, 60);
142        pelaaja3.Position = new Vector(-100, -100);
143        pelaaja3.CanRotate = false;
144        pelaaja3.LinearDamping = 0.95;
145        pelaaja3.Image = puffypic;
146        pelaaja3.Shape = Shape.Circle;
147        pelaaja3.Tag = "pallero";
148        AddCollisionHandler(pelaaja3, "pallero", PelaajaOsuu);
149        AddCollisionHandler(pelaaja3, "shield", KilpeenOsuu);
150        Add(pelaaja3);
151
152        LuoKerroin(pelaaja3);
153
154        pelaaja4 = new Pelaaja(60, 60);
155        pelaaja4.Position = new Vector(100, -100);
156        pelaaja4.CanRotate = false;
157        pelaaja4.LinearDamping = 0.95;
158        pelaaja4.Image = kookypic;
159        pelaaja4.Shape = Shape.Circle;
160        pelaaja4.Tag = "pallero";
161        AddCollisionHandler(pelaaja4, "pallero", PelaajaOsuu);
162        AddCollisionHandler(pelaaja4, "shield", KilpeenOsuu);
163        Add(pelaaja4);
164
165        LuoKerroin(pelaaja4);
166
167
168        Keyboard.Listen(Key.Left, ButtonState.Down,
169          MovePlayer, null, new Vector(-1000, 0), pelaaja1);
170        Keyboard.Listen(Key.Right, ButtonState.Down,
171          MovePlayer, null, new Vector(1000, 0), pelaaja1);
172        Keyboard.Listen(Key.Up, ButtonState.Down,
173          MovePlayer, null, new Vector(0, 1000), pelaaja1);
174        Keyboard.Listen(Key.Down, ButtonState.Down,
175          MovePlayer, null, new Vector(0, -1000), pelaaja1);
176        Keyboard.Listen(Key.RightControl, ButtonState.Pressed,
177          Dash, null, new Vector(0, -10000), pelaaja1);
178
179        Keyboard.Listen(Key.A, ButtonState.Down,
180          MovePlayer, null, new Vector(-1000, 0), pelaaja2);
181        Keyboard.Listen(Key.D, ButtonState.Down,
182          MovePlayer, null, new Vector(1000, 0), pelaaja2);
183        Keyboard.Listen(Key.W, ButtonState.Down,
184          MovePlayer, null, new Vector(0, 1000), pelaaja2);
185        Keyboard.Listen(Key.S, ButtonState.Down,
186          MovePlayer, null, new Vector(0, -1000), pelaaja2);
187        Keyboard.Listen(Key.LeftControl, ButtonState.Pressed,
188          Dash, null, new Vector(0, -10000), pelaaja2);
189
190        Keyboard.Listen(Key.NumPad4, ButtonState.Down,
191          MovePlayer, null, new Vector(-1000, 0), pelaaja3);
192        Keyboard.Listen(Key.NumPad6, ButtonState.Down,
193          MovePlayer, null, new Vector(1000, 0), pelaaja3);
194        Keyboard.Listen(Key.NumPad8, ButtonState.Down,
195          MovePlayer, null, new Vector(0, 1000), pelaaja3);
196        Keyboard.Listen(Key.NumPad5, ButtonState.Down,
197          MovePlayer, null, new Vector(0, -1000), pelaaja3);
198        Keyboard.Listen(Key.NumPad9, ButtonState.Pressed,
199          Dash, null, new Vector(0, -10000), pelaaja3);
200
201        Keyboard.Listen(Key.H, ButtonState.Down,
202          MovePlayer, null, new Vector(-1000, 0), pelaaja4);
203        Keyboard.Listen(Key.K, ButtonState.Down,
204          MovePlayer, null, new Vector(1000, 0), pelaaja4);
205        Keyboard.Listen(Key.U, ButtonState.Down,
206          MovePlayer, null, new Vector(0, 1000), pelaaja4);
207        Keyboard.Listen(Key.J, ButtonState.Down,
208          MovePlayer, null, new Vector(0, -1000), pelaaja4);
209        Keyboard.Listen(Key.Y, ButtonState.Pressed,
210          Dash, null, new Vector(0, -10000), pelaaja4);
211
212        Timer ajastin = new Timer();
213        ajastin.Interval = 1;
214        ajastin.Timeout += delegate { Luoeste(dandy, 766/2, 244/2, "dandy", 0); };
215        ajastin.Start();
216
217        Timer ajastin2 = new Timer();
218        ajastin2.Interval = 1;
219        ajastin2.Timeout += delegate { Luoeste(leaf, 500 / 2, 272 / 2, "leaf", 0); };
220        ajastin2.Start();
221       
222
223        Timer ajastin3 = new Timer();
224        ajastin3.Interval = 1;
225        ajastin3.Timeout += delegate {
226            Animation anim = new Animation(bumblebee);
227            anim.FPS = 16;
228            anim.Start();
229            Luoeste(bumbly, 75, 120, "bumblebee", 0, anim); };
230        ajastin3.Start();
231
232        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
233    }
234
235    protected override void Update(Time time)
236    {
237        Onkosisalla(pelaaja1, time);
238        Onkosisalla(pelaaja2, time);
239        Onkosisalla(pelaaja3, time);
240        Onkosisalla(pelaaja4, time);
241
242        base.Update(time);
243
244    }
245    void Onkosisalla(Pelaaja pelaaja, Time time)
246    {
247        if (!arena.IsInside(pelaaja.Position))
248        {
249            pelaaja.Loppuajastin.Value -= time.SinceLastUpdate.TotalSeconds;
250            pelaaja.aika.IsVisible = true;
251            //pelaaja1.kerroin.Value += time.SinceLastUpdate.TotalSeconds;
252            //Timer.SingleShot(3.0, delegate { pelaaja.Destroy(); });
253
254            /*Timer ajastin = new Timer();
255            ajastin.Interval = 3.0;
256            ajastin.Timeout += delegate { pelaaja.Destroy(); };
257            ajastin.Start();*/
258        }
259        else if (arena.IsInside(pelaaja.Position))
260        {
261            pelaaja.Loppuajastin.Value = 2;
262            pelaaja.aika.IsVisible = false;
263        }
264    }
265    void MovePlayer(Vector vector, PhysicsObject pelaaja)
266    {
267        pelaaja.Push(vector);
268    }
269    void Dash(Vector vector, Pelaaja pelaaja)
270    {
271        if (pelaaja.stamina == true && pelaaja.Velocity.Magnitude != 0)
272        {
273            pelaaja.Hit(pelaaja.Velocity.Normalize() * 500);
274
275            pelaaja.stamina = false;
276
277            Timer.SingleShot(3.0,delegate { pelaaja.stamina = true; });
278        }
279   
280    }
281    void Luokilpi(double X, double Y, Image kuva, double kulma)
282    {
283        Kilpi shield = new Kilpi(104, 343);
284        shield.Position = new Vector(X, Y);
285        shield.Image = kuva;
286        shield.Shape = Shape.FromImage(kuva);
287        shield.AbsoluteAngle = Angle.FromDegrees(kulma);
288        shield.MakeStatic();
289        shield.CollisionIgnoreGroup = 1;
290        shield.Tag = "shield";
291        Add(shield);
292    }
293
294    void KilpeenOsuu(PhysicsObject tormaaja, PhysicsObject kohde)
295    {
296       
297
298        Pelaaja pelaaja = tormaaja as Pelaaja;
299        Kilpi osuttu = kohde as Kilpi;
300
301        int luku = RandomGen.NextInt(1, 4);
302
303        if (luku == 3)
304        {
305            osuttu.kestavyys.Value -= 1;
306            glass.Play();
307        }
308        else
309        {
310            bounce.Play();
311        }
312
313
314
315        pelaaja.Hit(new Vector(1, 1) - pelaaja.Velocity.Normalize() * 1200);
316
317
318        if (osuttu.kestavyys.Value == 2)
319        {
320            osuttu.Image = wallp2;
321
322            Timer.SingleShot(0.15, delegate { osuttu.Image = wall2; });
323        }
324        else if (osuttu.kestavyys.Value == 1)
325        {
326            osuttu.Image = wallp3;
327
328            Timer.SingleShot(0.15, delegate { osuttu.Image = wall3; });
329        }
330        else if (osuttu.kestavyys.Value == 3)
331        {
332            osuttu.Image = wallp;
333
334            Timer.SingleShot(0.15, delegate { osuttu.Image = wall; });
335        }
336
337        osuttu.kestavyys.LowerLimit += delegate { osuttu.Destroy(); };
338    }
339    void PelaajaOsuu(PhysicsObject tormaaja, PhysicsObject kohde)
340    {
341
342        SoundEffect Hit = LoadSoundEffect("Bass");
343
344        Pelaaja pelaaja = tormaaja as Pelaaja;
345        Pelaaja osuttu = kohde as Pelaaja;
346        if (osuttu == null)
347        return;
348
349        if (pelaaja.Velocity.Magnitude > kohde.Velocity.Magnitude && !osuttu.osunut && !pelaaja.osunut)
350        {
351
352            Hit.Play();
353            double vahinko = (pelaaja.Velocity - kohde.Velocity).Magnitude / 80.0 * 2.0;
354            osuttu.osunut = true;
355            osuttu.kerroin.Value += vahinko;
356            osuttu.Hit(pelaaja.Velocity.Normalize() * (osuttu.kerroin.Value * osuttu.kerroin.Value * osuttu.kerroin.Value / 8000));
357            //osuttu.Hit(pelaaja.Velocity * osuttu.kerroin.Value / 100.0);
358            //osuttu.Hit(pelaaja.Velocity * osuttu.kerroin.Value / 80.0 + new Vector (osuttu.kerroin.Value / 80.0, osuttu.kerroin.Value / 80.0));
359            //osuttu.Hit((pelaaja.Velocity * osuttu.kerroin.Value / 100.0)*(pelaaja.Velocity * osuttu.kerroin.Value / 100.0));
360            pelaaja.Stop();
361
362            List<GameObject> lapsiLabelit = osuttu.Objects.FindAll(o => o is Label);
363            ((Label)lapsiLabelit[0]).TextColor = Color.Lerp(Color.White, Color.Red, (osuttu.kerroin.Value - 100) / 200.0);
364
365            Timer.SingleShot(0.05, () => osuttu.osunut = false);
366        }
367    }
368    void LuoKerroin(Pelaaja pelaaja)
369    {
370        Label kerroinarvo = new Label(pelaaja.kerroin);
371        kerroinarvo.Position = new Vector(0, 50);
372        kerroinarvo.TextColor = Color.White;
373        kerroinarvo.Color = new Color(0, 0, 0, 128);
374        pelaaja.Add(kerroinarvo);
375
376
377
378    }
379    void Luoeste(Image kuva, double X, double Y, string esteennimi, double nopeus, Animation anim = null)
380    {
381
382        PhysicsObject este = new PhysicsObject(X, Y);
383        este.Image = kuva;
384        este.Shape = Shape.FromImage(kuva);
385        este.CollisionIgnoreGroup = 1;
386        string[] tags = new string[2];
387        tags[0] = "obs";
388        tags[1] = esteennimi;
389        este.Tag = tags;
390
391        if (anim != null)
392        {
393            este.Animation = anim;
394        }
395
396
397        //este.AbsoluteAngle = Angle.FromDegrees();
398
399        Vector vektori1 = new Vector(RandomGen.NextDouble(tausta.Right, tausta.Right), RandomGen.NextDouble(tausta.Bottom, tausta.Top));
400        Vector vektori2 = new Vector(RandomGen.NextDouble(tausta.Left - 200, tausta.Left - 200), RandomGen.NextDouble(tausta.Bottom, tausta.Top));
401        Vector vektori3 = new Vector(RandomGen.NextDouble(tausta.Left, tausta.Right), RandomGen.NextDouble(tausta.Top, tausta.Top + 200));
402        Vector vektori4 = new Vector(RandomGen.NextDouble(tausta.Left, tausta.Right), RandomGen.NextDouble(tausta.Bottom, tausta.Bottom + 200));
403
404        int vektorinumero;
405        vektorinumero = RandomGen.NextInt(1, 5);
406
407        if (vektorinumero == 1)
408        {
409            este.Position = vektori1;
410            este.AbsoluteAngle = Angle.FromDegrees(180);
411            este.Hit(new Vector(-1000, 0));
412        }
413        else
414        {
415            if (vektorinumero == 2)
416            {
417                este.Position = vektori2;
418                este.AbsoluteAngle = Angle.FromDegrees(0);
419                este.Hit(new Vector(1000, 0));
420            }
421            else if (vektorinumero == 3)
422            {
423                este.Position = vektori3;
424                este.AbsoluteAngle = Angle.FromDegrees(270);
425                este.Hit(new Vector(0, -1000));
426            }
427            else
428            {
429                este.Position = vektori4;
430                este.AbsoluteAngle = Angle.FromDegrees(90);
431                este.Hit(new Vector(0, 1000));
432            }
433        }
434        Add(este);
435    }
436    void Osuma(PhysicsObject uhri, PhysicsObject obstaakkeli)
437    {
438        Pelaaja pelaaja = uhri as Pelaaja;
439        PhysicsObject este = obstaakkeli as PhysicsObject;
440
441        string[] tags = obstaakkeli.Tag as string[];
442        if (tags == null) return;
443
444        if (tags[1] == "dandy")
445        {
446            pelaaja.kerroin.Value += 25;
447            obstaakkeli.Destroy();
448
449        }
450    }
451
452}
Note: See TracBrowser for help on using the repository browser.