输入系统

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

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

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

相关帖子

回帖

欢迎来到这里!

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

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

推荐标签 标签

  • 域名

    域名(Domain Name),简称域名、网域,是由一串用点分隔的名字组成的 Internet 上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。

    43 引用 • 208 回帖 • 1 关注
  • Oracle

    Oracle(甲骨文)公司,全称甲骨文股份有限公司(甲骨文软件系统有限公司),是全球最大的企业级软件公司,总部位于美国加利福尼亚州的红木滩。1989 年正式进入中国市场。2013 年,甲骨文已超越 IBM,成为继 Microsoft 后全球第二大软件公司。

    107 引用 • 127 回帖 • 336 关注
  • 音乐

    你听到信仰的声音了么?

    62 引用 • 512 回帖
  • Gzip

    gzip (GNU zip)是 GNU 自由软件的文件压缩程序。我们在 Linux 中经常会用到后缀为 .gz 的文件,它们就是 Gzip 格式的。现今已经成为互联网上使用非常普遍的一种数据压缩格式,或者说一种文件格式。

    9 引用 • 12 回帖 • 166 关注
  • Sym

    Sym 是一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)系统平台。

    下一代的社区系统,为未来而构建

    524 引用 • 4601 回帖 • 706 关注
  • Log4j

    Log4j 是 Apache 开源的一款使用广泛的 Java 日志组件。

    20 引用 • 18 回帖 • 28 关注
  • Dubbo

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是 [阿里巴巴] SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

    60 引用 • 82 回帖 • 612 关注
  • 资讯

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

    56 引用 • 85 回帖
  • JetBrains

    JetBrains 是一家捷克的软件开发公司,该公司位于捷克的布拉格,并在俄国的圣彼得堡及美国麻州波士顿都设有办公室,该公司最为人所熟知的产品是 Java 编程语言开发撰写时所用的集成开发环境:IntelliJ IDEA

    18 引用 • 54 回帖 • 2 关注
  • wolai

    我来 wolai:不仅仅是未来的云端笔记!

    2 引用 • 14 回帖 • 4 关注
  • PWL

    组织简介

    用爱发电 (Programming With Love) 是一个以开源精神为核心的民间开源爱好者技术组织,“用爱发电”象征开源与贡献精神,加入组织,代表你将遵守组织的“个人开源爱好者”的各项条款。申请加入:用爱发电组织邀请帖
    用爱发电组织官网:https://programmingwithlove.stackoverflow.wiki/

    用爱发电组织的核心驱动力:

    • 遵守开源守则,体现开源&贡献精神:以分享为目的,拒绝非法牟利。
    • 自我保护:使用适当的 License 保护自己的原创作品。
    • 尊重他人:不以各种理由、各种漏洞进行未经允许的抄袭、散播、洩露;以礼相待,尊重所有对社区做出贡献的开发者;通过他人的分享习得知识,要留下足迹,表示感谢。
    • 热爱编程、热爱学习:加入组织,热爱编程是首当其要的。我们欢迎热爱讨论、分享、提问的朋友,也同样欢迎默默成就的朋友。
    • 倾听:正确并恳切对待、处理问题与建议,及时修复开源项目的 Bug ,及时与反馈者沟通。不抬杠、不无视、不辱骂。
    • 平视:不诋毁、轻视、嘲讽其他开发者,主动提出建议、施以帮助,以和谐为本。只要他人肯努力,你也可能会被昔日小看的人所超越,所以请保持谦虚。
    • 乐观且活跃:你的努力决定了你的高度。不要放弃,多年后回头俯瞰,才会发现自己已经成就往日所仰望的水平。积极地将项目开源,帮助他人学习、改进,自己也会获得相应的提升、成就与成就感。
    1 引用 • 487 回帖 • 4 关注
  • PostgreSQL

    PostgreSQL 是一款功能强大的企业级数据库系统,在 BSD 开源许可证下发布。

    22 引用 • 22 回帖 • 2 关注
  • 浅吟主题

    Jeffrey Chen 制作的思源笔记主题,项目仓库:https://github.com/TCOTC/Whisper

    1 引用 • 28 回帖 • 1 关注
  • Rust

    Rust 是一门赋予每个人构建可靠且高效软件能力的语言。Rust 由 Mozilla 开发,最早发布于 2014 年 9 月。

    58 引用 • 22 回帖 • 5 关注
  • WebClipper

    Web Clipper 是一款浏览器剪藏扩展,它可以帮助你把网页内容剪藏到本地。

    3 引用 • 9 回帖 • 1 关注
  • 七牛云

    七牛云是国内领先的企业级公有云服务商,致力于打造以数据为核心的场景化 PaaS 服务。围绕富媒体场景,七牛先后推出了对象存储,融合 CDN 加速,数据通用处理,内容反垃圾服务,以及直播云服务等。

    28 引用 • 226 回帖 • 128 关注
  • 百度

    百度(Nasdaq:BIDU)是全球最大的中文搜索引擎、最大的中文网站。2000 年 1 月由李彦宏创立于北京中关村,致力于向人们提供“简单,可依赖”的信息获取方式。“百度”二字源于中国宋朝词人辛弃疾的《青玉案·元夕》词句“众里寻他千百度”,象征着百度对中文信息检索技术的执著追求。

    63 引用 • 785 回帖 • 93 关注
  • 服务器

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

    125 引用 • 585 回帖
  • SpaceVim

    SpaceVim 是一个社区驱动的模块化 vim/neovim 配置集合,以模块的方式组织管理插件以
    及相关配置,为不同的语言开发量身定制了相关的开发模块,该模块提供代码自动补全,
    语法检查、格式化、调试、REPL 等特性。用户仅需载入相关语言的模块即可得到一个开箱
    即用的 Vim-IDE。

    3 引用 • 31 回帖 • 114 关注
  • BookxNote

    BookxNote 是一款全新的电子书学习工具,助力您的学习与思考,让您的大脑更高效的记忆。

    笔记整理交给我,一心只读圣贤书。

    1 引用 • 1 回帖
  • Hadoop

    Hadoop 是由 Apache 基金会所开发的一个分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。

    89 引用 • 122 回帖 • 621 关注
  • 创业

    你比 99% 的人都优秀么?

    82 引用 • 1395 回帖
  • 禅道

    禅道是一款国产的开源项目管理软件,她的核心管理思想基于敏捷方法 scrum,内置了产品管理和项目管理,同时又根据国内研发现状补充了测试管理、计划管理、发布管理、文档管理、事务管理等功能,在一个软件中就可以将软件研发中的需求、任务、bug、用例、计划、发布等要素有序的跟踪管理起来,完整地覆盖了项目管理的核心流程。

    6 引用 • 15 回帖 • 10 关注
  • SOHO

    为成为自由职业者在家办公而努力吧!

    7 引用 • 55 回帖 • 4 关注
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    499 引用 • 1395 回帖 • 247 关注
  • 链书

    链书(Chainbook)是 B3log 开源社区提供的区块链纸质书交易平台,通过 B3T 实现共享激励与价值链。可将你的闲置书籍上架到链书,我们共同构建这个全新的交易平台,让闲置书籍继续发挥它的价值。

    链书社

    链书目前已经下线,也许以后还有计划重制上线。

    14 引用 • 257 回帖
  • Vditor

    Vditor 是一款浏览器端的 Markdown 编辑器,支持所见即所得、即时渲染(类似 Typora)和分屏预览模式。它使用 TypeScript 实现,支持原生 JavaScript、Vue、React 和 Angular。

    369 引用 • 1846 回帖 • 3 关注