Unity实现俄罗斯方块游戏

2020-06-21 13:00:01王振洲

在形状下落的方法中添加判断去控制是否能够下落

private bool canFall = true;//能否下落
 
/// <summary>
/// 下落
/// </summary>
private void Fall()
{
 if (canFall == false)
 {
  return;
 }
 
 Vector3 curPos = transform.position;
 Vector3 targetPos = curPos;
 targetPos.y -= 1;
 transform.position = targetPos;
 
 if (GameController.Instance.IsValidPos(transform) == false)
 {
  targetPos.y += 1;
  transform.position = targetPos;
 
  FallToBottom();
 }
}
 
/// <summary>
/// 下落到了底部
/// </summary>
private void FallToBottom()
{
 canFall = false;
 GameController.Instance.CurBlock = null;
}

现在形状与形状之间并不会叠加,而是会重叠在一起,在GameController脚本中编写方法,将每个方块位置添加到地图数组中(注意必须对每个方块的位置进行四舍五入取整操作)

/// <summary>
/// 将每个方块位置添加到地图数组中
/// </summary>
/// <param name="shapeTran"></param>
public void AddEachBlockTransToMapArray(Transform shape)
{
 foreach (Transform block in shape.transform)
 {
  if (block.GetComponent<SpriteRenderer>() == null)
  {
   continue;
  }
 
  Vector2 blockPos = block.position;
  blockPos = new Vector2(Mathf.RoundToInt(blockPos.x), Mathf.RoundToInt(blockPos.y));
  mapArray[(int)blockPos.x, (int)blockPos.y] = block;
 }
}

当形状下落到底部时,将每一个方块的位置添加到地图数组中

/// <summary>
/// 下落到底部
/// </summary>
private void FallToBottom()
{
 canFall = false;
 GameController.Instance.CurShape = null;
 
 //方块下落到底部时将每个方块位置添加到地图数组中
 GameController.Instance.AddEachBlockTransToMapArray(transform);
}

控制形状的左右移动

private void Update()
{
 //控制左右移动
 ControlMovement();
}
 
/// <summary>
/// 控制左右移动
/// </summary>
private void ControlMovement()
{
 float h = 0;
 if (Input.GetKeyDown(KeyCode.RightArrow))
 {
  h = 1;
 }
 else if (Input.GetKeyDown(KeyCode.LeftArrow))
 {
  h = -1;
 }
 
 Vector3 curPos = transform.position;
 Vector3 targetPos = curPos;
 targetPos.x += h;
 transform.position = targetPos;
 
 if (GameController.Instance.IsValidPos(transform) == false)
 {
  targetPos.x -= h;
  transform.position = targetPos;
 }
}

控制形状的旋转

private void Update()
{
 //控制旋转
 ControlRotate();
}
 
/// <summary>
/// 控制旋转
/// </summary>
private void ControlRotate()
{
 if (Input.GetKeyDown(KeyCode.UpArrow))
 {
  Transform rotateTrans = transform.Find("CenterPos");
  transform.RotateAround(rotateTrans.position, Vector3.forward, -90);
 
  if (GameController.Instance.IsValidPos(transform) == false)
  {
   transform.RotateAround(rotateTrans.position, Vector3.forward, 90);
  }
 }
}

控制加速下落