手把手教你Unity开发俄罗斯方块

第二十节 下落碰撞检测 下

2019-06-24  本文已影响0人  安静的程序员
01.转换为世界坐标

碰撞点已经筛选出来了,下一步就是判断这些碰撞点的下方是否存在像素点。由于碰撞点的坐标是相对于图层的,而要判断是否存在像素点的坐标是相对于世界的,所以首先要将位于图层上的碰撞点转换为世界坐标。



如图所示,红色区域是方块图层,绿色的碰撞点相对于图层的坐标为(0, 0),而我要判断绿色点下方的坐标为世界坐标,转换世界坐标也非常简单,因为图层的坐标是已知的,碰撞点坐标加上图层坐标后,得到的即为碰撞点相对于世界的坐标。
代码实现思路:
使用两个列表,一个列表是未转换的坐标,一个是转换后的坐标,转换的过程封装为一个方法:ConvertPointInWorld():

// 转换为世界坐标
void ConvertPointInWorld(List<MyPoint> oldPoint, List<MyPoint> newPoint)
{
    foreach (var item in oldPoint)
    {
        MyPoint point = new MyPoint(item._line, item._list);
        point._line = point._line + _blockLayer.Point._line;
        point._list = point._list + _blockLayer.Point._list;
        newPoint.Add(point);
    }
}

修改CanMoveDown()方法,转换碰撞点坐标:

// 世界坐标下的碰撞点
List<MyPoint> collidePointsInWorld = new List<MyPoint>();
// 将所有碰撞点转换为世界坐标
ConvertPointInWorld(collidePoints, collide-PointsInWorld);
02.判断碰撞

转换完成后,判断是否与固定方块图层(默认图层)产生碰撞,或者方块到达底端时,也算碰撞:

// 判断与默认图层是否碰撞
foreach (var item in collidePointsInWorld)
{
    if (item._line == 0 || _screenMain.GetLayer("DefaultLayer").IsCanSee(new My-Point(item._line - 1, item._list)))
    {
        return false;
    }
}

该方法编辑完成后,修改下落方块方法MoveDownBlock():
在下落之前,添加一个能否下落的判断:

// 下落方块
void MoveDownBlock()
{
    if (CanMoveDown())
    {
        MyPoint newPoint = _blockLayer.Point;
        newPoint._line -= 1;
        _blockLayer.Point = newPoint;
        // 刷新
        _screenMain.RefreshScreen();
    }
}

现在,运行游戏后,方块会一直下落直到底端后停止。
下一节,我们来进行一次代码重构,以便后续工作依然保持清晰的思路。

代码链接:https://pan.baidu.com/s/1q3Q7a9mi4QeSFWlH98RzaA
提取码:880l

上一篇 下一篇

猜你喜欢

热点阅读