第二十节 下落碰撞检测 下
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