输入系统

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

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

输入系统代码已经 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 和建筑),还有存档点,还有这么多,啊西吧

相关帖子

回帖

欢迎来到这里!

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

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

推荐标签 标签

  • HHKB

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

    5 引用 • 74 回帖 • 521 关注
  • Openfire

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

    6 引用 • 7 回帖 • 122 关注
  • jsoup

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    6 引用 • 1 回帖 • 493 关注
  • 周末

    星期六到星期天晚,实行五天工作制后,指每周的最后两天。再过几年可能就是三天了。

    14 引用 • 297 回帖 • 1 关注
  • 友情链接

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

    24 引用 • 373 回帖
  • 服务

    提供一个服务绝不仅仅是简单的把硬件和软件累加在一起,它包括了服务的可靠性、服务的标准化、以及对服务的监控、维护、技术支持等。

    41 引用 • 24 回帖
  • Notion

    Notion - The all-in-one workspace for your notes, tasks, wikis, and databases.

    10 引用 • 77 回帖
  • Google

    Google(Google Inc.,NASDAQ:GOOG)是一家美国上市公司(公有股份公司),于 1998 年 9 月 7 日以私有股份公司的形式创立,设计并管理一个互联网搜索引擎。Google 公司的总部称作“Googleplex”,它位于加利福尼亚山景城。Google 目前被公认为是全球规模最大的搜索引擎,它提供了简单易用的免费服务。不作恶(Don't be evil)是谷歌公司的一项非正式的公司口号。

    49 引用 • 192 回帖 • 1 关注
  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    186 引用 • 1021 回帖
  • 正则表达式

    正则表达式(Regular Expression)使用单个字符串来描述、匹配一系列遵循某个句法规则的字符串。

    31 引用 • 94 回帖
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    554 引用 • 675 回帖
  • 安装

    你若安好,便是晴天。

    132 引用 • 1184 回帖
  • 小说

    小说是以刻画人物形象为中心,通过完整的故事情节和环境描写来反映社会生活的文学体裁。

    32 引用 • 108 回帖
  • CSS

    CSS(Cascading Style Sheet)“层叠样式表”是用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。

    198 引用 • 543 回帖
  • HTML

    HTML5 是 HTML 下一个的主要修订版本,现在仍处于发展阶段。广义论及 HTML5 时,实际指的是包括 HTML、CSS 和 JavaScript 在内的一套技术组合。

    108 引用 • 295 回帖 • 2 关注
  • Ubuntu

    Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的 Linux 操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词,意思是“人性”、“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想。Ubuntu 的目标在于为一般用户提供一个最新的、同时又相当稳定的主要由自由软件构建而成的操作系统。

    127 引用 • 169 回帖
  • 服务器

    服务器,也称伺服器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。

    125 引用 • 585 回帖 • 2 关注
  • QQ

    1999 年 2 月腾讯正式推出“腾讯 QQ”,在线用户由 1999 年的 2 人(马化腾和张志东)到现在已经发展到上亿用户了,在线人数超过一亿,是目前使用最广泛的聊天软件之一。

    45 引用 • 557 回帖
  • RabbitMQ

    RabbitMQ 是一个开源的 AMQP 实现,服务器端用 Erlang 语言编写,支持多种语言客户端,如:Python、Ruby、.NET、Java、C、PHP、ActionScript 等。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

    49 引用 • 60 回帖 • 350 关注
  • 分享

    有什么新发现就分享给大家吧!

    248 引用 • 1794 回帖
  • SendCloud

    SendCloud 由搜狐武汉研发中心孵化的项目,是致力于为开发者提供高质量的触发邮件服务的云端邮件发送平台,为开发者提供便利的 API 接口来调用服务,让邮件准确迅速到达用户收件箱并获得强大的追踪数据。

    2 引用 • 8 回帖 • 507 关注
  • Ant-Design

    Ant Design 是服务于企业级产品的设计体系,基于确定和自然的设计价值观上的模块化解决方案,让设计者和开发者专注于更好的用户体验。

    17 引用 • 23 回帖 • 1 关注
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    167 引用 • 408 回帖 • 489 关注
  • Eclipse

    Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。

    76 引用 • 258 回帖 • 625 关注
  • 开源

    Open Source, Open Mind, Open Sight, Open Future!

    413 引用 • 3591 回帖
  • Hexo

    Hexo 是一款快速、简洁且高效的博客框架,使用 Node.js 编写。

    22 引用 • 148 回帖 • 6 关注
  • 快应用

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

    15 引用 • 127 回帖 • 5 关注