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

Revision 8122, 6.7 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, first, second, third, fourth;
12    private ExplosionSystem explosionSystem = new ExplosionSystem (LoadImage ("particle"), 1000);
13    private bool down = true, dead = false;
14    private float MOVEMENT_SPEED = 0, multiplier = 1000;
15    private List<Vector> points = new List<Vector>();
16    private Image redPercent, greenPercent;
17
18    public override void Begin()
19    {
20        Window.Fullscreen = true;
21        redPercent = LoadImage("percent");
22        greenPercent = LoadImage("percent_1");
23        Level.Background.Color = Color.Black;
24        SetListeners();
25
26        first = new PhysicsObject(100, 100);
27       
28        first.Image = greenOrRed();
29        first.Tag = "Percent";
30        second = new PhysicsObject(100, 100);
31        second.Image = greenOrRed();
32        second.Tag = "Percent";
33        third = new PhysicsObject(100, 100);
34        third.Image = greenOrRed();
35        third.Tag = "Percent";
36        fourth = new PhysicsObject(100, 100);
37        fourth.Image = greenOrRed();
38        fourth.Tag = "Percent";
39
40        Add(first);
41        Add(second);
42        Add(third);
43        Add(fourth);
44        Add(explosionSystem);
45
46        RandomPercentPosition(first, 0);
47        RandomPercentPosition(second, 1);
48        RandomPercentPosition(third, 2);
49        RandomPercentPosition(fourth, 3);
50
51        player = new PhysicsObject(50, 50, Shape.Triangle);
52        player.Angle = Angle.FromDegrees(225);
53        player.Restitution = 10;
54        Add(player);
55
56        AddCollisionHandler(player, "Percent", Die);
57    }
58
59    private void SetListeners()
60    {
61        Keyboard.Listen(Key.Space, ButtonState.Down, MoveUp, "");
62        Keyboard.Listen(Key.Space, ButtonState.Up, MoveDown, "");
63        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Exit, "");
64    }
65
66    protected override void Paint(Canvas canvas)
67    {
68        if (!down)
69        {
70            canvas.BrushColor = new Color(0, 255, 0, 255);
71        }
72        else
73        {
74            canvas.BrushColor = Color.Red;
75        }
76
77        double x = canvas.Left + 100;
78        double y = canvas.Top - 100;
79
80        for (int i = 0; i < points.Count; i++)
81        {
82            if (i + 1 < points.Count)
83            {
84                if (points[i].X >= Level.Left * 2 && points[i + 1].X >= Level.Left * 2)
85                {
86                    canvas.DrawLine(points[i] - new Vector(0, 1), points[i + 1] - new Vector(0, 1));
87                    canvas.DrawLine(points[i] - new Vector(0, 2), points[i + 1] - new Vector(0, 2));
88                    canvas.DrawLine(points[i] - new Vector(0, 3), points[i + 1] - new Vector(0, 3));
89                    canvas.DrawLine(points[i] - new Vector(0, 4), points[i + 1] - new Vector(0, 4));
90                    canvas.DrawLine(points[i] - new Vector(0, 5), points[i + 1] - new Vector(0, 5));
91                    canvas.DrawLine(points[i], points[i + 1]);
92                    canvas.DrawLine(points[i] + new Vector(0, 1), points[i + 1] + new Vector(0, 1));
93                    canvas.DrawLine(points[i] + new Vector(0, 2), points[i + 1] + new Vector(0, 2));
94                    canvas.DrawLine(points[i] + new Vector(0, 3), points[i + 1] + new Vector(0, 3));
95                    canvas.DrawLine(points[i] + new Vector(0, 4), points[i + 1] + new Vector(0, 3));
96                    canvas.DrawLine(points[i] + new Vector(0, 5), points[i + 1] + new Vector(0, 3));
97                }
98                else
99                {
100                    points.RemoveAt(i);
101                    points.RemoveAt(i + 1);
102                }
103            }
104        }
105
106        base.Paint(canvas);
107    }
108
109    protected override void Update(Time time)
110    {
111        base.Update(time);
112
113        if (!dead)
114        {
115            MOVEMENT_SPEED = multiplier * (float)time.SinceLastUpdate.TotalSeconds;
116            multiplier += (float) time.SinceLastUpdate.TotalMilliseconds / 60;
117
118            if (down)
119            {
120                player.Y -= MOVEMENT_SPEED;
121            }
122            else
123            {
124                player.Y += MOVEMENT_SPEED;
125            }
126           
127            first.X -= MOVEMENT_SPEED;
128            second.X -= MOVEMENT_SPEED;
129            third.X -= MOVEMENT_SPEED;
130            fourth.X -= MOVEMENT_SPEED;
131
132            if (first.X < Level.Left * 2) { RandomPercentPosition(first, 0); }
133
134            if (second.X < Level.Left * 2) { RandomPercentPosition(second, 1); }
135
136            if (third.X < Level.Left * 2) { RandomPercentPosition(third, 2); }
137
138            if (fourth.X < Level.Left * 2) { RandomPercentPosition(fourth, 3); }
139
140            for (int i = 0; i < points.Count; i++) { points[i] -= new Vector(MOVEMENT_SPEED, 0); }
141
142
143        }
144   }
145
146   
147   private void RandomPercentPosition (PhysicsObject physicsObject, int index)
148   {
149        physicsObject.X = RandomGen.NextDouble(Level.Right * 2.5, Level.Right * 6.5);
150       
151        switch (index)
152        {
153            case 0:
154                physicsObject.Y = RandomGen.NextDouble(Level.Top  - physicsObject.Height / 2, Level.Top / 2 + physicsObject.Height / 2);
155                break;
156            case 1:
157                physicsObject.Y = RandomGen.NextDouble(Level.Top / 2 - physicsObject.Height / 2, physicsObject.Height / 2);
158                break;
159            case 2:
160                physicsObject.Y = RandomGen.NextDouble(-physicsObject.Height / 2, Level.Bottom / 2 + physicsObject.Height / 2);
161                break;
162            case 3:
163                physicsObject.Y = RandomGen.NextDouble(Level.Bottom / 2 - physicsObject.Height / 2, Level.Bottom + physicsObject.Height / 2);       
164                break;
165        }
166
167   }
168
169   private Image greenOrRed ()
170   {
171        double value = RandomGen.NextDouble(0, 1);
172
173        if (value < 0.9)
174        {
175            return redPercent;
176        }
177        else
178        {
179            return greenPercent;
180        }
181   }
182
183   private void Die (PhysicsObject a, PhysicsObject b)
184   {
185        player.Destroy();
186        dead = true;
187        explosionSystem.AddEffect(player.Position, 1000);
188   }
189
190   private void MoveUp()
191   {
192        if (dead) { return; }
193
194        points.Add(player.Position - new Vector(10, 0));
195        player.Angle = Angle.FromDegrees(315);
196        down = false;
197   }
198
199    private void MoveDown()
200    {
201        if (dead) { return; }
202
203        points.Add(player.Position - new Vector(10, 0));
204        player.Angle = Angle.FromDegrees(225);
205        down = true;
206    }
207}
Note: See TracBrowser for help on using the repository browser.