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

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