我是新手,正在跟随一段 Youtube 教程,教我如何添加收集物(在程序中命名为 o_enemy)。但是,这使得我的角色无法跳跃,如果有收集物,那么角色就会下落。如果我从房间中删除这个收集物,那么碰撞都会按预期工作。
当我尝试在收集物的代码中注释掉所有的代码,并在 gml_Object_oRoyal_Step_0 (line 124) 处查看错误时,我发现:
\======================================
错误信息:
ERROR 在动作号 1
步骤事件 0 的 对象 oRoyal:
变量 o_enemy.yspd (100021, -2147483648) 未设置后读取它。
at gml\_Object\_oRoyal\_Step\_0 (line 124) - || \_listInst.bbox\_top + \_listInst.yspd <= myFloorPlat.bbox\_top + myFloorPlat.yspd
\======================================
gml_Object_oRoyal_Step_0 (line 124)
我已经用 3 个小时的时间浏览和编辑这些代码,但是无法解决这个问题。我有碰撞的代码如下,请您告诉我您是否可以帮助我:
//地面的 Y 碰撞检测
//检查下方是否存在固体或半固体平台
var \_clampYspeed = max(0,yspd);
var \_list = ds\_list\_create();
//创建 DS 列表保存所有遇到的实例
var \_array = array\_create(0);
array\_push(\_array,o\_wall,o\_semiSolidWall);
//使用变量下方添加实例到列表
var \_listSize = instance\_place\_list(x,y+1 +\_clampYspeed + movePlatMaxSpd, \_array, \_list, false); //y + 1(下方)+ clampspeed(只检查下降)+ movePlatMaxSpd(玩家在平台上移动时不会下落)
//检查碰撞实例,只在顶部以下玩家时返回
for (var i = 0; i <\_listSize; i++) {
//获取实例 oWall 或 OSemiSolidWall 从列表中
var \_listInst = \_list\[| i\];
//避免吸附在地面上
if \_listInst != forgetSemiSolid
&& (\_listInst.yspd <= yspd || instance\_exists(myFloorPlat) )
&& ( \_listInst.yspd > 0 || place\_meeting(x, y+1 + \_clampYspeed, \_listInst))
{
//返回任何半固体墙底面的固体墙
if \_listInst.object\_index == o\_wall
||object\_is\_ancestor(\_listInst.object\_index, o\_wall)
||floor(bbox\_bottom) <=ceil(\_listInst.bbox\_top - \_listInst.yspd)
{
//返回最顶层的墙
if !instance\_exists(myFloorPlat)
|| \_listInst.bbox\_top + \_listInst.yspd <= myFloorPlat.bbox\_top + myFloorPlat.yspd//这是错误出现的地方
|| \_listInst.bbox\_top + \_listInst.yspd <= bbox\_bottom
{
myFloorPlat = \_listInst
}
}
}
}
//防止内存泄漏,销毁 DS 列表
ds\_list\_destroy(\_list);
//最后一次检查,确保地面以下玩家
if instance\_exists(myFloorPlat) && !place\_meeting (x, y + movePlatMaxSpd, myFloorPlat)
{
myFloorPlat = noone;
}
//如果存在地面平台,登上地面
if instance\_exists(myFloorPlat)
{
//沿着墙方向移动到地面上
var \_subPixel = 0.5;//如果平台穿过的地面,当地面平台时,跳上去的
while !place\_meeting(x, y + \_subPixel, myFloorPlat) && !place\_meeting(x, y, o\_wall) {y += \_subPixel;}
//确保不穿过半固体的地面
if myFloorPlat.object\_index == o\_semiSolidWall || object\_is\_ancestor( myFloorPlat.object\_index, o\_semiSolidWall)
{
while place\_meeting(x, y, myFloorPlat) { y-= \_subPixel; };
}
//对 y 瞬发地面
y = floor(y);
//地面碰撞检测
yspd = 0
setOnGround(true);
评论 (0)