c# - 为什么我的积木会卡住,拒绝掉到最低层?
问题描述
在我的基于网格的积木游戏中,我遇到了游戏积木的下降代码问题。
这是代码片段:
for (int i = (int)transform.position.y; i >= 0; i--)
{
if (transform.position.y >= 0 && SpawnBlocks.allBlocks[(int)gameObject.transform.position.x, i] == null)
{
float timeElapsed = 0;
int initPos = (int)transform.position.y;
int targetPos = (int)transform.position.y - i;
timeElapsed += Time.deltaTime * 4;
float moveDown = Mathf.Lerp(initPos, targetPos, timeElapsed);
transform.position = new Vector2(transform.position.x, moveDown);
SpawnBlocks.allBlocks[(int)transform.position.x, (int)transform.position.y] = gameObject;
gameObject.name = "(" + transform.position.x.ToString() + "," + transform.position.y.ToString() + ")";
}
}
每个块检查一个列表以查看它下面是否有一个块。如果没有,那么它应该平滑地向下移动那么多块来填充它。
但是会出现三个问题:
块不会下降到最低行
即使在一个块倒下后,同一列中该块上方的块也不会倒下,而是会卡在那里。
如果块之间只有一个空格,那么上面的块只会移动 .016694 而不是完整的 1
而不是真正的乐平,方块只会出现在下方的空间中。
我不知道为什么这些块会这样。
这是正在发生的事情的示例图片:
这是一个经过编辑的版本,显示了应该发生的情况:
解决方案
SpawnBlocks.allBlocks[(int)transform.position.x, (int)transform.position.y] = gameObject;
可以使这个为 false SpawnBlocks.allBlocks[(int)gameObject.transform.position.x, i] == null
,则transform.position = new Vector2(transform.position.x, moveDown);
不会被执行,所以 block 只能在停止之前下降一点点。
另外我建议不要float
用于索引。尝试使用int
for 逻辑,并触发某种用于删除动画的协程。
推荐阅读
- javascript - 名称属性选择器不起作用
- vba - 循环遍历具有多个 for 循环的工作表,并且内部的 If 函数不起作用
- r - 外部函数调用中的参数过多
- vue.js - 在组件中的事件上将类应用于 VueJs 中的 index.html
- google-apps-script - 通过录制的 Google Script 未出现在宏菜单中
- javascript - 对同一端点的多个响应的 Puppeteer 请求拦截最佳实践
- java - 如何使用服务帐户向 Google Cloud SQL Java 进行身份验证
- javascript - 循环中输入文本的空值 - JS
- r - R 引用向量以在 Matrix 中创建新列
- python - 如果属性名称重复,如何使用 BeautifulSoup 获取属性值