rpgmakermv吧 关注:21,780贴子:68,527
  • 10回复贴,共1

请问有办法让事件如同图片一样固定在一个位置吗?

只看楼主收藏回复

想要做一个动态立绘,跟随玩家移动,显示的图片也跟着移动。
但是现在的问题是,如果通过图片定位的话,因为是动态的播放有一定的帧数,每一次转换方向,都要等到动画播放完毕才能播放下一次。有些不连贯。
但是如果用事件的图象来控制方向,玩家离开屏幕,立绘也会移动。
有办法让事件始终固定在屏幕的特定位置吗?

或者有没有大佬可以优化一下我的逻辑。


IP属地:吉林1楼2025-04-21 17:06回复
    i = $gameParty.steps() //步数的脚本
    j = $gameVariables.value(1)
    if(i > j){ SceneManager.push(Scene_Menu)
    $gameVariables.setValue(1,$gameParty.steps())
    //设置变量数值:$gameVariables.setValue(变量ID,数值)
    }

    你把上面这个脚本放到并行事件的脚本框那里试一试,就是每走一步就跳出一次主菜单,
    或者是上面这个截图这样设置。二选一就好。
    然后鼠标右键让菜单退出,再次移动。


    IP属地:广东2楼2025-04-21 18:59
    回复
      2026-02-15 01:26:51
      广告
      不感兴趣
      开通SVIP免广告
      图片坐标x
      $gameScreen.picture(id)._x
      图片坐标y
      $gameScreen.picture(id)._y
      目前左上角在地图中的X坐标
      $gameMap._displayX
      目前左上角在地图中的Y坐标
      $gameMap._displayY
      画面X坐标切换成游戏地图X坐标
      $gameMap.canvasToMapX(x)
      画面Y坐标切换成游戏地图Y坐标
      $gameMap.canvasToMapX(y)

      在下面这个网页搜索坐标,找到了上面这些脚本。
      非常好的脚本调用手册 - RPG Maker MV 讨论区 - Project1

      TDDP 将图片绑定到地图 - TDDP_BindPicturesToMap.js
      作者: Galenmereth
      将图像的移动与地图的移动同步,而不是与照相机的移动同步。
      它还可以用作法线贴图的附加细节层。
      指定图像将嵌入到哪个图层中,例如字符的上方或下方。
      这些功能也可以与 Loop Map 一起使用。

      如果你想要的是把图片固定在地图的某个坐标而不是屏幕的某个坐标,
      上面这个插件好像就可以,百度、必应搜索TDDP_BindPicturesToMap.js好像就可以找到。
      或者是直接使用脚本,显示图片和移动是可以变量指定位置的,
      显示图片使用正常的数字指定,移动图片的变量直接绑定下面这两个脚本好像就可以了。
      目前左上角在地图中的X坐标
      $gameMap._displayX
      目前左上角在地图中的Y坐标
      $gameMap._displayY


      IP属地:广东3楼2025-04-21 19:20
      收起回复
        提问 给事件设置了自动执行但并不执行【rpgmakermv吧】_百度贴吧
        https://tieba.baidu.com/p/9005177780?pid=150227579485&cid=0#150227579485
        原来是想要跟着屏幕啊,显示图片和移动图片的位置本来就是跟着屏幕走的。
        NPC事件页的话,在上面这个帖子可以抄到下面这个脚本。
        $gameMap._events[this._eventId].moveStraight($gameMap._events[this._eventId].findDirectionTo(
        $gamePlayer.x, $gamePlayer.y ));
        //智能接近玩家的脚本,就是说懂得绕路,不容易卡死在障碍物那里。

        这里的$gamePlayer.x和$gamePlayer.y 是可以直接替换成x和y的,
        只不过在这个x和y是地图格子的坐标,而屏幕那里只能获得屏幕像素点。

        怎么判断一个数是否有余数js | PingCode智库
        docs.pingcode.com/baike/3713991
        在上面这个网页可以找到Number.isInteger()方法来判断一个数字是不是整数,
        为什么要用到这个呢?
        因为需要像素点除以48,如果是整数,那么就需要减一,
        因为48除以48等于1,但是48是在0号坐标那里,
        而50除以48等于一点几,50像素就在1号坐标那里。

        就如$gameMap.width()和$gameMap.height()是rpgmaker自带的获取地图有多少个格子的脚本,
        我使用Graphics.boxWidth =$gameMap.width()*48
        和Graphics.boxHeight=$gameMap.height()*48来重新设置游戏的显示框有多大,
        当然了,还需要一些其他的设置,等我这个游戏全部做完之后可能会发个新帖子来细说。

        x = 500/48; if(Number.isInteger(x)){x-1}; y = 500/48; if(Number.isInteger(y)){y-1}; $gameMap._events[this._eventId].moveStraight($gameMap._events[this._eventId].findDirectionTo(x, y));
        接着,你把上面这段复制到事件页的脚本框,并行执行试一下。
        再把并行执行改成玩家接触,让这个失效,接着在自主移动那里点击自定义、点击路线,
        在里面的脚本栏放入这个脚本,记得要完整的脚本放入这里的一个横栏。
        你可以试出这两个是不一样的。
        因为并行执行会让每一帧都在移动,从而加速执行,而自主移动那里有一个移动频率的设置。

        目前左上角在地图中的X坐标
        $gameMap._displayX
        目前左上角在地图中的Y坐标
        $gameMap._displayY
        而上面这个是把目的地固定在了地图的那个坐标,要是希望是屏幕上那个坐标的话。
        就用用到上面这两个脚本了,然后写成下面这样,不管是放到NPC事件页的脚本框那里,还是自主移动的脚本栏那里都可以。
        只是移动速度、移动频率或者是等待几帧需要自己看着来。。。这两个500是像素点,可以随便改。
        x = $gameMap._displayX+500/48; if(Number.isInteger(x)){x-1}; y = $gameMap._displayY+500/48; if(Number.isInteger(y)){y-1}; $gameMap._events[this._eventId].moveStraight($gameMap._events[this._eventId].findDirectionTo(x, y));

        只是,NPC事件页在移动到了那个坐标位置的时候,
        可能是由于自带一个移动的默认设置还是别的什么原因,总会往旁边一个移动,
        接着再回到那个位置,这样没完没了的。
        即便给它加了下面这个脚本也没用,一时之间没用找到让它不要乱走的方法。
        if(x === $gameMap.event(this._eventId).x && y === $gameMap.event(this._eventId).y){$gameMap.event(this._eventId).setPosition(x, y)}


        IP属地:广东4楼2025-04-22 01:21
        收起回复
          //更改游戏屏幕的宽度和高度。
          screenWidth=$gameMap.width()*48
          screenHeight=$gameMap.height()*48
          Graphics.resize(screenWidth, screenHeight);

          //窗口显示的宽度和高度
          Graphics.boxWidth =$gameMap.width()*48
          Graphics.boxHeight=$gameMap.height()*48

          //游戏屏幕的宽度和高度。
          Graphics.width=$gameMap.width()*48
          Graphics.height=$gameMap.height()*48

          //下面这两个代码块是MZ版自带的代码,注释掉的两行好像是数据库、系统2、进阶设置这里设置的宽和高。
          //这两段好像不需要也可以,我忘记了之前为什么要把这两段搞到这里来了。
          Game_Map.prototype.canvasToMapX = function(x) {
          const tileWidth = $gameMap.width()*48
          //const originX = this._displayX * tileWidth;
          const mapX = $gameMap.width()*48
          return $gameMap.width()*48
          }()
          Game_Map.prototype.canvasToMapY = function(y) {
          const tileHeight = $gameMap.height()*48
          //const originY = this._displayY * tileHeight;
          const mapY = $gameMap.height()*48
          return $gameMap.height()*48
          }()

          //全屏的脚本
          Graphics._requestFullScreen()

          //下面这两段是MZ版自带的代码,可以在rmmz_objects.js搜索Map.prototype.canvasToMap找到,是为了让这个空函数去替换掉之前的函数
          Game_Map.prototype.canvasToMapX = function(x) {
          };
          Game_Map.prototype.canvasToMapY = function(y) {
          };

          //把玩家位置重新定位,最好是直接调用当前地图的ID、玩家的X、Y坐标位置、朝向、淡入淡出的黑、白、无分别对应0、1、2
          //场景移动到启动游戏时,玩家的初始位置那里
          //这两行是因为需要让程序再次加载画面,没有找到重新假装、刷新画面的代码,这样变通一下也可以实现这个效果。
          $gamePlayer.reserveTransfer($gameMap._mapId, $gamePlayer.x, $gamePlayer.y,$gamePlayer._direction, 2)
          SceneManager.goto(Scene_Map)

          上面这个是我在MZ版加载地图范例、世界地图1,并且让尝试让全部地图都显示出来的脚本。
          因为MZ版的脚本框可以上下拉伸和左右拉伸,所以上面这些可以全部都放入一个脚本框那里去。
          MV版的脚本框则是只有12行,可以左右拉伸。
          分段放入几个脚本框那里或许是可以的,我主要使用MZ版,我没有去测试MV版。

          至于为什么显示不全,应该是rpgmaker显示图块的总图层有一个上限吧,好像是在8千左右。
          这里说的总图层好像是这样算的,1块平地算一个,平地上的花草树木、城堡村庄好像不会另外计算,
          大山的山顶才是另外算的。
          这是世界类型,区域类型可能不一样。
          就是说,当玩家穿透的时候,然后到处走,踩在玩家脚底下的算一层,在玩家头顶上的算另一层,
          而且是先加载头顶上的这一层。
          区域类型的高大树木是在玩家头顶上的,应该也是另外算一层的吧。

          当然了,由于地图范例、世界地图1实在是太大了,宽140高100,
          在没有全部加载完的情况下,在没有多少NPC事件页的情况下,左上角的帧率就已经不到50了。
          在自己没办法优化性能的前提下,没必要去试图突破显示的上限。
          倒是地图范例、世界地图2这种地下一张背景图,上面是一个天空之城的设置,
          虽然宽高是100和100,但是由于有大把的图块位置没有放置图块,
          而是一张背景图模拟出云朵的感觉,这样则可以全部显示。

          这样的大地图,好像会让鼠标点击的那个坐标出现问题,
          可能是因为之前一个图块的宽高是48,而现在被强行缩小了,
          说不定使用一个计算公式就可以恢复正常了,或者是去找关键代码。
          不过,可以使用按键操作啊,把这个作为大地图,
          上下左右键移动,按下哪个按键就进入另一张地图,
          或者是另一个脚本框把上面的这些脚本都恢复成默认设置就可以了。


          IP属地:广东5楼2025-04-23 11:52
          收起回复
            x = 500/48; if(Number.isInteger(x)){x-1};
            搞错了,上面这样的脚本,if(Number.isInteger(x)){x-1};好像是不需要的,
            因为之前想的是如果X是48、96、144这些48的倍数,
            1到48,49到96,97到144像素点刚好是图块坐标的0、1、2这些格子。

            后面一想,像素点和图块的格子都是从0开始算起的,
            所以0到47,48到95,96到143像素点才是图块坐标的0、1、2这些格子。
            就是说0到47乘以48,都是不满一,那就是鼠标在0号格子那里,
            48到95除以48,都是满一不满二,那就是鼠标在1号格子那里。

            至于一点几、二点几这样的数字,事件页的移动脚本能不能正常使用,好像是可以的,
            不太清楚,因为我现在用不到这个,所以没有怎么去测试。
            但是我需要用到检测鼠标在几号区域位置的脚本,
            我试了好久才想到会不会是 $gameMap.regionId(x, y)里面的X和Y只能检测到整数。
            好像还真是这样的,下面这个脚本在使用Math.floor()向下取整之前折磨了我好久。

            x=TouchInput.x/48;
            y=TouchInput.y/48;
            x=Math.floor(x);
            y=Math.floor(y);
            quyu = $gameMap.regionId(x, y)
            if(quyu === 2){
            $gameMessage.add("检测到鼠标在2号区域的位置")
            }


            IP属地:广东6楼2025-04-25 00:58
            回复
              下面这些说不定可以。

              TDDP 将图片绑定到地图 - TDDP_BindPicturesToMap.js
              作者: Galenmereth
              将图像的移动与地图的移动同步,而不是与照相机的移动同步。 它还可以用作法线贴图的附加细节层。 指定图像将嵌入到哪个图层中,例如字符的上方或下方。 这些功能也可以与 Loop Map 一起使用。
              plugin.fungamemake.com/archives/10004

              联锁画面 - InterlockPicture.js
              作者:神月佐助
              将图片地点链接到地图、活动等
              plugin.fungamemake.com/archives/16393

              KRD的图片总是在屏幕上——KRD_AlwaysImage.js
              作者:黑堂
              这是一个插件,可以让你在窗口中随时显示图片。 这里的窗口就是浏览器的窗口。 包括游戏展示区外的区域。
              plugin.fungamemake.com/archives/31724
              plugin-mz.fungamemake.com/archives/4343

              只有部分排员总是在地面——AlwaysStepForFollowers.js
              作者:阿瓦亚马塔纳
              只有部分排员常驻地面。
              plugin-mz.fungamemake.com/archives/6415

              扩展NRP事件加速 - NRP_EventNearScreen.js
              作者:砂川
              启用屏幕外事件的自主移动。
              plugin-mz.fungamemake.com/archives/3997


              IP属地:广东7楼2026-01-25 11:07
              收起回复