输入系统

本贴最后更新于 2966 天前,其中的信息可能已经沧海桑田

流星的输入和招式的原理分析
以下都是个人推测并非事实

输入系统代码已经 OK,能正常使用

此文章是按照知乎
格斗游戏的招式指令实际代码是如何判断的? 提问里 Thinkraft 的回答来分析的,流星应该也是这个原理设计的

输入是 2 下 4 左 6 右 8 上 以及 攻击 J 组成的,在游戏开始的时候角色切换到 Idle 动作,在这个动作下,可以往很多动作切换
在 Idle 动作下可输入 8 8 让角色前冲 同理还有左闪 右闪 后闪 那么当按下 8 8 时 是如何识别到底是输入前冲 还是输入匕首的 88J 呢 88J 是 匕首上上攻击

从游戏测试,可得到 如果在输入 88 之后,等待几帧再输入 J,会出现,角色先前冲,之后在前冲动作结束前,切换到 88J 动作
这表明了,这二个招式,都满足而且识别了,更说明了,一个输入,对应的输出动作,可能是多个(因为 88 动作和 88J 动作 2 者共享了 2 个 8 按键),而如果像把输入缓冲区当作树处理那样,那么头节点确定了,子节点确定了,那么就唯一对应了一个输入,就不会同时触发 2 个动作
这个是有本质区别的,区别在于对输入的缓冲的识别
A 处理方式是集中处理,所有招式查询一个输入缓冲区,任意一个较短的输入(88)满足了,可能长的(88J)就会被截断而不执行了,如果短的满足了却不删除输入缓冲区,那么没办法确定什么时候该删除缓冲区并重置状态。
B 方式是每一个招式都有自己的输入状态,让输入状态按照每次的按键输入更新,那么当动作 88 自己的状态满足了,那么同时动作 88J 的状态处于等待 J 按键 也就是和 88 一样拥有 2 个 8 按键输入,而且这个时候会执行 88 动作,并且重置 88 动作的输入状态为初始状态
而若在 88J 动作等待 J 按键开始后的 N 帧之内,若输入了 J,那么 88J 满足,就输出 88J 动作,而若超过了限定的 N 帧,那么会重置 88J 动作的状态,也就是 88J 动作清除掉 88 的输入,因为在期望得到输入 J 的时间段内没有等到 J 输入

而原先设计的时候,是想针对当前动作包含的所有下一个可连接招式集合,做一个招式输入状态更新,也就是在任意当前动作下,能转到的目标动作会有一个集合,这个集合一共接收多少种输入招式,就用这些招式形成一个接受输入的,每一次输入,都遍历里面的每一招
让每一招更新自己的输入缓冲,任意一个长的招式识别了,就不在遍历,而直接输出。

有一个问题是(需要怒气的大招没有怒气时全部会变成普通攻击,这一点是在无怒气状态下,使用大绝或者小绝,都只会触发攻击,而不会触发其他招式推测的,类似匕首 288J 大招 与 88J 具有重叠,按常理,使用不出 288J 只会重置 288J 动作的状态,从而执行 88 与 88J,可是游戏里不是这样,那么只有当 288J 没有怒气的时候,重置全部招式的状态,并且执行普通攻击才符合游戏现在的样子)。

另外还有一个特殊例子,就是流星里一个防御取消跳的,原作应该是一个 bug,就是按住跳后不要松开很快按住防御键,那么防御按下后,就会立即切换到防御,如果松开防御,这时会自动的跳起来。而不用松开跳键
这说明跳具有一个延迟响应的设定,为什么这么说,因为其他动作,按下时刻就已经触发,而不会等待,而跳跃是比较特殊的动作,他有一个类似压力反馈的机制,就是原作里,跳跃是有轻重的,是通过按住跳,在很短的几帧内(10 帧左右)如果抬起跳,那么会进入低段跳或者小跳(最少等待这么多帧,并且松开了就立即执行低段跳),而按住时间超过了这个 10 帧,会认为是一个完整的跳,也会立即执行跳(完整跳最少要等这 10 帧),这也是说,按住跳的(OnKeyDown)时刻,系统在等,等你在 10 帧以内是否释放跳按键,如果释放了,就会有一个跳跃高度的缩放比例,来减少跳跃高度模拟一个低段跳,而超过这个 10 帧,则是一个完整的跳。
而原作的跳还有最极端的跳,就是 0 高度跳跃,这个就是小跳,这个小跳触发的情况,应该在按住跳之后,设定一个帧数,在经过这么多帧之前只要释放跳按键,就是小跳,而这个帧要比之前的 10 小,假设是 5,那么 按住跳之后 1-5 帧以内释放则产生小跳
6-10 帧之内就按照 比例算完整跳的缩放比,完整跳,高度是 75,小跳高度是 0 低段跳,按照比例算 75 的百分比
当释放防御键时,跳招式会恢复更新状态,那么延迟响应的动作跳,就会更新自己的计时器,判断,当前按住跳的时间已经超过了 10 帧,那么就会触发跳而不用抬起跳键,还有一点,是在按住防御的过程中,释放了跳 OnKeyUp,那么跳招式的输入缓冲区,会被刷新,要么识别了跳但是从当前防御动作是无法切到跳跃动作的,要么就是直接的重置了跳动作的输入缓冲区,从而使之后释放防御后,无法触发跳

