rpgmaker吧 关注:13,615贴子:24,164
  • 6回复贴,共1

rpg maker 中用脚本来获取事件的坐标位置是不是错误的

取消只看楼主收藏回复

在projertj1---------[原创发布] 写给萌新的超简单事件脚本指南 -------的帖子中
有关于玩家的坐标和地图事件坐标的代码
这两个是玩家的坐标
$gamePlayer.x
$gamePlayer.y
第n号地图事件的坐标
(这里把n改为了this)
$gameMap.events()[this].x
$gameMap.events()[this].y
然后,我把进行以下操作,测试后是OK的

//这两个是玩家的坐标
$gamePlayer.x
$gamePlayer.y
接着,我再进行以下操作,

//第n号地图事件的坐标
//(这里把n改为了this)
$gameMap.events()[this].x
$gameMap.events()[this].y
测试后,就报错了

TypeError
Cannot read property 'x' of undefined
类型错误
无法读取未定义的属性“x”
这两个试验我不但在mz版本试过,在mv版本也试过。
结论就是,在脚本中,可以用代码来获取玩家的坐标,但是无法用代码来获取事件的坐标。
报错的关键就是读取不了x。
在这里报错之后,后面的y它自然也就不读了。
当然了,到底是无法用代码来获取事件的坐标呢?
还是这个代码是错误的呢?
我不知道。


