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

Revision 8174, 10.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;
12
13    private PhysicsObject[] percents = new PhysicsObject[4];
14
15    private ExplosionSystem noteEffect = new ExplosionSystem(LoadImage("note"), 250);
16    private ExplosionSystem coinEffect = new ExplosionSystem(LoadImage("coin"), 250);
17
18    private Label[] menuLabels = new Label[4];
19
20    private bool down = true, dead = true;
21
22    private float MOVEMENT_SPEED = 0, multiplier = 1000, difficulty = 1;
23    private List<Vector> points = new List<Vector>();
24    private Image redPercent, greenPercent;
25
26    private float yearsLeft = 100;
27    private Label labelYearsLeft;
28
29    public override void Begin()
30    {
31        Window.Fullscreen = true;
32        SmoothTextures = false;
33
34        Level.Background.Image = LoadImage("background");
35
36        Timer.SingleShot(0.5, Menu_First);
37
38        redPercent = LoadImage("percent");
39        greenPercent = LoadImage("percent_1");
40    }
41
42    private void Menu_First ()
43    {
44        ClearAll();
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("Aloita peli");
52        menuLabels[0].X = Screen.Left * 0.89;
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);
56        Add(menuLabels[0]);
57
58        menuLabels[1] = new Label("Lopeta Peli");
59        menuLabels[1].X = Screen.Left * 0.885;
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, Exit, null);
63        Add(menuLabels[1]);
64
65        menuLabels[2] = null;
66        menuLabels[3] = null;
67    }
68
69    private void Menu_Second ()
70    {
71        ClearAll();
72
73        Level.Background.Image = LoadImage("background");
74
75        Mouse.IsCursorVisible = true;
76        Mouse.ListenMovement(1.0, OnMenuMouseMove, null);
77
78        menuLabels[0] = new Label("Helppo");
79        menuLabels[0].X = Screen.Left * 0.91;
80        menuLabels[0].Y = Screen.Top * 0.92;
81        menuLabels[0].TextScale = new Vector(1.5, 1.5);
82        Mouse.ListenOn(menuLabels[0], MouseButton.Left, ButtonState.Pressed, Start, null, 1f);
83        Add(menuLabels[0]);
84
85        menuLabels[1] = new Label("Keskivaikea");
86        menuLabels[1].X = Screen.Left * 0.872;
87        menuLabels[1].Y = Screen.Top * 0.835;
88        menuLabels[1].TextScale = new Vector(1.5, 1.5);
89        Mouse.ListenOn(menuLabels[1], MouseButton.Left, ButtonState.Pressed, Start, null, 1.25f);
90        Add(menuLabels[1]);
91
92        menuLabels[2] = new Label("Vaikea");
93        menuLabels[2].X = Screen.Left * 0.91;
94        menuLabels[2].Y = Screen.Top * 0.75;
95        menuLabels[2].TextScale = new Vector(1.5, 1.5);
96        Mouse.ListenOn(menuLabels[2], MouseButton.Left, ButtonState.Pressed, Start, null, 1.5f);
97        Add(menuLabels[2]);
98
99        menuLabels[3] = new Label("Hullu");
100        menuLabels[3].X = Screen.Left * 0.92;
101        menuLabels[3].Y = Screen.Top * 0.665;
102        menuLabels[3].TextScale = new Vector(1.5, 1.5);
103        Mouse.ListenOn(menuLabels[3], MouseButton.Left, ButtonState.Pressed, Start, null, 2f);
104        Add(menuLabels[3]);
105
106        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Menu_First, null);
107    }
108
109    private void Start (float i)
110    {
111        ClearAll();
112
113        difficulty = i;
114
115        Level.Background.Color = Color.White;
116
117        SetListeners();
118
119        dead = false;
120
121        noteEffect.MinRotationSpeed = 20;
122        noteEffect.MaxRotationSpeed = 20;
123        coinEffect.MinRotationSpeed = 20;
124        coinEffect.MaxRotationSpeed = 20;
125
126        Add(noteEffect);
127        Add(coinEffect);
128
129        CreatePercent(0);
130        CreatePercent(1);
131        CreatePercent(2);
132        CreatePercent(3);
133
134        labelYearsLeft = new Label();
135        labelYearsLeft.X = -880;
136        labelYearsLeft.Y = 500;
137        Add(labelYearsLeft);
138
139        player = new PhysicsObject(50, 50, Shape.Triangle);
140        player.Image = LoadImage("arrow");
141        player.Angle = Angle.FromDegrees(325);
142        Add(player);
143
144        AddCollisionHandler(player, "Percent", Die);
145    }
146
147    private void SetListeners()
148    {
149        Mouse.Listen(MouseButton.Left, ButtonState.Down, MoveUp, null);
150        Mouse.Listen(MouseButton.Left, ButtonState.Up, MoveDown, null);
151        Keyboard.Listen(Key.R, ButtonState.Pressed, Start, null, difficulty);
152        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Exit, "");
153    }
154
155    protected override void Paint(Canvas canvas)
156    {
157        if (!down) { canvas.BrushColor = new Color(0, 255, 0, 255); } else { canvas.BrushColor = Color.Red; }
158
159        for (int i = 0; i < points.Count; i++)
160        {
161            if (i + 1 < points.Count)
162            {
163                if (points[i].X >= Level.Left * 2 && points[i + 1].X >= Level.Left * 2)
164                {
165                    canvas.DrawLine(points[i] - new Vector(0, 1), points[i + 1] - new Vector(0, 1));
166                    canvas.DrawLine(points[i] - new Vector(0, 2), points[i + 1] - new Vector(0, 2));
167                    canvas.DrawLine(points[i] - new Vector(0, 3), points[i + 1] - new Vector(0, 3));
168                    canvas.DrawLine(points[i] - new Vector(0, 4), points[i + 1] - new Vector(0, 4));
169                    canvas.DrawLine(points[i] - new Vector(0, 5), points[i + 1] - new Vector(0, 5));
170                    canvas.DrawLine(points[i], points[i + 1]);
171                    canvas.DrawLine(points[i] + new Vector(0, 1), points[i + 1] + new Vector(0, 1));
172                    canvas.DrawLine(points[i] + new Vector(0, 2), points[i + 1] + new Vector(0, 2));
173                    canvas.DrawLine(points[i] + new Vector(0, 3), points[i + 1] + new Vector(0, 3));
174                    canvas.DrawLine(points[i] + new Vector(0, 4), points[i + 1] + new Vector(0, 3));
175                    canvas.DrawLine(points[i] + new Vector(0, 5), points[i + 1] + new Vector(0, 3));
176                }
177                else
178                {
179                    points.RemoveAt(i);
180                    points.RemoveAt(i + 1);
181                }
182            }
183        }
184
185        base.Paint(canvas);
186    }
187
188    protected override void Update(Time time)
189    {
190        base.Update(time);
191
192        if (!dead)
193        {     
194            MOVEMENT_SPEED = multiplier * (float)time.SinceLastUpdate.TotalSeconds * difficulty;
195            multiplier += (float) time.SinceLastUpdate.TotalMilliseconds / 60;
196
197            if (down)
198            {
199                player.Y -= MOVEMENT_SPEED;
200                yearsLeft -= 0.1f;
201            }
202            else
203            {
204                player.Y += MOVEMENT_SPEED;
205                yearsLeft -= 0.01f;
206            }
207
208            labelYearsLeft.Text = (int) yearsLeft + " vuotta jäljellä ennen maailman konkurssia";
209
210            labelYearsLeft.Left = Screen.Left * 0.965;
211
212            for (int i = 0; i < 4; i++)
213            {
214                percents[i].X -= MOVEMENT_SPEED;
215
216                if (percents[i].X < Screen.Left * 1.2)
217                {
218                    RandomPercentPosition(percents[i], i);
219                    percents[i].Image = greenOrRed();
220                }
221            }
222
223            for (int i = 0; i < points.Count; i++) { points[i] -= new Vector(MOVEMENT_SPEED, 0); }
224        }
225   }
226
227   
228   private void RandomPercentPosition (PhysicsObject physicsObject, int index)
229   {
230        physicsObject.X = RandomGen.NextDouble(Level.Right * 2.5, Level.Right * 6.5);
231       
232        switch (index)
233        {
234            case 0:
235                physicsObject.Y = RandomGen.NextDouble(Level.Top  - physicsObject.Height / 2, Level.Top / 2 + physicsObject.Height / 2);
236                break;
237            case 1:
238                physicsObject.Y = RandomGen.NextDouble(Level.Top / 2 - physicsObject.Height / 2, physicsObject.Height / 2);
239                break;
240            case 2:
241                physicsObject.Y = RandomGen.NextDouble(-physicsObject.Height / 2, Level.Bottom / 2 + physicsObject.Height / 2);
242                break;
243            case 3:
244                physicsObject.Y = RandomGen.NextDouble(Level.Bottom / 2 - physicsObject.Height / 2, Level.Bottom + physicsObject.Height / 2);       
245                break;
246        }
247
248   }
249
250   private Image greenOrRed ()
251   {
252        double value = RandomGen.NextDouble(0, 1);
253
254        if (value < 0.5)
255        {
256            return redPercent;
257        }
258        else
259        {
260            return greenPercent;
261        }
262   }
263
264   private void Die (PhysicsObject a, PhysicsObject percent)
265   {
266        if (percent.Image.Equals(greenPercent))
267        {
268            yearsLeft += 5;
269        }
270        else
271        {
272            player.Destroy();
273            dead = true;
274            noteEffect.AddEffect(player.Position + new Vector(RandomGen.NextDouble(-100, 100), RandomGen.NextDouble(-100, 100)), 25);
275            coinEffect.AddEffect(player.Position + new Vector(RandomGen.NextDouble(-100, 100), RandomGen.NextDouble(-100, 100)), 25);
276        }
277   }
278
279   private void MoveUp()
280   {
281        if (dead) { return; }
282
283        points.Add(player.Position - new Vector(10, 0));
284        player.Angle = Angle.FromDegrees(45);
285        down = false;
286   }
287
288    private void MoveDown()
289    {
290        if (dead) { return; }
291
292        points.Add(player.Position - new Vector(10, 0));
293        player.Angle = Angle.FromDegrees(325);
294        down = true;
295    }
296
297    private PhysicsObject CreatePercent (int index)
298    {
299        PhysicsObject physicsObject = new PhysicsObject(100, 100);
300        physicsObject.Image = greenOrRed();
301        physicsObject.Tag = "Percent";
302        percents[index] = physicsObject;
303        RandomPercentPosition(physicsObject, index);
304        Add(physicsObject);
305        return physicsObject;
306    }
307
308    private void OnMenuMouseMove (AnalogState analogState)
309    {
310        foreach (Label label in menuLabels)
311        {
312            if (label != null)
313            {
314                if (Mouse.IsCursorOn(label))
315                {
316                    label.TextColor = Color.Red;
317                }
318                else
319                {
320                    label.TextColor = Color.Black;
321                }
322            }
323        }
324    }
325}
Note: See TracBrowser for help on using the repository browser.