图形是显示出来了,但还有两个问题:
- 如果下一秒后,飞机向上移动了一格,然后再刷新屏幕,由于前一秒显示的图形没有擦除,导致两架飞机重叠了。
- 如果飞机飞出了屏幕,在映射时就会出现找不到引用的错误。
下面就来解决这两个问题。
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
网友评论