]> git.r.bdr.sh - rbdr/super-polarity/blob - Super Polarity/Actors/MainShip.cs
616f16e507779277b65fe0a0114a03b98e731368
[rbdr/super-polarity] / Super Polarity / Actors / MainShip.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading;
6 using Microsoft.Xna.Framework;
7 using Microsoft.Xna.Framework.Content;
8 using Microsoft.Xna.Framework.Graphics;
9
10 namespace SuperPolarity
11 {
12 class MainShip : Ship
13 {
14
15 public static Color BlueColor;
16 public static Color RedColor;
17
18 ParticleEngine particleEngine;
19
20 protected bool Shooting;
21 protected int ShotCooldown;
22
23 protected float CurrentImmortalTime;
24 protected float MaxImmortalTime;
25 protected bool Flashing;
26
27 public MainShip(SuperPolarity newGame) : base(newGame) {}
28
29 ~MainShip()
30 {
31 particleEngine = null;
32 }
33
34 public override void Initialize(Texture2D texture, Vector2 position)
35 {
36 base.Initialize(texture, position);
37
38 MainShip.BlueColor = new Color(230, 244, 249);
39 MainShip.RedColor = new Color(255, 234, 241);
40
41 InitParticleEngine();
42 SetPolarity(Polarity.Positive);
43
44 ShotCooldown = 50;
45 MaxImmortalTime = 1500;
46
47 BoxDimensions.X = 2;
48 BoxDimensions.Y = 2;
49 BoxDimensions.W = 2;
50 BoxDimensions.Z = 2;
51 InitBox();
52
53 BindInput();
54 }
55
56 void InitParticleEngine()
57 {
58 particleEngine = ParticleEffectFactory.CreatePolarCircle(Position);
59 }
60
61 void BindInput()
62 {
63 InputController.Bind("moveX", HandleHorizontalMovement);
64 InputController.Bind("moveY", HandleVerticalMovement);
65 InputController.Bind("changePolarity", HandleChangePolarity);
66 InputController.Bind("shoot", HandleShot);
67 }
68
69 protected void HandleShot(float value)
70 {
71 var bullet = ActorFactory.CreateBullet(Position, Angle);
72
73 Children.Add(bullet);
74 bullet.Parent = this;
75
76 Shooting = true;
77 Timer t = new Timer(new TimerCallback(UnlockShot));
78 t.Change(ShotCooldown, Timeout.Infinite);
79 }
80
81 protected void UnlockShot(object state)
82 {
83 InputController.Unlock("shoot");
84 }
85
86 protected void HandleChangePolarity(float value)
87 {
88 SwitchPolarity();
89 }
90
91 public void HandleHorizontalMovement(float value)
92 {
93 Acceleration.X = value * AccelerationRate;
94
95 if (value > 0.1 && Velocity.X < 0 || value < 0.1 && Velocity.X > 0)
96 {
97 Acceleration.X *= 2;
98 }
99
100 if (value > 0.1 && Velocity.Y < 0 || value < 0.1 && Velocity.Y > 0)
101 {
102 Acceleration.Y *= 2;
103 }
104 }
105
106 public void HandleVerticalMovement(float value)
107 {
108 Acceleration.Y = value * AccelerationRate;
109 }
110
111 public override void SwitchPolarity()
112 {
113 base.SwitchPolarity();
114 SwitchParticleEngine(CurrentPolarity);
115 game.Player.ResetMultiplier();
116 }
117
118 public override void SetPolarity(Polarity newPolarity)
119 {
120 base.SetPolarity(newPolarity);
121 SwitchParticleEngine(newPolarity);
122 }
123
124 protected void SwitchParticleEngine(Polarity polarity)
125 {
126 if (polarity == Polarity.Positive)
127 {
128 particleEngine.Color = MainShip.RedColor;
129 }
130 else if (polarity == Polarity.Negative)
131 {
132 particleEngine.Color = MainShip.BlueColor;
133 }
134 else
135 {
136 particleEngine.Color = Color.Gray;
137 }
138 }
139
140 public override void Update(GameTime gameTime)
141 {
142 base.Update(gameTime);
143 particleEngine.EmitterLocation = Position;
144 particleEngine.Update();
145 ConstrainToEdges();
146 UpdateImmortality(gameTime);
147 Shooting = false;
148 }
149
150 public void UpdateImmortality(GameTime gameTime)
151 {
152 if (Immortal)
153 {
154 CurrentImmortalTime += gameTime.ElapsedGameTime.Milliseconds;
155
156 if (Flashing)
157 {
158 Color = new Color(255, 255, 255, 128);
159 }
160 else
161 {
162 Color = Color.White;
163 }
164
165 Flashing = !Flashing;
166
167 if (CurrentImmortalTime > MaxImmortalTime)
168 {
169 Immortal = false;
170 Color = Color.White;
171 }
172 }
173 }
174
175 public override void Move(GameTime gameTime)
176 {
177 base.Move(gameTime);
178
179 if (Shooting)
180 {
181 if (Velocity.X > ActVelocity)
182 {
183 Velocity.X = ActVelocity;
184 }
185
186 if (Velocity.X < -ActVelocity)
187 {
188 Velocity.X = -ActVelocity;
189 }
190
191 if (Velocity.Y > ActVelocity)
192 {
193 Velocity.Y = ActVelocity;
194 }
195
196 if (Velocity.Y < -ActVelocity)
197 {
198 Velocity.Y = -ActVelocity;
199 }
200 }
201 }
202
203 public override void Magnetize(Ship ship, float distance, float angle)
204 {
205 }
206
207 protected void ConstrainToEdges()
208 {
209 if (Position.X < 0)
210 {
211 Position.X = 0;
212
213 if (Velocity.X < 0)
214 {
215 Velocity.X = 0;
216 }
217 }
218 if (Position.X > game.GraphicsDevice.Viewport.Width)
219 {
220 Position.X = game.GraphicsDevice.Viewport.Width;
221
222 if (Velocity.X > 0)
223 {
224 Velocity.X = 0;
225 }
226 }
227 if (Position.Y < 0)
228 {
229 Position.Y = 0;
230
231 if (Velocity.Y < 0)
232 {
233 Velocity.Y = 0;
234 }
235 }
236 if (Position.Y > game.GraphicsDevice.Viewport.Height)
237 {
238 Position.Y = game.GraphicsDevice.Viewport.Height;
239
240 if (Velocity.Y < 0)
241 {
242 Velocity.Y = 0;
243 }
244 }
245 }
246
247 public override void Draw(SpriteBatch spriteBatch)
248 {
249 particleEngine.Draw(spriteBatch);
250 base.Draw(spriteBatch);
251 }
252
253 public override void Collide(Actor other, Rectangle collision)
254 {
255 if (other.GetType().IsAssignableFrom(typeof(StandardShip)) &&
256 !Immortal)
257 {
258 Die();
259 }
260 }
261
262 protected override void Die()
263 {
264 game.Player.Lives = game.Player.Lives - 1;
265 game.Player.ResetMultiplier();
266 if (game.Player.Lives < 0)
267 {
268 Dying = true;
269 }
270 else {
271 Immortal = true;
272 CurrentImmortalTime = 0;
273 }
274 }
275 }
276 }