IP属地:广东1楼2023-08-19 02:45回复
    不知道是不是因为rpg maker的版本迭代。
    三个半夜的我把
    //第n号地图事件的坐标
    //(这里把n改为了this)
    $gameMap.events()[this].x
    $gameMap.events()[this].y
    改成了
    //地图本事件的坐标位置
    $gameMap.events()[this._x]
    $gameMap.events()[this._y]
    这样就不会报错了。
    -------------------------------------------------------------------------------------------------------
    同时,就是在projertj1找到的
    $gameMap.regionId(x,y)
    来得到地图事件的区域ID
    也是报错
    ReferenceError
    x is not defined
    引用错误
    未定义 x
    但是用$gamePlayer.regionId()
    来得到玩家的区域ID
    就没有报错
    然后,我在rmmz_objects.js找到
    Game_CharacterBase.prototype.regionId = function() {
    return $gameMap.regionId(this._x, this._y);
    };
    之后,才隐约觉得应该是格式出错了
    在把
    $gameMap.regionId(this._x, this._y)
    拿去测试后就发现不报错了。
    $gameMap.regionId(this._x, this._y)就应该是得到地图事件的区域ID 了吧。
    一楼的报错,也是在这里看到格式问题之后,才改好的。
    所以就是rpg maker经过了各个新版本的推出,
    ruby变成JavaScript的编程语言改变,
    在各个新版本又有时不时的升级情况下。
    有些脚本已经发生了格式不兼容了。


    IP属地:广东2楼2023-08-19 04:31
    收起回复
      之前因为$gameMap.regionId(x,y)这个代码报错,
      还在想着用$gameMap.regionId(x,y)这个格式,搞到了下面这种长代码来求地图事件的区域ID
      const eventRegionId = $gameMap.regionId($gameMap.event(this._eventId).x, $gameMap.event(this._eventId).y); $gameVariables.setValue(18, eventRegionId);
      结果发现还是报错,总之就是太费时了。
      $gameMap.regionId(this._x, this._y)
      这样短短的一句就搞定了。


      IP属地:广东3楼2023-08-19 04:44
      收起回复
        现在发现$gameMap.regionId(this._x, this._y)是没有报错了,
        但是似乎得不到区域ID的数据。
        所以,猜测
        $gameMap.events()[this._x]
        $gameMap.events()[this._y]
        也是没有报错,但是似乎得不到事件坐标的数据。
        所以,还是老老实实的在事件指令那里直接用封装好的指令好了。比如:
        ◆变量操作:#0001 = 本事件 的 地图横轴
        ◆变量操作:#0002 = 本事件 的 地图纵轴
        至于得到本事件区域ID的话,比如下面的一个组合就好了。
        ◆变量操作:#0003 = 本事件 的 地图横轴
        ◆变量操作:#0004 = 本事件 的 地图纵轴
        ◆获取指定位置的信息:0005变量, 区域编码, (0003变量,0004变量)


        IP属地:广东4楼2023-08-20 00:11
        回复
          这几天又在想这个事情,好像是搞清楚了。
          在把rpgmaker-script-wiki.xyz/getposiinfo_mz.php这里的下面这些资料。
          //获取地形标记
          $gameMap.terrainTag(x坐标,y坐标)
          //获取事件ID
          $gameMap.eventIdXY(x坐标,y坐标)
          //获取区块ID
          $gameMap.tileId(x坐标,y坐标,图层)
          //获取区域标识
          $gameMap.regionId(x坐标,y坐标)
          //设置为变量
          $gameVariables.setValue(变量ID,上述信息类型)
          ——————————————————————————————————————
          也可以根据图层获取 Maker MV 实现的瓦片 ID。
          瓦片 ID 的层数对应如下。
          第 1:1 层
          第 2 层:2
          第 3 层:3
          第 4 层:4
          示例代码(变量 1 是地形标签,变量 2 是事件 ID,变量 3 是瓦片 ID,变量 4 是区域 ID)
          ——————————————————————————————————————
          //(8,3)位置的地形标签的取得v1这个名的变量代入
          const v1 = $gameMap.terrainTag(8, 3)
          //获取位于(9,3)位置的事件的ID,代入名为v2的变量
          const v2 = $gameMap.eventIdXy(9, 3)
          ——————————————————————————————————————
          //获取层2的区块ID,代入名为v3的变量
          const v3 = $gameMap.tileId(4, 3, 2)
          //获取区域ID,代入名为v4的变量
          const v4 = $gameMap.regionId(8, 3)
          ——————————————————————————————————————
          //将获取的地形标记代入变量1
          $gameVariables.setValue(1, v1)
          //将获取的事件ID代入变量2
          $gameVariables.setValue(2, v2)
          ——————————————————————————————————————
          //将获取的区块ID代入变量3
          $gameVariables.setValue(3, v3)
          //将获取的区域ID代入变量4
          $gameVariables.setValue(4, v4)
          ——————————————————————————————————————
          如果要将地图坐标设为变量,请在 x 和 y 坐标参数中输入 “$gameVariables.value (variable ID)”。
          此外,如果要分配事件的位置,可以使用
          this.character(事件ID).x this.character(事件ID).y
          设置为 x 和 y 坐标。

          rmmz_objects.js的下面这段代码。
          case 5: // Character
          character = this.character(param1);
          if (character) {
          switch (param2) {
          case 0: // Map X
          return character.x;
          case 1: // Map Y
          return character.y;
          case 2: // Direction
          return character.direction();
          case 3: // Screen X
          return character.screenX();
          case 4: // Screen Y
          return character.screenY();
          }
          }
          break;

          以及rpg.blue/thread-478377-1-1.html的下面这些资料喂给文心一言,并且跟它聊天和反馈测试结果之后,才在它的提醒下,才明白是代码的索引是从0开始算起的,而事件指令那里为了人们的使用习惯,已经改成了从1开始算起(知道角色脸图是从0开始的,但是这个事件页一直以来已经习惯了从1开始了)。。。我说怎么照抄都抄不好呢,意想不到的东西就是能卡住人啊。
          $gameVariables.setValue(6, $gamePlayer.x)
          $gameVariables.setValue(7, $gamePlayer.y)
          $gameVariables.setValue(8, $gameMap.events()[n].x)
          $gameVariables.setValue(9, $gameMap.events()[n].y)
          ——————————————————————————————————————
          // 设置变量6,7号为玩家坐标的x、y
          $gameVariables.setValue(6, $gamePlayer.x)
          $gameVariables.setValue(7, $gamePlayer.y)
          ——————————————————————————————————————
          // 设置变量8,9号为第n号事件的坐标x、y
          $gameVariables.setValue(8, $gameMap.events()[n].x)
          $gameVariables.setValue(9, $gameMap.events()[n].y)
          ——————————————————————————————————————
          //这两个是玩家的坐标
          $gamePlayer.x
          $gamePlayer.y
          ——————————————————————————————————————
          //第n号地图事件的坐标
          $gameMap.events()[n].x
          $gameMap.events()[n].x

          比如,下面这个脚本是获得2还是4号事件的坐标x、y,[]里面的n,应该是n-1还是n+1
          // 设置变量8,9号变量为第n号事件的坐标x、y
          $gameVariables.setValue(8, $gameMap.events()[3].x)
          $gameVariables.setValue(9, $gameMap.events()[3].y)

          至于下面这个事件指令的脚本框使用脚本,是55号变量和56号变量分别获得6号事件的坐标x、y。
          ◆变量操作:#0055 = $gameMap.events()[5]._x
          ◆变量操作:#0056 = $gameMap.events()[5]._y

          至于获得区域的脚本,下面这个脚本是32号变量获得2号事件所在的区域。
          x = $gameMap.events()[1].x
          y = $gameMap.events()[1].y
          $gameVariables.setValue(32, $gameMap.regionId(x , y));

          至于获得地形的脚本,下面的脚本是33号事件获得7号事件的地形编号
          x = $gameMap.events()[6].x
          y = $gameMap.events()[6].y
          $gameVariables.setValue(33, $gameMap.terrainTag(x , y));

          //获取66号事件的区域标识
          i = 66
          x = $gameMap.event(i).x
          y = $gameMap.event(i).y
          $gameVariables.setValue(34,$gameMap.regionId(x,y))

          既然上面这样的脚本可以,经过测试,改成下面这样也可。。把$gameVariables.setValue(35,66)拿到这个脚本前面的其他地方也可以,这样就可以很灵活的使用了,比如在共通事件那里对不特定的事件使用。
          //获取66号事件的区域标识
          $gameVariables.setValue(35,66)
          i = $gameVariables.value(35)
          x = $gameMap.event(i).x
          y = $gameMap.event(i).y
          $gameVariables.setValue(34,$gameMap.regionId(x,y))

          当然了,以上的脚本都在事件指令这里本来就有,大部分情况都用不着,但是总结出来说不定什么时候就能用得到。


          IP属地:广东5楼2024-11-13 01:29
          回复
            呃,忘记了这个帖子一开始是想要取得本事件的坐标位置。
            在5楼写的却是指定了哪个事件页或者是变量来随时改变哪个事件页。
            之前其实是思路错了,习惯了this这个直接指代了。
            在2楼早就有人说了-----this通常是指向“父 方法或 父 类”,我却没有反应过来。

            比如用下面这个方法就能取得让5号变量取得本事件的id。
            i = this.eventId()
            $gameVariables.setValue(5,i)

            //获得本事件所在的区域
            i = this.eventId()
            x = $gameMap.event(i).x
            y = $gameMap.event(i).y
            $gameVariables.setValue(34,$gameMap.regionId(x,y))

            也就是说,------[原创发布] 写给萌新的超简单事件脚本指南-----这里的获取本事件坐标位置的脚本,
            可以直接抄,记得把n理解为n-1或n+1就可以了,
            也可以把n改成i,记得在前面加一个i = this.eventId()就可以了。


            IP属地:广东6楼2024-11-13 23:35
            回复
              通过继续查看rpgmaker的代码,
              发现好像是character.x直接获得玩家(队友、跟随者可能也是)和事件的X坐标,
              character.y直接获得玩家和事件的Y坐标。

              $gamePlayer.x
              $gamePlayer.y
              $gameMap.events()[n].x
              $gameMap.events()[n].y
              上面这四个代码获得玩家和事件的坐标,好像是从character.x和character.y这里获得的。

              //5号变量获得本事件的X轴,6号变量获得本事件的Y轴
              x = this.character().x
              y = this.character().y
              $gameVariables.setValue(5,x)
              $gameVariables.setValue(6,y)

              //5号变量获得玩家的X轴,6号变量获得玩家的Y轴
              x = $gamePlayer.x
              y = $gamePlayer.y
              $gameVariables.setValue(5,x)
              $gameVariables.setValue(6,y)

              另外,变量这里的XY可以不用在前面加上x = 什么什么,y = 什么什么,直接把什么什么放进去就可以了。
              好像是区域还是地形这里的XY才不能识别脚本,才需要什么东西给代进来。
              比如下面这个脚本这样简洁。
              //5号变量获得71号事件的X轴,6号变量获得71号事件的Y轴
              $gameVariables.setValue(5,this.character(71).x )
              $gameVariables.setValue(6,this.character(71).y )


              IP属地:广东7楼2024-11-14 01:30
              回复