分析了Layer类与PublicData文件,发现没有需要重构的点,下面就对剩余的两个类进行重构:
01.ScreenMain
该类看起来只有一个方法需要重构:RefreshScreen()。
很明显擦除屏幕和绘制屏幕这两部分的代码几乎相同,像这样的代码就可以使用一个方法代替,重复的代码写很多遍可能会导致出错,用方法代替最好不过了:
// 设置指定坐标点的可见性
void SetPointVisibility(MyPoint point, bool visibility)
{
if (point._line >= 0 && point._line < 20 && point._list >= 0 && point._list < 10)
{
_screen[point._line, point._list].SetActive(visibility);
}
}
然后在刷新屏幕方法中调用即可:
// 刷新屏幕
public void RefreshScreen()
{
// 擦除屏幕
foreach (var point in _viewData) SetPointVisibility(point, false);
// 记得清除旧的显示数据
_viewData.Clear();
// 遍历图层 - 填充显示数据
foreach (var layer in _layerList)
{
// 遍历该图层上的每个点并计算新点的坐标
foreach (var point in layer.ViewData)
{
MyPoint newPoint = new MyPoint();
// 新点的坐标 = 图层的坐标 + 旧点在图层上的坐标
newPoint._line = layer.Point._line + point._line;
newPoint._list = layer.Point._list + point._list;
// 添入一个点至显示数据
_viewData.Add(newPoint);
}
}
// 遍历显示数据 - 绘制图形
foreach (var point in _viewData) SetPointVisibility(point, true);
}
接着重构导演类
02.Director
在导演类中,有许多成员变量,所有的成员变量都需要初始化。除了成员需要初始化,游戏还有一些必要的初始化工作,例如主屏幕必须初始化,必须添加“方块”图层。目前这些工作都是直接写在Start()方法中的,其中有许多判断是否为空的代码。更好的做法是,将这些初始化封装为一个方法,并返回一个布尔表示是否初始化成功,如果初始化失败,就不启动游戏核心逻辑。
然后一些后面反复会用到的对象可以用成员变量代替,例如默认图层和方块图层,现在只有方块图层是成员变量。
在类中添加一个成员:
Layer _defaultLayer; // 默认图层
再添加一个方法,初始化游戏:
// 初始化游戏
bool InitGame()
{
// 初始化主屏幕
_screenMain = Screen-Main.GetComponent<ScreenMain>();
if (_screenMain == null) return false;
_screenMain.Init();
// 添加方块图层
_screenMain.AddLayer("Block");
// 获取默认图层和方块图层引用
_defaultLayer = _screenMain.GetLayer("DefaultLayer");
if (_defaultLayer == null) return false;
_blockLayer = _screenMain.GetLayer("Block");
if (_blockLayer == null) return false;
// 添加初始方块
_blockLayer.Point = new MyPoint(20, 4);
EBlockType blockType = BlockCrea-tor.GetInstance().RandomBlockType();
_blockLayer.ViewData = BlockCrea-tor.GetInstance().CreateBlock(blockType);
// 刷新屏幕
_screenMain.RefreshScreen();
return true;
}
修改Start()方法:
void Start()
{
bool initSuccess = InitGame();
// 启动定时器,执行游戏核心逻辑
if (initSuccess) InvokeRepeating("GameCore", 0, 1);
}
因为默认图层已经使用成员变量替代,那么CanMoveDown()方法中的获取默认图层的代码就直接使用成员变量即可:
_screenMain.GetLayer("DefaultLayer")
修改为:
_defaultLayer
再来看下落方块代码,在游戏核心流程概述中,需要判断下落是否成功来消除方块和生成新方块,但目前下落方块方法什么都不返回,所以修改如下:
// 下落方块
bool MoveDownBlock()
{
if (CanMoveDown())
{
MyPoint newPoint = _blockLayer.Point;
newPoint._line -= 1;
_blockLayer.Point = newPoint;
// 刷新
_screenMain.RefreshScreen();
return true;
}
return false;
}
好了,到此,重构代码就告一段落了,千万别以为重构就此结束了。随着代码量的增加,你可能每天都需要重构。
代码链接:https://pan.baidu.com/s/1OjKbaI3W-U6DGwy2ijau_w
提取码:rb0p
网友评论