Project1

标题: 在RMXP中设置QTE小游戏问题 [打印本页]

作者: foghidecrab    时间: 2022-5-17 11:25
标题: 在RMXP中设置QTE小游戏问题
又是我,我总觉得我应该给自己开个提问楼什么的。
又开始在游戏里放置不应该属于RMXP的功能,想放QTE小游戏。
想法如下:
理想中的QTE界面如P1(不过我不是黄条动,是一个小图标左右动)
角色进入QTE小游戏后进入特殊QTE地图,设置一个事件“图标”(就是那个水晶)作为来回移动的条。自动执行事件,让图标在X轴上来回移动,当图标位于黄色(地图上是黄花)区域时(即事件X坐标为某一范围内时,当然现在我的X坐标是瞎写的)按下回车键,判定为QTE成功;其他情况判定为QTE失败。现在的事件设置如P2、3,地图场景如P4(同时也是不按回车停住时候的情况)
现在遇到的问题:
大问题1,设置的是重复动作,但是事件“图标”自动移动到条的右边之后就不动了,不会自动返回,按了回车键判定成功与否之后才会继续动(而且是左右动不带停的),不知道为啥?
小问题2,玩家按下回车后,事件“图标”还是会持续来回移动,在设置角色路线里面没有停止这一项,怎么让图标在玩家按下回车键的地方停下来呢?

理想状态.png (299.85 KB, 下载次数: 8)

理想状态

理想状态

事件设置1.png (23.72 KB, 下载次数: 7)

事件设置1

事件设置1

事件设置2.png (24.86 KB, 下载次数: 11)

事件设置2

事件设置2

地图.png (22.86 KB, 下载次数: 9)

地图

地图

作者: foghidecrab    时间: 2022-5-17 11:30
啊里面还有很多无效事件不要理。
比如一开始想的是直接改角色行走图然后角色移动(所以后面有一个角色行走速度调整)。再比如说还有一个X=10的……因为我之前以为是数格子,所以第九第十格,后来发现真的是图片X轴,为了方便设置了一个320(右半边)。
作者: 灯笼菜刀王    时间: 2022-5-17 15:51
直接给做法


然而

用行走图做这种"即时坐标判定"的游戏, 效果很差,  原因: 事件移动是直接把坐标+1,之后的"移动过程"只是表演, 动画结束后,再坐标+1, 再表演, 因此, 如果你的移动比较慢, 那会出现,明明坐标判定已经到指定位置, "人"却还在中间挪动的情况, 或者明明"人"还在范围内,却给你判定失败, 毕竟,此时的坐标已经+1,只是图片还没移动罢了

要玩以坐标或者碰触为判定的游戏, 还是重新写个scene, "手感"比较好, 笑
作者: foghidecrab    时间: 2022-5-17 16:49
灯笼菜刀王 发表于 2022-5-17 15:51
直接给做法

我尝试这么设置了,但是还是老样子移动到最右边以后就不动了,而且这回按回车也没有反应OJZ
作者: 灯笼菜刀王    时间: 2022-5-17 16:58
本帖最后由 灯笼菜刀王 于 2022-5-17 17:00 编辑

