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

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