基于MVC的俄罗斯方块笔记

基于MVC的俄罗斯方块笔记

1、使用开发比例为7:10

  • 按照移动端的开发标准进行,素材的导入等

2、MVC的三层结构 model 跟view 不进行交互

  • Model 模型层 —— 数据存放层
  • View 视图层——视图控制
  • Ctrl 逻辑层——桥梁作用 链接Model和VIew
  • 通过标签来进行Ctrl对model和view的访问

3、菜单的设置,布局通过Horizontal Layout Group来进行平均分布

4、通过有限状态机来控制游戏

  • 菜单状态

  • 游戏状态

  • 暂停状态

  • 游戏结束状态

27、控制图形方块的左右移动

  • 暂停状态不能移动 如果左右有方块挡住也不能移动
  • 移动的时候通过判断左右按键的按下来控制,让其按每个格子来移动
  • 如果能移动则更新位置并播放音效,不能移动则返回原来的位置
    /// <summary>
    /// 控制左右移动
    /// </summary>
    private void InputControl()
    {
        float h = 0;
        if (Input.GetKeyDown(KeyCode.LeftArrow))
        {
            h = -1;
        }
        else if (Input.GetKeyDown(KeyCode.RightArrow))
        {
            h = 1;
        }        
        if (h != 0)  //如果按下
        {
            Vector3 pos = transform.position;  //得到当前位置
            pos.x += h;
            transform.position = pos;//重新赋值
            //判断是否能移动
            if (ctrl.model.IsValidMapPosition(this.transform) == false)
            {
                pos.x -= h;    // 如果不能移动则返回刚才的位置
                transform.position = pos;return;  //设置回来之前的位置
            }
            ctrl.audioManager.PlayControl();   //可以移动的话就播放音效
        }
    }

28、控制方块的消除

  • 判断消除条件 每行满了之后消除 用消除方法来实现
  • 消除后需要所以的方块向下移动
/// <summary>
    /// 检测地图是否不要消除行
    /// </summary>
    private void CheckMap()
    {
        for (int i = 0; i < MAX_ROWS; i++)
        {
          bool isFull =  CheckIsRowFull(i);
            if (isFull)
            {
                DeleteRow(i);
                //消除后要移动上面的到下面
                MoveDownRowsAbove(i +1);
                i--;
            }
        }
    }
    
    /// <summary>
    /// 检测是否满了
    /// </summary>
    /// <param name="row">行数</param>
    /// <returns></returns>
    private bool CheckIsRowFull(int row)
    {
        for (int i = 0; i < MAX_COLUMNS; i++)
        {
            if (map[i,row] == null ) return false;           
        }
        return true;
    }

    /// <summary>
    /// 清空满的行
    /// </summary>
    /// <param name="row">行数</param>
    private void DeleteRow(int row)
    {
        for (int i = 0; i < MAX_COLUMNS; i++)
        {
            map[i, row] = null;
        }
    }

    /// <summary>
    /// 移动所以的行
    /// </summary>
    /// <param name="row"></param>
    private void MoveDownRowsAbove(int row )
    {
        for (int i = row; i < MAX_ROWS ; i++)
        {
            MoveDownRow(i);
        }
    }

    /// <summary>
    /// 移动单独的行
    /// </summary>
    /// <param name="row"></param>
    private void MoveDownRow(int row)
    {
        for (int i = 0; i < MAX_ROWS; i++)
        {
            map[i, row - 1] = map[i, row];
            map[i, row] = null;
            map[i, row - 1].position += new Vector3(0, -1, 0);
        }
    }

29、统一管理方块

  • 将所有方块放到一个空物体没进行统一管理
  • 新建空物体,用于存放生成的方块,持有一下空物体,然后将方块的父物体设置为新建发空物体
  • 控制销毁物体 ,如果消除了以后要销毁物体
public Transform blockHolder;

blockHolder = transform.Find("BlockHolder");

currentShape.transform.perent = blockHolder;

//检测一下所有的,如果都没有了就进行销毁
 foreach (Transform  t in blockHolder)
        {
            if (t.childCount <= 1)
            {
                Destroy(t.gameObject);
            }
        }

30、制作设置菜单

  • 设置菜单的显示设置
  • 里面控制音效,点击就禁音,如果是禁音就取消,不用判断,用取反来进行

31、排行榜菜单的显示

  • 里面有三个数据,要跟之前的数据更新,有一个删除按钮,点击要清空所以数据
  • 点击清空按钮要清空里面所有的数据——单独在数据层新建一个方法用于清空,主要是将三个参数从新设置为0,然后调用保存方法,最后在视图层新建一个点击事件调用清空方法,再调用显示数据方法

总结

  • 大体上面根据视频,把所以功能自己都实现了一遍,但是也有一些小问题没有改,但是不允许整体上面的效果
  • 主要运用三层架构来完成,每一层通过间接的访问实现数据、控制之类的交互
  • 具体小的代码实现还不是特别熟悉,还挺留在原始状态,希望下一步能改正
  • 每个小知识点还是需要单独的写笔记
  • 还有遇到功能不能跟视频完成一样的时候,要先自己排查,如果不能排除再查看视频代码

