我是新手,正在跟随一段 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);