现在的代码招式识别都是写死的,是按照行号,对应招式,来进行一个判定的,也没有对每个招式维护一个自己的缓冲,所以说代码架构非常的垃圾,就是不知道能不能改成上面说的这样,首先的问题是,原作里 character.act 文件里的行号,到底意味着什么。
因为一个行号,可以对应一个 group,这个 group 是一个招式,或者多个招式,也就是说,某一行,既能算作输入 A 招式,也可以算作输入 B 招式,只有当前动作的可切换动作集合里包含了当前输入的招式,才可以切换
而且不同行号,可能输入也会一致,就是因为武器系统的原因,拿刀的下上 A 28J 和拿剑的 下上 A 28J 还有拿匕首的 都是同一个输入,但是行号却不一样,所以对应的招式输出也不一样
如果要改成每个招式都维护自己的输入状态,那么是针对每个 pose 维护自己的输入状态,还是每个行号维护自己的输入状态,还是对每一种输入维护自己的输入状态呢
在这个游戏里的输入 忽略防御 跳跃 只看攻击招式有(单个方向键或者仅方向键构成的招式,是由普通输入识别方式识别的,连招和普通攻击另外用连招输入识别方式 ,因为攻击会依据武器来算 Pose)
J
2J
4J
6J
8J
22 删
44 删
66 删
88 删
22J
88J
28J
82J
46J
64J
462J (刀大绝)
246J(双刺大绝)
468J (剑大绝)
228J (枪前砸)
288J (枪匕首大招)
888J (枪破防绝)
似乎就这么多了
但是每一个呢,又可能包含不同的行号
不同的行号,可能对应同样的输出,因为武器不同,这使得如果装备了不同的武器用同样的输入,得到的是不同的行号。
关键是现在怎么解决这个问题

想到的解决办法是,用输入项 就是以上列举的这么多项,把每个符合此输入的行号放到一个集合里(这一步是人工的),当有此输入时,一个个集合里的行号就依次去测试这个行号包含的全部动作。而每个行号拥有多个动作,就会从第一个动作遍历到最后一个,查到任意一个动作,在当前动作的可切换目标动作中,那么就调用此动作,同时还要重置此输入项的状态

还有一个问题就是,输入帧限定,限定的是任意时刻都允许更新连招缓冲区,但是出招前必须看是否在输入限定帧范围内,这样会使得能够成功输入招式,但是无法使用招式,而不会出现没法办成功输入招式。
还有一个问题就是,可以缓存输入指令,让一些动作一旦到达切换帧,就可以立即识别,类似格斗游戏里的提前输入,等前一个动作刚完,就立即使用招式。

那现在首先要做的是 把招式对应的行号,写到 xls 表里,程序开始读取这张表,然后根据表的每一行,创建一个输入状态,整个表的所有行构成整个输入状态构成输入模块,在动作的限定输入帧之间,更新输入模块的每一项的输入状态。一旦有一个满足了输入,那么就会遍历输入状态里所有行号的所有动作,去测试当前动作是否含有切换到所有行号包含的任意一个动作,如果含有,那么就测试该动作能否执行(怒气值,武器等外部条件的判断),(不存在一个动作可以调用同样招式的 2 个动作,设计阶段避免)

那么现在思路一切清晰,下一步开始写代码

调了一天代码终于 OK,动作输入能准确识别了
遇见的问题还是多个动作都成立的问题
类似 288A 同时会使 288A 动作 88 动作 88A 动作 3 个动作都成立,怎么知道想调用的到底是哪个动作,现在的做法是,一旦长动作识别了,就不会继续对短动作进行识别,这个方法可能会有问题