1、使用开发比例为7:10

  • 按照移动端的开发标准进行,素材的导入等

2、MVC的三层结构 model 跟view 不进行交互

  • Model 模型层 —— 数据存放层
  • View 视图层——视图控制
  • Ctrl 逻辑层——桥梁作用 链接Model和VIew
  • 通过标签来进行Ctrl对model和view的访问

3、菜单的设置,布局通过Horizontal Layout Group来进行平均分布

4、通过有限状态机来控制游戏

  • 菜单状态

  • 游戏状态

  • 暂停状态

  • 游戏结束状态

27、控制图形方块的左右移动

  • 暂停状态不能移动 如果左右有方块挡住也不能移动
  • 移动的时候通过判断左右按键的按下来控制,让其按每个格子来移动
  • 如果能移动则更新位置并播放音效,不能移动则返回原来的位置
    /// <summary>
    /// 控制左右移动
    /// </summary>
    private void InputControl()
    {
        float h = 0;
        if (Input.GetKeyDown(KeyCode.LeftArrow))
        {
            h = -1;
        }
        else if (Input.GetKeyDown(KeyCode.RightArrow))
        {
            h = 1;
        }        
        if (h != 0)  //如果按下
        {
            Vector3 pos = transform.position;  //得到当前位置
            pos.x += h;
            transform.position = pos;//重新赋值
            //判断是否能移动
            if (ctrl.model.IsValidMapPosition(this.transform) == false)
            {
                pos.x -= h;    // 如果不能移动则返回刚才的位置
                transform.position = pos;return;  //设置回来之前的位置
            }
            ctrl.audioManager.PlayControl();   //可以移动的话就播放音效
        }
    }

28、控制方块的消除

  • 判断消除条件 每行满了之后消除 用消除方法来实现
  • 消除后需要所以的方块向下移动
/// <summary>
    /// 检测地图是否不要消除行
    /// </summary>
    private void CheckMap()
    {
        for (int i = 0; i < MAX_ROWS; i++)
        {
          bool isFull =  CheckIsRowFull(i);
            if (isFull)
            {
                DeleteRow(i);
                //消除后要移动上面的到下面
                MoveDownRowsAbove(i +1);
                i--;
            }
        }
    }
    
    /// <summary>
    /// 检测是否满了
    /// </summary>
    /// <param name="row">行数</param>
    /// <returns></returns>
    private bool CheckIsRowFull(int row)
    {
        for (int i = 0; i < MAX_COLUMNS; i++)
        {
            if (map[i,row] == null ) return false;           
        }
        return true;
    }

    /// <summary>
    /// 清空满的行
    /// </summary>
    /// <param name="row">行数</param>
    private void DeleteRow(int row)
    {
        for (int i = 0; i < MAX_COLUMNS; i++)
        {
            map[i, row] = null;
        }
    }

    /// <summary>
    /// 移动所以的行
    /// </summary>
    /// <param name="row"></param>
    private void MoveDownRowsAbove(int row )
    {
        for (int i = row; i < MAX_ROWS ; i++)
        {
            MoveDownRow(i);
        }
    }

    /// <summary>
    /// 移动单独的行
    /// </summary>
    /// <param name="row"></param>
    private void MoveDownRow(int row)
    {
        for (int i = 0; i < MAX_ROWS; i++)
        {
            map[i, row - 1] = map[i, row];
            map[i, row] = null;
            map[i, row - 1].position += new Vector3(0, -1, 0);
        }
    }

29、统一管理方块

  • 将所有方块放到一个空物体没进行统一管理
  • 新建空物体,用于存放生成的方块,持有一下空物体,然后将方块的父物体设置为新建发空物体
  • 控制销毁物体 ,如果消除了以后要销毁物体
public Transform blockHolder;

blockHolder = transform.Find("BlockHolder");

currentShape.transform.perent = blockHolder;

//检测一下所有的,如果都没有了就进行销毁
 foreach (Transform  t in blockHolder)
        {
            if (t.childCount <= 1)
            {
                Destroy(t.gameObject);
            }
        }

30、制作设置菜单

  • 设置菜单的显示设置
  • 里面控制音效,点击就禁音,如果是禁音就取消,不用判断,用取反来进行

31、排行榜菜单的显示

  • 里面有三个数据,要跟之前的数据更新,有一个删除按钮,点击要清空所以数据
  • 点击清空按钮要清空里面所有的数据——单独在数据层新建一个方法用于清空,主要是将三个参数从新设置为0,然后调用保存方法,最后在视图层新建一个点击事件调用清空方法,再调用显示数据方法

总结

  • 大体上面根据视频,把所以功能自己都实现了一遍,但是也有一些小问题没有改,但是不允许整体上面的效果
  • 主要运用三层架构来完成,每一层通过间接的访问实现数据、控制之类的交互
  • 具体小的代码实现还不是特别熟悉,还挺留在原始状态,希望下一步能改正
  • 每个小知识点还是需要单独的写笔记
  • 还有遇到功能不能跟视频完成一样的时候,要先自己排查,如果不能排除再查看视频代码

猜你喜欢

转载自blog.csdn.net/Momorey/article/details/84968212