-
Notifications
You must be signed in to change notification settings - Fork 0
/
Asteroid.cs
216 lines (192 loc) · 7.13 KB
/
Asteroid.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using System;
using System.Collections.Generic;
namespace Asteroids
{
class Asteroid
{
enum Direction
{
None,
Clockwise,
Anticlockwise
}
private Vector2 position;
public Vector2 flyDirection;
private int angle;
private float rotation;
private float rotationSpeed;
private float speed;
private int radius;
private bool offScreen = false;
private bool shot = false;
private Texture2D asteroidSprite;
// All asteroids get stored here
public static List<Asteroid> asteroids = new List<Asteroid>();
public static List<Asteroid> childAsteroids = new List<Asteroid>();
public Vector2 Position
{
get { return position; }
}
public int Angle
{
get { return angle; }
}
public float Rotation
{
get { return rotation; }
}
public int Radius
{
get { return radius; }
}
public bool OffScreen
{
get { return offScreen; }
set { offScreen = value; }
}
public bool Shot
{
get { return shot; }
set { shot = value; }
}
public Texture2D AsteroidSprite
{
get { return asteroidSprite; }
}
public Asteroid()
{
}
public Asteroid(Texture2D sprite)
{
// Give asteroid a sprite
asteroidSprite = sprite;
// Spawn an asteroid
SpawnAsteroid();
}
public void Update(GameTime gameTime)
{
// Get delta time
float dt = (float)gameTime.ElapsedGameTime.TotalSeconds;
Vector2 pos = position;
if (pos.X < -400 || pos.X > 1680 || pos.Y < -400 || pos.Y > 1120) offScreen = true;
flyDirection = new Vector2((float)Math.Cos(MathHelper.ToRadians(angle)), -(float)Math.Sin(MathHelper.ToRadians(angle)));
position += flyDirection * speed * dt;
rotation += rotationSpeed * dt;
}
public void SpawnAsteroid()
{
// Spawn the new asteroid
// Randomly choose an angle for the asteroid to fly in
Random rand = new Random();
angle = rand.Next(361);
// Randomly choose a rotation value for the sprite
rotationSpeed = (float)rand.NextDouble();
// Change direction of rotation on a 50% chance
if (rand.Next(101) < 50) rotationSpeed *= -1;
// Set "specs" of asteroid depending on type of asteroid we spawn (hard coded for now)
switch (asteroidSprite.Name)
{
case "Enemies/AsteroidXS":
radius = 1;
speed = rand.Next(200, 400);
break;
case "Enemies/AsteroidS":
radius = 5;
speed = rand.Next(150, 350);
break;
case "Enemies/AsteroidM":
radius = 12;
speed = rand.Next(100, 300);
break;
case "Enemies/AsteroidL":
radius = 45;
speed = 100f;
break;
default:
break;
}
Vector2 newPos;
newPos.Y = rand.Next(-200, 920);
if (newPos.Y < (0 - radius) || newPos.Y > (720 + radius))
{
// Spawning above or below the screen
if (angle <= 180) newPos.X = rand.Next(-100, 640 - radius);
else newPos.X = rand.Next(640 - radius, 1480);
}
else
{
// We're spawning inside the screen height so only left or right of the screen is acceptable
if (angle <= 180)
{
newPos.X = rand.Next(-200, 0 - radius);
}
else
{
newPos.X = rand.Next(1280 + radius, 1480);
}
}
// Set position
position = newPos;
}
public void SplitAsteroid()
{
// Asteroid has been marked for deletion so spawn smaller versions to fly off in random direction! (Don't split XS sprites)
Random rand = new Random();
switch (asteroidSprite.Name)
{
case "Enemies/AsteroidS":
// Split into 4
Asteroid[] xschildAsteroids = new Asteroid[4];
for (int i = 0; i < 4; i++)
{
Asteroid xstempAsteroid = new Asteroid();
xstempAsteroid.radius = 1;
xstempAsteroid.speed = rand.Next(200, 400);
xstempAsteroid.angle = rand.Next(361);
xstempAsteroid.position = this.position;
xstempAsteroid.offScreen = false;
xstempAsteroid.asteroidSprite = AsteroidsGame.asteroidSprites[0];
xschildAsteroids[i] = xstempAsteroid;
}
Asteroid.childAsteroids.AddRange(xschildAsteroids);
break;
case "Enemies/AsteroidM":
// Split into 3
Asteroid[] schildAsteroids = new Asteroid[3];
for (int i = 0; i < 3; i++)
{
Asteroid stempAsteroid = new Asteroid();
stempAsteroid.radius = 5;
stempAsteroid.speed = rand.Next(150, 350);
stempAsteroid.angle = rand.Next(361);
stempAsteroid.position = this.position;
stempAsteroid.offScreen = false;
stempAsteroid.asteroidSprite = AsteroidsGame.asteroidSprites[1];
schildAsteroids[i] = stempAsteroid;
}
Asteroid.childAsteroids.AddRange(schildAsteroids);
break;
case "Enemies/AsteroidL":
// Split into 2
Asteroid[] mchildAsteroids = new Asteroid[2];
for (int i = 0; i < 2; i++)
{
Asteroid mtempAsteroid = new Asteroid();
mtempAsteroid.radius = 12;
mtempAsteroid.speed = rand.Next(100, 300);
mtempAsteroid.angle = rand.Next(361);
mtempAsteroid.position = this.position;
mtempAsteroid.offScreen = false;
mtempAsteroid.asteroidSprite = AsteroidsGame.asteroidSprites[2];
mchildAsteroids[i] = mtempAsteroid;
}
Asteroid.childAsteroids.AddRange(mchildAsteroids);
break;
default:
break;
}
}
}
}