第十四节 完善刷新屏幕方法

作者: 安静的程序员 | 来源:发表于2019-06-24 09:57 被阅读0次

图形是显示出来了,但还有两个问题:

  • 如果下一秒后,飞机向上移动了一格,然后再刷新屏幕,由于前一秒显示的图形没有擦除,导致两架飞机重叠了。
  • 如果飞机飞出了屏幕,在映射时就会出现找不到引用的错误。
    下面就来解决这两个问题。
01.擦除屏幕

在刷新屏幕时,应该先擦除屏幕,然后再显示新的图形。
显示数据只要不进行更新,那么保存的就是旧的显示数据,所以只需要遍历显示数据中的点,然后将与这些点对应的像素点隐藏即可。
打开主屏幕类,在刷新屏幕方法中添加如下代码:

foreach (var point in _viewData)
{
    _screen[point._line, point._list].SetActive(false);
}
// 记得清除旧的显示数据
_viewData.Clear();
02.处理图形在屏幕外的情况

简单的讲,就是图形中某些像素点的坐标在屏幕外面了,操作这些点会造成数组越界,其实不管是擦除屏幕,还是显示新图形,都需要注意数组越界的情况,此时,我们需要增加一条判断像素点是否在屏幕外的代码:

if (point._line < 0 || point._line > 19 || point._list < 0 || point._list > 9) continue;

以上四个条件,只要满足其中一个,那就说明这个点是在屏幕外面了,直接忽略即可。

刷新屏幕完整的代码:

// 刷新屏幕
public void RefreshScreen()
{
    // 擦除屏幕
    foreach (var point in _viewData)
    {
        // 判断像素点是否位于屏幕外面
        if (point._line < 0 || point._line > 19 || point._list < 0 || point._list > 9) continue;
        _screen[point._line, point._list].SetActive(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)
    {
        // 判断像素点是否位于屏幕外面
        if (point._line < 0 || point._line > 19 || point._list < 0 || point._list > 9) continue;
        _screen[point._line, point._list].SetActive(true);
    }
}
03.测试

修改默认图层的坐标,使飞机的一部分在屏幕外面

打开导演类,在刷新屏幕前添加一行代码:

// 修改图层坐标
defaultLayer.Point = new MyPoint(3, 8);

回到Unity,运行,没有错误的话,应该显示如下:


代码链接:https://pan.baidu.com/s/16ohT9la0hDDSfT_OkyQtmg
提取码:blud

相关文章

网友评论

    本文标题:第十四节 完善刷新屏幕方法

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