public void RotateFigure()
{
// Check colisions for next modification
Vector2[] TestDynamicFigure = new Vector2[DynamicFigure.GetUpperBound(0) + 1];
for (int i = 0; i < BlocksCountInFigure; i++)
TestDynamicFigure[i] = Figures[DynamicFigureNumber, (DynamicFigureModificationNumber + 1) % 4, i] +
PositionForDynamicFigure;
// Make sure that figure can rotate if she stand near left and right borders
SortingVector2(ref TestDynamicFigure, true, TestDynamicFigure.GetLowerBound(0),
TestDynamicFigure.GetUpperBound(0));
int leftFigureBound;
int rightFigureBound;
if ((leftFigureBound = (int)TestDynamicFigure[0].X) < 0)
{
//int leftFigureBound = (int)TestDynamicFigure[0].X;
for (int i = 0; i < BlocksCountInFigure; i++)
{
TestDynamicFigure[i] +=
new Vector2(0 - leftFigureBound, 0);
}
if (TryPlaceFigureOnBoard(TestDynamicFigure))
PositionForDynamicFigure +=
new Vector2(0 - leftFigureBound, 0);
}
if ((rightFigureBound = (int)TestDynamicFigure[BlocksCountInFigure - 1].X) >= width)
{
//int rightFigureBound = (int)TestDynamicFigure[BlocksCountInFigure - 1].X;
for (int i = 0; i < BlocksCountInFigure; i++)
{
TestDynamicFigure[i] -=
new Vector2(rightFigureBound - width + 1, 0);
}
if (TryPlaceFigureOnBoard(TestDynamicFigure))
PositionForDynamicFigure -=
new Vector2(rightFigureBound - width + 1, 0);
}
if (TryPlaceFigureOnBoard(TestDynamicFigure))
{
DynamicFigureModificationNumber = (DynamicFigureModificationNumber + 1) % 4;
// Clear dynamic fields
for (int i = 0; i <= DynamicFigure.GetUpperBound(0); i++)
ClearBoardField((int)DynamicFigure[i].X, (int)DynamicFigure[i].Y);
DynamicFigure = TestDynamicFigure;
for (int i = 0; i <= DynamicFigure.GetUpperBound(0); i++)
{
boardFields[(int)DynamicFigure[i].X, (int)DynamicFigure[i].Y] = FieldState.Dynamic;
BoardColor[(int)DynamicFigure[i].X, (int)DynamicFigure[i].Y] = DynamicFigureColor;
}
}
}
/// <summary> /// Allows the game to run logic such as updating the world, /// checking for collisions, gathering input, and playing audio. /// </summary> /// <param name="gameTime">Provides a snapshot of timing values.</param> protected override void Update(GameTime gameTime) { // Allows the game to exit KeyboardState keyboardState = Keyboard.GetState(); if (keyboardState.IsKeyDown(Keys.Escape)) { this.Exit(); } // Check pause bool pauseKey = (oldKeyboardState.IsKeyDown(Keys.P) && (keyboardState.IsKeyUp(Keys.P))); oldKeyboardState = keyboardState; if (pauseKey) { pause = !pause; } if (!pause) { // Find dynamic figure position board.FindDynamicFigure(); // Increase player score int lines = board.DestroyLines(); if (lines > 0) { score.Value += (int)((5.0f / 2.0f) * lines * (lines + 3)); board.Speed += 0.005f; } score.Level = (int)(10 * board.Speed); // Create new shape in game if (!board.CreateNewFigure()) { GameOver(); } else { // If left key is pressed if (keyboardState.IsKeyDown(Keys.Left)) { board.MoveFigureLeft(); } // If right key is pressed if (keyboardState.IsKeyDown(Keys.Right)) { board.MoveFigureRight(); } // If down key is pressed if (keyboardState.IsKeyDown(Keys.Down)) { board.MoveFigureDown(); } // Rotate figure if (keyboardState.IsKeyDown(Keys.Up) || keyboardState.IsKeyDown(Keys.Space)) { board.RotateFigure(); } // Moving figure if (board.Movement >= 1) { board.Movement = 0; board.MoveFigureDown(); } else { board.Movement += board.Speed; } } } base.Update(gameTime); }