-
Notifications
You must be signed in to change notification settings - Fork 0
/
FallingShapes.cs
171 lines (142 loc) · 6.79 KB
/
FallingShapes.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
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Rapid_Prototype_1.Tools;
namespace Rapid_Prototype_1
{
class FallingShapes
{
private List<Shape> fallingShapes = new List<Shape>();
private List<Shape> allFallingShapes = new List<Shape>();
private List<Shape> shapesToShatter = new List<Shape>();
private ShatterManager shatterManager = new ShatterManager();
const int SCREEN_HEIGHT = 1080;
const int FALL_LENGTH = 816;
const int MIN_SPEED = 300;
const int MAX_SPEED = 500;
const int MIN_X = 100;
const int MAX_X = 1920 - 100;
const float SCALE = 1.75f;
const double MIN_SPAWN_INTERVAL = 500f;
const double MAX_SPAWN_INTERVAL = 1000f;
double nextSpawnTime;
Random random = new Random();
public FallingShapes(ContentManager content) {
// Add one of each piece
AddAllFallingShapes(content);
}
private float RandomFallSpeed() {
return random.Next(MIN_SPEED, MAX_SPEED) + (float)random.NextDouble();
}
private int RandomXPos() {
return random.Next(MIN_X, MAX_X);
}
private void SpawnPiece() {
if (allFallingShapes.Count != 0) {
fallingShapes.Add(allFallingShapes[0]);
allFallingShapes.RemoveAt(0);
}
}
private double GetNextSpawnOffset() {
return random.NextDouble() * (MAX_SPAWN_INTERVAL - MIN_SPAWN_INTERVAL) + MAX_SPAWN_INTERVAL;
}
public void Update(GameTime gameTime) {
if (gameTime.TotalGameTime.TotalMilliseconds > nextSpawnTime) {
SpawnPiece();
nextSpawnTime = gameTime.TotalGameTime.TotalMilliseconds + GetNextSpawnOffset();
}
List<Shape> shapesToWrap = new List<Shape>();
foreach (Shape shape in fallingShapes) {
shape.Update(gameTime);
float shapeTop = shape.GetPosition().Y - shape.GetCenter().Y;
float shapeBottom = shape.GetPosition().Y + shape.GetCenter().Y*2; // Leaving this in for when we have pieces "shatter" on the bottom
// If a piece is all the way off screen
if (shapeBottom >= ShatterManager.SHATTER_HEIGHT)
{
shapesToShatter.Add(shape);
}
}
// Stop shattered pieces from falling
foreach(Shape shape in shapesToShatter)
{
fallingShapes.Remove(shape);
}
//// This will almost always have 0 or 1 entry; if we add multiple lanes later, this could have more
//foreach (Shape shape in shapesToWrap)
//{
// fallingShapes.Remove(shape);
// // Comment these to stop the pieces from wrapping
// shape.ResetPosition();
// allFallingShapes.Add(shape);
//}
//shapesToWrap.Clear();
}
public void UpdateShatteredShapes(GameTime gameTime, ContentManager content)
{
shatterManager.Update(gameTime);
foreach (Shape shape in shapesToShatter)
{
shatterManager.AddPiece(shape, gameTime, content);
}
shapesToShatter.Clear();
List<Shape> shapesToResurrect = shatterManager.GetShapesToResurrect();
// Handle wrapping
foreach(Shape shape in shapesToResurrect)
{
shape.ResetPosition(RandomXPos(), 0);
allFallingShapes.Add(shape);
}
shapesToResurrect.Clear();
}
public void Draw(SpriteBatch batch) {
foreach (Shape shape in fallingShapes) {
shape.Draw(batch);
}
shatterManager.Draw(batch);
}
public void RemoveShape(Shape shape)
{
allFallingShapes.RemoveAll(item => shape.GetName() == item.GetName());
fallingShapes.RemoveAll(item => shape.GetName() == item.GetName());
}
public void AddShape(Shape shape)
{
fallingShapes.Add(shape);
}
public void ClearShapes(ContentManager content)
{
fallingShapes.Clear();
allFallingShapes.Clear();
AddAllFallingShapes(content);
}
public void AddAllFallingShapes(ContentManager content)
{
allFallingShapes.Add(new Shape(RandomXPos(), RandomFallSpeed(), new Vector2(SCALE, SCALE), "Unicorn_back_left_leg_sat", content));
allFallingShapes.Add(new Shape(RandomXPos(), RandomFallSpeed(), new Vector2(SCALE, SCALE), "Eagle1", content));
allFallingShapes.Add(new Shape(RandomXPos(), RandomFallSpeed(), new Vector2(SCALE, SCALE), "Unicorn_back_neck_sat", content));
allFallingShapes.Add(new Shape(RandomXPos(), RandomFallSpeed(), new Vector2(SCALE, SCALE), "Unicorn_back_right_leg_sat", content));
allFallingShapes.Add(new Shape(RandomXPos(), RandomFallSpeed(), new Vector2(SCALE, SCALE), "Unicorn_body_sat", content));
allFallingShapes.Add(new Shape(RandomXPos(), RandomFallSpeed(), new Vector2(SCALE, SCALE), "Eagle3", content));
allFallingShapes.Add(new Shape(RandomXPos(), RandomFallSpeed(), new Vector2(SCALE, SCALE), "Unicorn_chest_sat", content));
allFallingShapes.Add(new Shape(RandomXPos(), RandomFallSpeed(), new Vector2(SCALE, SCALE), "Unicorn_front_legs_sat", content));
allFallingShapes.Add(new Shape(RandomXPos(), RandomFallSpeed(), new Vector2(SCALE, SCALE), "Eagle4", content));
allFallingShapes.Add(new Shape(RandomXPos(), RandomFallSpeed(), new Vector2(SCALE, SCALE), "Unicorn_front_neck_sat", content));
allFallingShapes.Add(new Shape(RandomXPos(), RandomFallSpeed(), new Vector2(SCALE, SCALE), "Unicorn_horn_sat", content));
allFallingShapes.Add(new Shape(RandomXPos(), RandomFallSpeed(), new Vector2(SCALE, SCALE), "Eagle5", content));
allFallingShapes.Add(new Shape(RandomXPos(), RandomFallSpeed(), new Vector2(SCALE, SCALE), "Unicorn_nose_sat", content));
allFallingShapes.Add(new Shape(RandomXPos(), RandomFallSpeed(), new Vector2(SCALE, SCALE), "Unicorn_tail_sat", content));
allFallingShapes.Add(new Shape(RandomXPos(), RandomFallSpeed(), new Vector2(SCALE, SCALE), "Eagle10", content));
}
public List<Shape> GetFallingShapes()
{
return fallingShapes;
}
}
}