第二十二节 重构代码 下

作者: 安静的程序员 | 来源:发表于2019-06-25 08:33 被阅读0次

    分析了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

    相关文章

      网友评论

        本文标题:第二十二节 重构代码 下

        本文链接:https://www.haomeiwen.com/subject/bcuzqctx.html