Project1

标题: 关于按键判断方面的问题请教 [打印本页]

作者: 十三点九进制    时间: 2019-3-14 02:03
标题: 关于按键判断方面的问题请教
简而言之,就是想把好几个功能绑在一个按键上,结果失败了
嗯,这里用黑魂来举个例子,我只玩过三代,在三代中翻滚、跑步、跳跃都在一个键上,按一下是翻滚,一直按着跑步,而在跑动中按下则是跳跃,换言之,就是以轻按、长按、连按作为条件。
我现在将三个开关绑在一个键上,但是触发各种出问题,为了方便我把三个开关也称为翻滚跑步和跳跃好了,在制作的时候遇上了各种比如跑步前会翻滚一下,或是按住跑步键后疯狂跳跃什么的问题,这种程度姑且还能解决,最麻烦的问题在于,有时候按下去没反应,而且我根本不知道到底是哪个部分出的问题导致的没反应
于是我试着调整了一下顺序试图解决问题,最终导致自身进入混乱状态,无法操作角色,随机攻击敌人或友方……什么的
-
完全是自找的麻烦,还来发帖问给别人也添麻烦。
不过,怎么说呢,如果妥协分别绑在三个键上或是复制一串看不懂的代码进脚本编辑器不用脑子就把问题解决了,就觉得……好像输了一样,实在是不爽,明明是自己的游戏诶,看上去能够做到的事还要妥协退让实在是让人开心不起来
↑因此为了自己开心就选择给别人添麻烦的家伙
-
望各位老师解答,不胜感谢
作者: 89444640    时间: 2019-3-14 07:22
我印象里rm是无法识别按下和弹起,比如你按着A再按B应该是有效的,
但是按住a再按a就不清楚了,比如连续按两次方向键,后一下是长按切换对应方向跑动,松开停止的act操作,因为无法识别弹起所以无效。
开关如果都处理不了,还真不知道,等高手帮忙。
作者: 灯笼菜刀王    时间: 2019-3-14 22:02
本帖最后由 灯笼菜刀王 于 2019-3-14 22:10 编辑

其实, 你这三个按键方式, 区分点是, "判断按键的间隔时间"

按F1, 搜索下  Input , 可以看到RMXP所支持的按键模式, 然后考虑下, 怎么利用它们, 配合"按键间隔时间" 来进行动作分歧吧

比如说,按住跑步, 这个很容易, 用press就可以了, 但是按住之前,因为也触发了"按一下 - 翻滚"的判定, 所以会先滚再跑... 如果把翻滚的条件改为, 按下后10帧内松开, 那就不会先滚咯

同样的, 跳跃的条件就是, 按下超过10帧后松开(不能小于10帧, 否则就触发翻滚判定了), 同时间隔10帧内再次按下,  这样三个动作就区分开来了

具体要怎么做, 就你自己思考啦, 不要麻烦我XD
作者: 灯笼菜刀王    时间: 2019-3-16 00:33
本帖最后由 灯笼菜刀王 于 2019-3-16 12:06 编辑

饭粒就是这样咯



使用@a 作为记录时间, 使用@按住后松开 作为是否重复按下的判定

作者: 十三点九进制    时间: 2019-3-17 21:51
灯笼菜刀王 发表于 2019-3-16 00:33
饭粒就是这样咯


对不起老师我智商太低姑父了你的期待TAT
看了半天饭粒大致搞明白了逻辑关系,或者说自以为搞明白了,实际一做其实啥都没明白
还是误触发的问题,原理是懂了,主要是逻辑顺序搞混了,试着理清楚又把自己脑子搞混了……多几层条件分歧就完全乱套感觉我这个智商不太适合做游戏这样子……
算了我还是乖乖分成三个键来按吧也不麻烦老师了,本来就是自找的麻烦,多少还是学到了点东西变量这样用可以做一个计时器什么的,谢谢老师了……

QQ截图20190317213929.png (5.39 KB, 下载次数: 10)

QQ截图20190317213929.png

作者: 灯笼菜刀王    时间: 2019-3-17 22:39
本帖最后由 灯笼菜刀王 于 2019-3-17 22:48 编辑

确实, 一大堆条件分歧, 不明白思路的话看起来是很混乱

思路是这样的, 先用个变量@a记录按键时间, 为了节省变量, 我们让它按下的时候 以正数来记录, 松开的时候,以负数来记录, 0的时候不动

开始, 第一句是初始化变量@a, 让它不至于是nil, 否则下面的判断会出错

先考虑翻滚, 像前面设计的, 以按下后10帧内松开为条件,  所以 翻滚要在"松开"的分歧里判断, 因为@a是正数的时候就是按过按键了, 所以当@a 大于0 且 小于10的时候, 条件就成立, 该干嘛干嘛, 然后让@a归零

然后考虑跳跃, 这里需要一个"反复按下"的判断, 所以要用个开关来记录"之前有没有按过按键",  之前有没有按过按键, 和翻滚是一样的按键判断, 为了区分它们, 用@a 是否超过10(轻按和长按)来区分

所以, 当@a 大于10的时候, 就是按过一次按键且不是翻滚, 这个时候就可以打开 "按过一次的开关", 然后再次按的时候, 就达成跳跃的条件了, 所以在按下的分歧里, 当"按过一次的开关"打开的时候, 就可以判断为跳跃了, 跳完后关闭开关, 为了避免也许会出现的问题(比如反复跳, 延迟跳, 跑着跑着脑抽跳一下之类的) 我们再加上个@a < 10 的判断, 以保证这个判断只有在第二次按下后10帧内起作用

好了, 这样就OK了, 但是, 善后工作没做, 如果按一下后, 我不继续按, 悠哉的走几步先, 然后再按, 这个时候因为开关是打开的, 所以还是一样可以触发跳跃判断,  这就不合适了, 所以这里还要处理下, 开关打开后, 没有马上接着按的情况, 10帧内没接着按, 就关掉开关, 把@a归零, 该干嘛干嘛

--------------------------------------------
写后面的话,  你要用RM变量来做判断也是可以啦, 不过用事件的条件分歧, 复数条件要套一大串, 不管是操作还是阅读都十分麻烦,  所以这里建议用 条件分歧最后一页的 脚本

这样写  $game_variables[1] > 0 and $game_variables[1] < 10   就是复数条件了, 这样节省一层分歧整理起来也舒服些




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