武器行号使用表
飞镖
1, 2, 3, 4, 85, 87, 143, 144
火铳
5,6,7,8,147
飞轮
9, 10, 11, 12,145,146
双刺
[13-24], 148,149
匕首
[25-34],84,88,150

[35-47],151, 152

[48-60],153,154

[61-72],155,156
锤子
[73-83],157,158
乾坤
[89-106],159,160
指虎
[107-121]
忍刀
[122-142]
中间缺少了 86【爆气 pose 367】
一共 160 个行号,每个武器有自己对应的行号,每个行号负责这个武器的一部分招式
这样子,当处于一个攻击 Pose 的时候,完全可以知道这个 Pose 在哪一行,这行归属于哪一种武器处理

现在的动作问题
1,远程武器的处理
枪需要进入预备姿态才能开始发出招式
飞轮需要用代码控制攻击过程
2,动画位移是自己控制,还是从动画读取,要怎么配合重力
现在从动画读取位移,发现动作表现和实际游戏不一致,匕首原地跳空中下刺,动画位移 Y 轴下 68,向前 18,游戏中原地跳下刺 Y 轴一直到地面约 75,向前 3 左右.可见若读动画位移,那么是错的
可是若自己设定,原游戏中仅有 Menu.res 存储了招式的攻击力,却没有说明位移多少,是否忽略重力等。难道每个动作的各个阶段都是程序里写死的。我想应该不会吧。
3 乾坤刀涉及到 3 个武器姿态的转换,会导致同武器不同模型切换

而最大的问题是重力和动作位移。还有轻功。这部分解决了就可以打怪了,再后面就是怪物 AI,关卡剧本,关卡的机关,怪物设定,关卡与关卡间的连接
主线和支线,道具和装备,buff,技能,佣兵,职业,相机特写,赏金首设定,(合成,强化,重铸)可能加一部分,商店,Npc,固定功能点(武器店(武器及其他装备),杂货店(材料-药品),客栈)
(合成,重铸,强化都需要 NPC 和建筑),还有存档点,还有这么多,啊西吧

相关帖子

回帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Openfire

    Openfire 是开源的、基于可拓展通讯和表示协议 (XMPP)、采用 Java 编程语言开发的实时协作服务器。Openfire 的效率很高,单台服务器可支持上万并发用户。

    6 引用 • 7 回帖 • 133 关注
  • CodeMirror
    2 引用 • 17 回帖 • 197 关注
  • CongSec

    本标签主要用于分享网络空间安全专业的学习笔记

    1 引用 • 1 回帖 • 55 关注
  • 快应用

    快应用 是基于手机硬件平台的新型应用形态;标准是由主流手机厂商组成的快应用联盟联合制定;快应用标准的诞生将在研发接口、能力接入、开发者服务等层面建设标准平台;以平台化的生态模式对个人开发者和企业开发者全品类开放。

    15 引用 • 127 回帖
  • SMTP

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。

    4 引用 • 18 回帖 • 662 关注
  • Folo

    Folo 是一个 RSS 阅读和信息聚合应用,整合多种内容源到统一时间线。

    项目地址:https://github.com/RSSNext/Folo

    1 引用 • 3 回帖 • 2 关注
  • Hprose

    Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

    9 引用 • 17 回帖 • 650 关注
  • 千千插件

    千千块(自定义块 css 和 js)
    可以用 ai 提示词来无限创作思源笔记

    32 引用 • 69 回帖
  • Gitea

    Gitea 是一个开源社区驱动的轻量级代码托管解决方案,后端采用 Go 编写,采用 MIT 许可证。

    5 引用 • 16 回帖 • 3 关注
  • 代码片段

    代码片段分为 CSS 与 JS 两种代码,添加在 [设置 - 外观 - 代码片段] 中,这些代码会在思源笔记加载时自动执行,用于改善笔记的样式或功能。

    用户在该标签下分享代码片段时需在帖子标题前添加 [css] [js] 用于区分代码片段类型。

    285 引用 • 1988 回帖
  • webpack

    webpack 是一个用于前端开发的模块加载器和打包工具,它能把各种资源,例如 JS、CSS(less/sass)、图片等都作为模块来使用和处理。

    43 引用 • 130 回帖 • 259 关注
  • WebComponents

    Web Components 是 W3C 定义的标准,它给了前端开发者扩展浏览器标签的能力,可以方便地定制可复用组件,更好的进行模块化开发,解放了前端开发者的生产力。

    1 引用 • 17 关注
  • Mac

    Mac 是苹果公司自 1984 年起以“Macintosh”开始开发的个人消费型计算机,如:iMac、Mac mini、Macbook Air、Macbook Pro、Macbook、Mac Pro 等计算机。

    168 引用 • 598 回帖
  • 30Seconds

    📙 前端知识精选集,包含 HTML、CSS、JavaScript、React、Node、安全等方面,每天仅需 30 秒。

    • 精选常见面试题,帮助您准备下一次面试
    • 精选常见交互,帮助您拥有简洁酷炫的站点
    • 精选有用的 React 片段,帮助你获取最佳实践
    • 精选常见代码集,帮助您提高打码效率
    • 整理前端界的最新资讯,邀您一同探索新世界
    488 引用 • 384 回帖
  • ReactiveX

    ReactiveX 是一个专注于异步编程与控制可观察数据(或者事件)流的 API。它组合了观察者模式,迭代器模式和函数式编程的优秀思想。

    1 引用 • 2 回帖 • 193 关注
  • GitHub

    GitHub 于 2008 年上线,目前,除了 Git 代码仓库托管及基本的 Web 管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。正因为这些功能所提供的便利,又经过长期的积累,GitHub 的用户活跃度很高,在开源世界里享有深远的声望,并形成了社交化编程文化(Social Coding)。

    213 引用 • 2044 回帖
  • Webswing

    Webswing 是一个能将任何 Swing 应用通过纯 HTML5 运行在浏览器中的 Web 服务器,详细介绍请看 将 Java Swing 应用变成 Web 应用

    1 引用 • 15 回帖 • 669 关注
  • Sillot

    Insights(注意当前设置 master 为默认分支)

    汐洛彖夲肜矩阵(Sillot T☳Converbenk Matrix),致力于服务智慧新彖乄,具有彖乄驱动、极致优雅、开发者友好的特点。其中汐洛绞架(Sillot-Gibbet)基于自思源笔记(siyuan-note),前身是思源笔记汐洛版(更早是思源笔记汐洛分支),是智慧新录乄终端(多端融合,移动端优先)。

    主仓库地址:Hi-Windom/Sillot

    文档地址:sillot.db.sc.cn

    注意事项:

    1. ⚠️ 汐洛仍在早期开发阶段,尚不稳定
    2. ⚠️ 汐洛并非面向普通用户设计,使用前请了解风险
    3. ⚠️ 汐洛绞架基于思源笔记,开发者尽最大努力与思源笔记保持兼容,但无法实现 100% 兼容
    29 引用 • 25 回帖 • 152 关注
  • 学习

    “梦想从学习开始,事业从实践起步” —— 习近平

    176 引用 • 544 回帖
  • RIP

    愿逝者安息!

    8 引用 • 92 回帖 • 429 关注
  • 资讯

    资讯是用户因为及时地获得它并利用它而能够在相对短的时间内给自己带来价值的信息,资讯有时效性和地域性。

    56 引用 • 85 回帖 • 1 关注
  • HHKB

    HHKB 是富士通的 Happy Hacking 系列电容键盘。电容键盘即无接点静电电容式键盘(Capacitive Keyboard)。

    5 引用 • 74 回帖 • 548 关注
  • 友情链接

    确认过眼神后的灵魂连接,站在链在!

    25 引用 • 373 回帖 • 4 关注
  • API

    应用程序编程接口(Application Programming Interface)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

    79 引用 • 431 回帖
  • Facebook

    Facebook 是一个联系朋友的社交工具。大家可以通过它和朋友、同事、同学以及周围的人保持互动交流,分享无限上传的图片,发布链接和视频,更可以增进对朋友的了解。

    4 引用 • 15 回帖 • 443 关注
  • DNSPod

    DNSPod 建立于 2006 年 3 月份,是一款免费智能 DNS 产品。 DNSPod 可以为同时有电信、网通、教育网服务器的网站提供智能的解析,让电信用户访问电信的服务器,网通的用户访问网通的服务器,教育网的用户访问教育网的服务器,达到互联互通的效果。

    6 引用 • 26 回帖 • 548 关注
  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    28446 引用 • 119790 回帖