source: 2016/30/JoonasL/Arrow/Arrow/Arrow/Arrow.cs @ 8245

Revision 8245, 19.9 KB checked in by jolehto, 4 years ago (diff)
Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4using Jypeli.Controls;
5using Jypeli.Effects;
6using Jypeli.Widgets;
7
8public class Arrow : PhysicsGame
9{
10    private PhysicsObject player_1, player_2, ball_1, ball_2;
11
12    private PhysicsObject[] obstacles = new PhysicsObject[4];
13
14    private ExplosionSystem orangeEffect = new ExplosionSystem(LoadImage("particle_1"), 250);
15    private ExplosionSystem redEffect = new ExplosionSystem(LoadImage("particle_2"), 250);
16
17    private SoundEffect explosionSound = LoadSoundEffect("explosion");
18
19    private Label[] menuLabels = new Label[4];
20
21    private bool down_1 = true, down_2 = true, dead_1 = true, dead_2 = true, singlePlayer = true, launched = false;
22
23    private float MOVEMENT_SPEED = 0, multiplier = 1000, difficulty = 1, seconds_1 = 0, seconds_2 = 0;
24    private List<Vector> points_1 = new List<Vector>(), points_2 = new List<Vector>();
25
26    private Label label_1 = new Label("0s"), label_2 = new Label("0s");
27
28    public override void Begin()
29    { 
30        Window.Fullscreen = true;
31
32        Level.Background.Image = LoadImage("background");
33
34        Timer.SingleShot(0.5, Menu_First);
35    }
36
37    private void Menu_First ()
38    {
39        ClearAll();
40
41        Level.Background.Color = Color.Black;
42
43        dead_1 = true;
44        dead_2 = true;
45
46        Level.Background.Image = LoadImage("background");
47
48        Mouse.IsCursorVisible = true;
49        Mouse.ListenMovement(1.0, OnMenuMouseMove, null);
50
51        menuLabels[0] = new Label("Yksinpeli");
52        menuLabels[0].X = Screen.Left * 0.9;
53        menuLabels[0].Y = Screen.Top * 0.93;
54        menuLabels[0].TextScale = new Vector(1.5, 1.5);
55        Mouse.ListenOn(menuLabels[0], MouseButton.Left, ButtonState.Pressed, Menu_Second, null, true);
56        Add(menuLabels[0]);
57
58        menuLabels[1] = new Label("Moninpeli");
59        menuLabels[1].X = Screen.Left * 0.895;
60        menuLabels[1].Y = Screen.Top * 0.845;
61        menuLabels[1].TextScale = new Vector(1.5, 1.5);
62        Mouse.ListenOn(menuLabels[1], MouseButton.Left, ButtonState.Pressed, Menu_Second, null, false);
63        Add(menuLabels[1]);
64 
65        menuLabels[2] = new Label("Näppäimet");
66        menuLabels[2].X = Screen.Left * 0.885;
67        menuLabels[2].Y = Screen.Top * 0.76;
68        menuLabels[2].TextScale = new Vector(1.5, 1.5);
69        Mouse.ListenOn(menuLabels[2], MouseButton.Left, ButtonState.Pressed, ShowControls, null);
70        Add(menuLabels[2]);
71
72        menuLabels[3] = new Label("Lopeta Peli");
73        menuLabels[3].X = Screen.Left * 0.885;
74        menuLabels[3].Y = Screen.Top * 0.675;
75        menuLabels[3].TextScale = new Vector(1.5, 1.5);
76        Mouse.ListenOn(menuLabels[3], MouseButton.Left, ButtonState.Pressed, Exit, null);
77        Add(menuLabels[3]);
78    }
79
80    private void Menu_Second (bool b)
81    {
82        ClearAll();
83
84        singlePlayer = b;
85
86        Level.Background.Color = Color.Black;
87
88        Level.Background.Image = LoadImage("background");
89
90        Mouse.IsCursorVisible = true;
91        Mouse.ListenMovement(1.0, OnMenuMouseMove, null);
92
93        menuLabels[0] = new Label("Helppo");
94        menuLabels[0].X = Screen.Left * 0.91;
95        menuLabels[0].Y = Screen.Top * 0.92;
96        menuLabels[0].TextScale = new Vector(1.5, 1.5);
97        Mouse.ListenOn(menuLabels[0], MouseButton.Left, ButtonState.Pressed, Start, null, 1f);
98        Add(menuLabels[0]);
99
100        menuLabels[1] = new Label("Keskivaikea");
101        menuLabels[1].X = Screen.Left * 0.872;
102        menuLabels[1].Y = Screen.Top * 0.835;
103        menuLabels[1].TextScale = new Vector(1.5, 1.5);
104        Mouse.ListenOn(menuLabels[1], MouseButton.Left, ButtonState.Pressed, Start, null, 1.25f);
105        Add(menuLabels[1]);
106
107        menuLabels[2] = new Label("Vaikea");
108        menuLabels[2].X = Screen.Left * 0.91;
109        menuLabels[2].Y = Screen.Top * 0.75;
110        menuLabels[2].TextScale = new Vector(1.5, 1.5);
111        Mouse.ListenOn(menuLabels[2], MouseButton.Left, ButtonState.Pressed, Start, null, 1.5f);
112        Add(menuLabels[2]);
113
114        menuLabels[3] = new Label("Hullu");
115        menuLabels[3].X = Screen.Left * 0.92;
116        menuLabels[3].Y = Screen.Top * 0.665;
117        menuLabels[3].TextScale = new Vector(1.5, 1.5);
118        Mouse.ListenOn(menuLabels[3], MouseButton.Left, ButtonState.Pressed, Start, null, 2f);
119        Add(menuLabels[3]);
120
121        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Menu_First, null);
122    }
123
124    private void ShowControls ()
125    {
126        ClearAll();
127
128        Level.Background.Color = Color.Black;
129
130        Level.Background.Image = LoadImage("background");
131
132        Mouse.IsCursorVisible = true;
133
134        Label label = new Label("R - Aloita peli alusta \n\nVasen hiiren painike - Nosta punaista pelaajaa \n\nVälilyönti - Nosta sinistä pelaajaa \n\nEscape - Peruuta");
135        label.X = Screen.Left * 0.73;
136        label.Y = Screen.Top * 0.8;
137        Add(label);
138
139        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Menu_First, null);
140    }
141
142    private void Start (float i)
143    {
144        ClearAll();
145
146        Mouse.IsCursorVisible = false;
147
148        points_1 = new List<Vector>();
149        points_2 = new List<Vector>();
150        points_1.Add(new Vector(Screen.Left * 1.5, 0));
151        points_2.Add(new Vector(Screen.Left * 1.5, 0));
152
153        ball_1 = new PhysicsObject(50, 50, Shape.Circle);
154        ball_1.X = Screen.Left * 1.5;
155        ball_1.Tag = "Obstacle";
156        ball_1.Width *= 5;
157        ball_1.Height *= 5;
158        ball_1.Color = Color.Black;
159        ball_1.IsVisible = false;
160
161        Add(ball_1);
162
163        difficulty = i;
164
165        Level.Background.Color = Color.White;
166
167        SetListeners();
168
169        dead_1 = false;
170
171        if (!singlePlayer) dead_2 = false;
172
173        orangeEffect.MinVelocity = 1000;
174        orangeEffect.MaxVelocity = 1000;
175        orangeEffect.MinScale = 10;
176        orangeEffect.MaxScale = 10;
177        redEffect.MinVelocity = 1000;
178        redEffect.MaxVelocity = 1000;
179        redEffect.MinScale = 10;
180        redEffect.MaxScale = 10;
181
182        Add(orangeEffect);
183        Add(redEffect);
184
185        label_1.Y = Screen.Top - label_1.Width * 2;
186        label_1.TextScale = new Vector(1.25, 1.25);
187        label_1.TextColor = Color.Red;
188
189        seconds_1 = 0;
190        seconds_2 = 0;
191
192        Add(label_1);
193
194        CreatePercent(0);
195        CreatePercent(1);
196        CreatePercent(2);
197        CreatePercent(3);
198
199        player_1 = new PhysicsObject(50, 50, Shape.Triangle);
200        player_1.Color = Color.Black;
201        player_1.Angle = Angle.FromDegrees(225);
202        Add(player_1);
203
204        if (!singlePlayer)
205        {
206            ball_2 = new PhysicsObject(50, 50, Shape.Circle);
207            ball_2.X = Screen.Left * 1.5;
208            ball_2.Tag = "Obstacle";
209            ball_2.Width *= 2.5;
210            ball_2.Height *= 2.5;
211            ball_2.Color = Color.Black;
212            ball_2.IsVisible = false;
213
214            Add(ball_2);
215
216            ball_1.Width = ball_2.Width;
217            ball_1.Height = ball_2.Height;
218
219            label_2.Y = Screen.Top - label_1.Width * 2 - label_1.Height * 2;
220            label_2.TextScale = new Vector(1.25, 1.25);
221            label_2.TextColor = Color.Blue;
222            Add(label_2);
223
224            player_2 = new PhysicsObject(50, 50, Shape.Triangle);
225            player_2.Color = Color.Black;
226            player_2.Angle = Angle.FromDegrees(225);
227            Add(player_2);
228
229            AddCollisionHandler(player_2, "Obstacle", Die_2);
230        }
231
232        AddCollisionHandler(player_1, "Obstacle", Die_1);
233    }
234
235    private void SetListeners()
236    {
237        Mouse.Listen(MouseButton.Left, ButtonState.Down, MoveUp_1, null);
238        Mouse.Listen(MouseButton.Left, ButtonState.Up, MoveDown_1, null);
239
240        Keyboard.Listen(Key.R, ButtonState.Pressed, Restart, null);
241
242        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Menu_First, null);
243
244        if (!singlePlayer)
245        {
246            Keyboard.Listen(Key.Space, ButtonState.Down, MoveUp_2, null);
247            Keyboard.Listen(Key.Space, ButtonState.Up, MoveDown_2, null);
248        }
249    }
250
251    private void Restart ()
252    {
253        player_1.IsVisible = true;
254        player_1.Y = 0;
255
256        points_1 = new List<Vector>();
257        points_1.Add(new Vector(Screen.Left * 1.5, 0));
258
259        dead_1 = false;
260
261        ball_1.X = Screen.Left * 1.5;
262
263        if (!singlePlayer)
264        {
265            player_2.IsVisible = true;
266            player_2.Y = 0;
267
268            points_2 = new List<Vector>();
269            points_2.Add(new Vector(Screen.Left * 1.5, 0));
270
271            dead_2 = false;
272
273            ball_2.X = Screen.Left * 1.5;
274        }
275
276        multiplier = 1000;
277
278        RandomPercentPosition(obstacles[0], 0);
279        RandomPercentPosition(obstacles[1], 1);
280        RandomPercentPosition(obstacles[2], 2);
281        RandomPercentPosition(obstacles[3], 3);
282
283        seconds_1 = 0;
284        seconds_2 = 0;
285    }
286
287    protected override void Paint(Canvas canvas)
288    {
289        if (Level.Background.Color == Color.Black) return;
290
291        canvas.BrushColor = new Color(255, 0, 0, 255);
292       
293        for (int i = 0; i < points_1.Count; i++)
294        {
295            if (i + 1 < points_1.Count)
296            {
297                if (points_1[i].X >= Screen.Left * 1.5 || points_1[i + 1].X >= Screen.Left * 1.5)
298                {
299                    canvas.DrawLine(points_1[i] - new Vector(0, 1), points_1[i + 1] - new Vector(0, 1));
300                    canvas.DrawLine(points_1[i] - new Vector(0, 2), points_1[i + 1] - new Vector(0, 2));
301                    canvas.DrawLine(points_1[i] - new Vector(0, 3), points_1[i + 1] - new Vector(0, 3));
302                    canvas.DrawLine(points_1[i] - new Vector(0, 4), points_1[i + 1] - new Vector(0, 4));
303                    canvas.DrawLine(points_1[i] - new Vector(0, 5), points_1[i + 1] - new Vector(0, 5));
304                    canvas.DrawLine(points_1[i], points_1[i + 1]);
305                    canvas.DrawLine(points_1[i] + new Vector(0, 1), points_1[i + 1] + new Vector(0, 1));
306                    canvas.DrawLine(points_1[i] + new Vector(0, 2), points_1[i + 1] + new Vector(0, 2));
307                    canvas.DrawLine(points_1[i] + new Vector(0, 3), points_1[i + 1] + new Vector(0, 3));
308                    canvas.DrawLine(points_1[i] + new Vector(0, 4), points_1[i + 1] + new Vector(0, 3));
309                    canvas.DrawLine(points_1[i] + new Vector(0, 5), points_1[i + 1] + new Vector(0, 3));
310                }
311                else
312                {
313                    try
314                    {
315                        points_1.RemoveAt(i);
316                        points_1.RemoveAt(i + 1);
317                    }
318                    catch (Exception)
319                    {}
320                }
321            }
322        }
323
324        if (!singlePlayer)
325        {
326            canvas.BrushColor = new Color(0, 0, 255, 255);
327
328            for (int i = 0; i < points_2.Count; i++)
329            {
330                if (i + 1 < points_2.Count)
331                {
332                    if (points_2[i].X >= Screen.Left * 1.5 || points_2[i + 1].X >= Screen.Left * 1.5)
333                    {
334                        canvas.DrawLine(points_2[i] - new Vector(0, 1), points_2[i + 1] - new Vector(0, 1));
335                        canvas.DrawLine(points_2[i] - new Vector(0, 2), points_2[i + 1] - new Vector(0, 2));
336                        canvas.DrawLine(points_2[i] - new Vector(0, 3), points_2[i + 1] - new Vector(0, 3));
337                        canvas.DrawLine(points_2[i] - new Vector(0, 4), points_2[i + 1] - new Vector(0, 4));
338                        canvas.DrawLine(points_2[i] - new Vector(0, 5), points_2[i + 1] - new Vector(0, 5));
339                        canvas.DrawLine(points_2[i], points_2[i + 1]);
340                        canvas.DrawLine(points_2[i] + new Vector(0, 1), points_2[i + 1] + new Vector(0, 1));
341                        canvas.DrawLine(points_2[i] + new Vector(0, 2), points_2[i + 1] + new Vector(0, 2));
342                        canvas.DrawLine(points_2[i] + new Vector(0, 3), points_2[i + 1] + new Vector(0, 3));
343                        canvas.DrawLine(points_2[i] + new Vector(0, 4), points_2[i + 1] + new Vector(0, 3));
344                        canvas.DrawLine(points_2[i] + new Vector(0, 5), points_2[i + 1] + new Vector(0, 3));
345                    }
346                    else
347                    {
348                        try
349                        {
350                            points_2.RemoveAt(i);
351                            points_2.RemoveAt(i + 1);
352                        }
353                        catch (Exception)
354                        {}
355                    }
356                }
357            }
358        }
359
360        base.Paint(canvas);
361    }
362
363    protected override void Update(Time time)
364    {
365        base.Update(time);
366
367        if (!dead_1)
368        {
369            seconds_1 += (float)time.SinceLastUpdate.TotalSeconds;
370            label_1.Text = (int) seconds_1 + "s";
371
372            if (down_1)
373            {
374                player_1.Y -= MOVEMENT_SPEED;
375            }
376            else
377            {
378                player_1.Y += MOVEMENT_SPEED;
379            }
380
381            if (player_1.Y <= Screen.Bottom)
382            {
383                Die_1(null, null);
384            }
385            else if (player_1.Y >= Screen.Top)
386            {
387                Die_1(null, null);
388            }
389        }
390
391        if (!singlePlayer && !dead_2)
392        {
393            seconds_2 += (float)time.SinceLastUpdate.TotalSeconds;
394            label_2.Text = (int) seconds_2 + "s";
395
396            if (down_2)
397            {
398                player_2.Y -= MOVEMENT_SPEED;
399            }
400            else
401            {
402                player_2.Y += MOVEMENT_SPEED;
403            }
404
405            if (player_2.Y <= Screen.Bottom)
406            {
407                Die_2 (null, null);
408            }
409            else if (player_2.Y >= Screen.Top)
410            {
411                Die_2(null, null);
412            }
413        }
414
415        if (!dead_1 || !dead_2)
416        {
417            MOVEMENT_SPEED = multiplier * (float)time.SinceLastUpdate.TotalSeconds * difficulty;
418            multiplier += (float)time.SinceLastUpdate.TotalMilliseconds / 60;
419
420            for (int i = 0; i < 4; i++)
421            {
422                obstacles[i].X -= MOVEMENT_SPEED;
423
424                if (obstacles[i].X < Screen.Left * 1.2)
425                {
426                    RandomPercentPosition(obstacles[i], i);
427                    obstacles[i].Color = new Color(RandomGen.NextInt(0, 225), RandomGen.NextInt(0, 225), RandomGen.NextInt(0, 225));
428                }
429            }
430
431            for (int i = 0; i < points_1.Count; i++) { points_1[i] -= new Vector(MOVEMENT_SPEED, 0); }
432
433            if (!singlePlayer)
434            {
435                for (int i = 0; i < points_2.Count; i++) { points_2[i] -= new Vector(MOVEMENT_SPEED, 0); }
436            }
437
438            double value = RandomGen.NextInt(0, 500);
439
440            if (!launched)
441            {
442                if (value == 250)
443                {
444                    launched = true;
445
446                    ball_1.X = Screen.Left * 1.5;
447                    ball_1.Y = player_1.Y;
448                    ball_1.IsVisible = true;
449
450                    if (!singlePlayer)
451                    {
452                        ball_2.X = Screen.Left * 1.5;
453                        ball_2.Y = player_2.Y;
454                        ball_2.IsVisible = true;
455                    }
456                }
457            }
458            else
459            {
460                if (!singlePlayer)
461                {
462                    ball_1.X += 1500 * difficulty * time.SinceLastUpdate.TotalSeconds;
463
464                    ball_2.X += 1500 * difficulty * time.SinceLastUpdate.TotalSeconds;
465
466                    if (ball_1.X >= Screen.Right * 1.5 && ball_2.X >= Screen.Right * 1.5)
467                    {
468                        launched = false;
469                        ball_1.IsVisible = false;
470                        ball_2.IsVisible = false;
471                    }
472                }
473                else if (!dead_1)
474                {
475                    ball_1.X += 1500 * difficulty * time.SinceLastUpdate.TotalSeconds;
476
477                    if (ball_1.X >= Screen.Right * 1.5)
478                    {
479                        launched = false;
480                        ball_1.IsVisible = false;
481                    }
482                }
483            }
484        }
485    }
486
487    private void RandomPercentPosition (PhysicsObject physicsObject, int index)
488    {
489        physicsObject.X = RandomGen.NextDouble(Level.Right * 2.5, Level.Right * 6.5);
490       
491        switch (index)
492        {
493            case 0:
494                physicsObject.Y = RandomGen.NextDouble(Level.Top  - physicsObject.Height / 2, Level.Top / 2 + physicsObject.Height / 2);
495                break;
496            case 1:
497                physicsObject.Y = RandomGen.NextDouble(Level.Top / 2 - physicsObject.Height / 2, physicsObject.Height / 2);
498                break;
499            case 2:
500                physicsObject.Y = RandomGen.NextDouble(-physicsObject.Height / 2, Level.Bottom / 2 + physicsObject.Height / 2);
501                break;
502            case 3:
503                physicsObject.Y = RandomGen.NextDouble(Level.Bottom / 2 - physicsObject.Height / 2, Level.Bottom + physicsObject.Height / 2);       
504                break;
505        }
506    }
507
508    private void Die_1 (PhysicsObject a, PhysicsObject percent)
509    {
510        if (dead_1) { return; }
511
512        explosionSound.Play();
513
514        player_1.IsVisible = false;
515        dead_1 = true;
516        orangeEffect.AddEffect(player_1.Position + new Vector(RandomGen.NextDouble(-100, 100), RandomGen.NextDouble(-100, 100)), 25);
517        redEffect.AddEffect(player_1.Position + new Vector(RandomGen.NextDouble(-100, 100), RandomGen.NextDouble(-100, 100)), 25);
518    }
519
520    private void Die_2(PhysicsObject a, PhysicsObject percent)
521    {
522        if (dead_2) { return; }
523
524        explosionSound.Play();
525
526        player_2.IsVisible = false;
527        dead_2 = true;
528        orangeEffect.AddEffect(player_2.Position + new Vector(RandomGen.NextDouble(-100, 100), RandomGen.NextDouble(-100, 100)), 25);
529        redEffect.AddEffect(player_2.Position + new Vector(RandomGen.NextDouble(-100, 100), RandomGen.NextDouble(-100, 100)), 25);
530    }
531
532    private void MoveUp_1()
533    {
534        if (dead_1) { return; }
535
536        points_1.Add(player_1.Position - new Vector(5, 0));
537        player_1.Angle = Angle.FromDegrees(315);
538        down_1 = false;
539    }
540
541    private void MoveDown_1()
542    {
543        if (dead_1) { return; }
544
545        points_1.Add(player_1.Position - new Vector(5, 0));
546        player_1.Angle = Angle.FromDegrees(225);
547        down_1 = true;
548    }
549
550    private void MoveUp_2()
551    {
552        if (dead_2) { return; }
553
554        points_2.Add(player_2.Position - new Vector(5, 0));
555        player_2.Angle = Angle.FromDegrees(315);
556        down_2 = false;
557    }
558
559    private void MoveDown_2()
560    {
561        if (dead_2) { return; }
562
563        points_2.Add(player_2.Position - new Vector(5, 0));
564        player_2.Angle = Angle.FromDegrees(225);
565        down_2 = true;
566    }
567
568    private PhysicsObject CreatePercent (int index)
569    {
570        PhysicsObject physicsObject = new PhysicsObject(100, 100);
571        physicsObject.Color = new Color(RandomGen.NextInt(0, 225), RandomGen.NextInt(0, 225), RandomGen.NextInt(0, 225));
572        physicsObject.Tag = "Obstacle";
573        obstacles[index] = physicsObject;
574        RandomPercentPosition(physicsObject, index);
575        Add(physicsObject);
576        return physicsObject;
577    }
578
579    private void OnMenuMouseMove (AnalogState analogState)
580    {
581        foreach (Label label in menuLabels)
582        {
583            if (label != null)
584            {
585                if (Mouse.IsCursorOn(label)) { label.TextColor = Color.Red; }
586                else { label.TextColor = Color.Black;}
587            }
588        }
589    }
590}
Note: See TracBrowser for help on using the repository browser.