/// <summary>Сдвигает фигуру.</summary> public void DoStep() { if (Current != GameShape.Zero) { IsFigureFalling = MoveDown(Current); // пытаемся сдвинуть вниз Current = IsFigureFalling ? Current.MoveDown() : GameShape.Zero; // если фигура упала, то передвигаем указатель, иначе двигать больше некуда и фигура опустилась } else { IsFigureFalling = false; } }
/// <summary>Рисование подсказки(тени от фигуры)</summary> /// <param name="g"></param> public override void Paint(Graphics g) { base.Paint(g); if (!ShowTips || !IsFigureFalling || !Tetris.Properties.Settings.Default.ShadowShape) { return; } GameShape tip = Current; // временно удаляем текущую фигуру, потом всё вернём EraseFigure(Current); while (IsEmpty(tip)) // смещаем ниже, пока не натолкнёмся на препятствие { tip = tip.MoveDown(); } tip = tip.MoveUp(); // натолкнулись, надо фигуру в последнее свободное место (оно выше) SetFigure(Current, false); // возвращаем, как и обещалось Point[] cells = { new Point(tip.X0, tip.Y0), new Point(tip.X1, tip.Y1), new Point(tip.X2, tip.Y2), new Point(tip.X3, tip.Y3) }; // подсказка прозрачным квадратом Brush colorShadowPen = new SolidBrush(Color.FromArgb(70, 255, 255, 255)); foreach (Point cell in cells) { if (!IsEmpty(cell.Y, cell.X)) { continue; } // подсказка прозрачным квадратом g.FillRectangle(colorShadowPen, 8 + cell.X * CellSize, 8 + cell.Y * CellSize, CellSize, CellSize); } }
/// <summary>Передвигает совокупность клеток вниз.</summary> /// <param name="shape">Фигура - совокупность клеток</param> /// <returns>Возвращается истина - если возможен дальнейший сдвиг вниз, ложь - если сдвиг не возможен</returns> protected bool MoveDown(GameShape shape) { GameShape moved = shape.MoveDown(); shape.Type = CellType.Empty; SetFigure(shape, true); if (IsEmpty(moved)) { // Свободно, двигаем вниз SetFigure(moved, false); return(true); } // Занято, останавливаем shape.Type = moved.Type; SetFigure(shape, false); return(false); }
/// <summary>Поворот фигуры на 90 градусов по часовой стрелке.</summary> /// <param name="shape">Фигура, которую нужно повернуть.</param> /// <returns>Возвращается повернутая фигура.</returns> protected GameShape RotateFigure(GameShape shape) { GameShape rotated = shape.Rotate(); shape.Type = CellType.Empty; SetFigure(shape, true); shape.Type = rotated.Type; if (IsEmpty(rotated)) { SetFigure(rotated, false); return(rotated); } // Если неудача, фигура наткнулась на препятствие,то нужно сместить её вниз GameShape rotated2 = rotated.MoveDown(); if (IsEmpty(rotated2)) { SetFigure(rotated2, false); return(rotated2); } // Вправо rotated2 = rotated.MoveRight(); if (IsEmpty(rotated2)) { SetFigure(rotated2, false); return(rotated2); } // Влево rotated2 = rotated.MoveLeft(); if (IsEmpty(rotated2)) { SetFigure(rotated2, false); return(rotated2); } // Ничего не удалось сделать SetFigure(shape, false); return(GameShape.Zero); }