RUBY 代码复制
  1. class Spr_qte < RPG::Sprite
  2.   def initialize(pic,q1,q2,r1,r2,time)
  3.     super()
  4.     self.bitmap = RPG::Cache.picture(pic)
  5.     self.ox = self.bitmap.width / 2
  6.     self.oy = self.bitmap.height / 2
  7.     @_move_time = 0
  8.     @move_p = []
  9.     f1 = r1[0]..r2[0]
  10.     f2 = r1[1]..r2[1]
  11.     @q = [q1,q2,f1.to_a,f2.to_a,time]
  12.     @turn = false
  13.     reset
  14.   end
  15.   def move(x,y,time)
  16.     @move_p = [x || self.x,y || self.y,self.x,self.y,time]
  17.     @_move_time = time
  18.   end
  19.   def reset
  20.     self.x,self.y,self.z = @q[0][0],@q[0][1],9800
  21.     move(@q[1][0],@q[1][1],@q[4])
  22.   end
  23.   def stop
  24.     @old_move_time = @_move_time
  25.     @_move_time = 0
  26.   end
  27.   def go
  28.     @_move_time = @old_move_time
  29.     @old_move_time = nil
  30.   end
  31.   def input_ok?
  32.     return (@q[2].include?(self.x) and @q[3].include?(self.y))
  33.   end
  34.   def update
  35.     super
  36.     if @_move_time > 0
  37.       @_move_time -= 1
  38.       #x,y,oldx,oldy,time
  39.       new_x = 1.0 * (@move_p[0] - @move_p[2]) / @move_p[4] * \
  40.               (@move_p[4] - @_move_time) + @move_p[2]
  41.       new_y = 1.0 * (@move_p[1] - @move_p[3]) / @move_p[4] * \
  42.               (@move_p[4] - @_move_time) + @move_p[3]
  43.       self.x = Integer(new_x)
  44.       self.y = Integer(new_y)
  45.       return
  46.     end
  47.     if @old_move_time.nil?
  48.       if @turn
  49.         move(@q[1][0],@q[1][1],@q[4])
  50.         @turn = false
  51.       else
  52.         move(@q[0][0],@q[0][1],@q[4])
  53.         @turn = true
  54.       end
  55.     end
  56.   end
  57. end
  58.  
  59. class Interpreter
  60.   def qte_on(图片名,起点,终点,判定点1,判定点2,time)
  61.     @w = Spr_qte.new(图片名,起点,终点,判定点1,判定点2,time)
  62.     loop do
  63.       Graphics.update
  64.       $scene.instance_variable_get(:@spriteset).update
  65.       $game_system.update
  66.       @w.update
  67.       Input.update
  68.       if Input.repeat?(Input::C)
  69.         return @w.input_ok?
  70.       end
  71.     end
  72.   end
  73.   def qte_off
  74.     return if @w.nil?
  75.     @w.dispose
  76.     @w.bitmap.dispose
  77.   end
  78. end


随手写了个简易的QTE, 用它手感应该会略好一些,笑

使用方法, 条件分歧: 脚本: qte_on(图片名,起点,终点,判定点1,判定点2,time)     注意,符号全部要用半角符号,即英文输入法标点

图片名为光标图片名字, 图片放picture文件夹内, 注意名字要带半角双引号 栗子 : "我是图"
起点,终点,判定点1,判定点2, 都要写成数组格式, 栗子 [X坐标,Y坐标],  表示光标移动的路线以及成功判定的"路段"(光标图片的中心坐标在判定点1和2中间即为成功)
time 光标从起点移动到终点所需的时间,  根据v=s/t 可以知道, 时间越短速度越快, 笑

使用栗子


作者: foghidecrab    时间: 2022-5-17 17:57
条件分歧里脚本填的这个,我塞的图片是叫B1了:qte_on("B1",[0,240],[640,240],[320,240],[600,240])
脚本页是直接复制的,不会写脚本所以总是想用事件解决,因为一旦出错我自己完全不知道怎么改了OJZ

代码出错.png (7.22 KB, 下载次数: 7)

代码出错.png

作者: foghidecrab    时间: 2022-5-17 18:01
刚刚没改决定键。但是改了之后出错是不会出错了,就是什么也没有发生OJZ
作者: 灯笼菜刀王    时间: 2022-5-17 18:14
本帖最后由 灯笼菜刀王 于 2022-5-17 18:18 编辑
foghidecrab 发表于 2022-5-17 17:57
条件分歧里脚本填的这个,我塞的图片是叫B1了:qte_on("B1",[0,240],[640,240],[320,240],[600,240])
脚本 ...


没显示完整,  脚本是 qte_on("B1",[0,240],[640,240],[320,240],[600,240],10)

想玩花活必定绕不开脚本咯, 毕竟RMXP不是让你做这个的, 就像你要用挖掘机炒菜, 只凭说明书是不够的,至少要去南翔新东方进修下是吧,笑

其实脚本和事件差不了多少, 我这段脚本要用事件做一样可以, 只不过,脚本只要几十行, 纯事件就要搞得又臭又长咯,  就像上面事件我也是调用几个脚本命令省事,否则就要代入一大堆变量咯,笑
作者: guoxiaomi    时间: 2022-5-17 19:03
我记得RB做过一个QTE插件:https://rpg.blue/thread-366898-1-1.html
作者: foghidecrab    时间: 2022-5-17 20:48
我现在发现,如果把移动频度调成6,它就能正常来回动了,而且用地形标志当条件比X坐标要方便的多,直接给黄块塞个地形标志就好………………除了回车之后还是没有办法停下来。有没有什么神奇脚本能让一个在移动的事件强制停下来QUQ




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1