基于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,然后调用保存方法,最后在视图层新建一个点击事件调用清空方法,再调用显示数据方法
总结
- 大体上面根据视频,把所以功能自己都实现了一遍,但是也有一些小问题没有改,但是不允许整体上面的效果
- 主要运用三层架构来完成,每一层通过间接的访问实现数据、控制之类的交互
- 具体小的代码实现还不是特别熟悉,还挺留在原始状态,希望下一步能改正
- 每个小知识点还是需要单独的写笔记
- 还有遇到功能不能跟视频完成一样的时候,要先自己排查,如果不能排除再查看视频代码