首页 > 其他分享 >5-1. 滑墙及蹬墙跳的实现

5-1. 滑墙及蹬墙跳的实现

时间:2024-02-26 20:55:40浏览次数:24  
标签:动画 角色 滑墙 实现 PlayerController wallJump onWall

滑墙的实现方式

动画

使用滑墙图片制作滑墙动画,只有一帧的动画

动画状态机中,增加了 onWall 这个 bool 变量,以及 blueWallSlide 这个状态

当 onWall == true 时,从 Jump 立即切换到 blueWallSlide

当 onWall == false && isGround == true 时,从 blueWallSlide 立即切换到 blueJumpLand

因为贴墙跳的时候,可能会立马进入 blueWallSlide 状态,所以从 Any State -> Jump 的条件变更为 isGround == false && onWall == false

这里 onWall 只有当 角色贴着某个方向的墙面,并且给这个方向施加力,并且 y 方向的速度不为负数时,才算 onWall

代码实现

PlayerController.Move

首先必须要允许角色在空中能够左右移动,否则滑墙是实现不了的

我自己做的时候,角色不能在空中左右移动的话,角色很快就会掉下来,我也不是很明白,明明没有 X 轴的速度,为什么角色会慢慢远离墙面

PlayerController.CheckState

人物在下滑的时候,还是固定一个下滑速度,不要像老师那样把 rb.velocity 直接减半,他的环境重力系数是4倍,所以没问题,我的环境重力系数是1倍,一直减半某个时间会出现速度变零,导致压根滑不动了

PhysicsCheck.Check

onWall 的判断条件就和动画状态机最后说的那样,人碰到哪面墙,并且往那个方向施加力,并且有个向下的速度,才算在墙上

需要注意,PhysicCheck 是通用代码,而 playerController 只有在 Player 身上才有,所以判断 onWall 之前必须要确保 isPlayer

此外滑墙时,角色的地面监测高度应该要比平时更高一点,这样角色从墙上下来的时候才不会导致刚体有 Y 轴上的移动

可以看到滑墙时的地面监测需要高半个圈,否则刚体落地时会有半个圈的位移

PlayerAnimation

蹬墙跳

蹬墙跳不需要动画,只需要代码

蹬墙跳的意思是,当玩家在墙上滑动的时候,按跳跃键就能朝反方向进行跳跃,并且能越跳越高

PlayerController.Jump

在墙上按跳跃键,就会进入到 wallJump = true,然后施加一个 左上 或 右上 的力

为什么需要 wallJump 这个变量呢?因为我们之前开放了允许角色在空中移动,需要 wallJump 暂时禁用角色在空中移动,否则角色刚一离开墙面就会因为空中移动的力又立马贴回到墙面

PlayerController.Move

通过 wallJump 变量,来限制角色刚蹬墙跳,立马又贴回墙面

PlayerController.CheckState

还要注意,我们蹬墙跳的时候,onWall 变量还是为 true 的,那么每次 Update 都会强行把向下的速度改成一个固定值,这样就无法实现向上蹬墙跳了,所以 wallJump 时不要改速度

并且在最后,如果当前是蹬墙跳,并且 y 轴速度变成负数了(也就是开始下落了),也就是说此时角色应该离开墙面很远了。此时需要把 wallJump 改为 false,允许角色可以在空中左右移动

项目相关代码

代码仓库:https://gitee.com/nbda1121440/2DAdventure.git

标签:20240226_2001

标签:动画,角色,滑墙,实现,PlayerController,wallJump,onWall
From: https://www.cnblogs.com/hellozjf/p/18035142

相关文章

  • Qt Virtual Keyboard实现自适应悬浮键盘(多种方法详细记录)
    项目需求实现悬浮键盘,点击QLineEdit或QTextEdit自动弹出自适应悬浮键盘,尝试了以下几种方法后选择了修改QTVirtualKeyboard源码。在这里把其他方法/想法也列出来做一下记录。项目环境:QT5.13.2VS2017方法1:调用windows自带系统软件盘介绍windows自带软键盘分为......
  • pd.ExcelWriter 实现数据写入不同sheet
    pd.ExcelWriter将数据写入不同sheet当结合for循环使用时,需注意放在for循环前面以下写法,仅生成一个sheet,原因在于pd.ExcelWriter的mode默认是w,每次for循环写入数据都会对原有的数据进行覆盖,最终只会生成一个sheet。importpandasaspddf1=pd.DataFrame([["AAA","BBB"]],......
  • Python + Apollo 实现配置中心
    --coding:utf-8--importjsonimportosimportthreadingimporttimefromdatetimeimportdatetime,timedeltafromtypingimportOptionalimportrequestsimportLogConfigasloggingclassApolloClient(object):definit(self,app_id,cluster='defaul......
  • SpringBoot/Java中OCR实现,集成Tess4J实现图片文字识别
    场景TesseractTesseract是一个开源的光学字符识别(OCR)引擎,它可以将图像中的文字转换为计算机可读的文本。支持多种语言和书面语言,并且可以在命令行中执行。它是一个流行的开源OCR工具,可以在许多不同的操作系统上运行。https://github.com/tesseract-ocr/tesseractTess4JTess4......
  • 简洁高效的实现多个 Enum 自由转换
    一:背景1.讲故事前段时间和同事负责一个项目的两个业务模块,可能大家缺少沟通,导致本该定义一个Enum的地方结果我俩各自定义了一个,导致后面这两个Enum进行对接就烦了,为了方便理解,也不想让大家看这崴脚的英文拼写,我就拿银行举例吧。A同事定义的枚举publicenumBa......
  • GB28181视频监控平台EasyCVR如何通过配置实现级联不响应下级平台的检索消息?
    AI视频智能分析/视频监控管理平台EasyCVR能在复杂的网络环境中(专网、内网、局域网、广域网、公网等)将前端海量的设备进行统一集中接入与视频汇聚管理,平台支持设备通过4G、5G、WIFI、有线等方式进行视频流的快捷接入和传输。平台能将接入的视频流进行汇聚、转码与多格式分发,可分发......
  • 面试官:限流的实现方式有哪些?
    限流是指在各种应用场景中,通过技术和策略手段对数据流量、请求频率或资源消耗进行有计划的限制,以避免系统负载过高、性能下降甚至崩溃的情况发生。限流的目标在于维护系统的稳定性和可用性,并确保服务质量。使用限流的好处有以下几个:保护系统稳定性:过多的并发请求可能导致服务......
  • QT多线程实现-----问题解决及实现方式
    一、概述恰巧正在做一个多线程通信的项目,具体功能是与下位机交互和文件发送,在子线程中实现命令发送和文件传输。使用movetothread主要遇到以下几个问题:1.Socketnotifierscannotbeenabledordisabledfromanotherthread。2.子线程完成文件传输,发送信号......
  • 利用IO复用技术Epoll与线程池实现多线程的Reactor高并发模型
    Reactor模型是一种常见的高并发设计模式,特别是在网络编程中。在Reactor模型中,一个或多个输入同时传递给一个或多个服务处理程序。服务处理程序对输入进行处理,然后将结果传递给相应的输出处理程序。使用IO复用技术(如epoll)和线程池,可以实现多线程的Reactor高并发模型。下面是一个简......
  • 利用正则与状态机解析HTTP请求报文,实现处理静态资源的请求
    要使用正则和状态机来解析HTTP请求报文,首先需要理解HTTP请求报文的基本结构。一个典型的HTTP请求报文如下:GET/index.htmlHTTP/1.1Host:www.example.comUser-Agent:Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/58.0.3029.110......