当前位置: 首页 > news >正文

[godot] 采用状态机时,如何处理攻击时移动?如“冲撞”

这里以‘史莱姆撞击’为例子,将‘空中跃进’定义为伤害帧。(见下图)

先梳理流程:a.史莱姆原地蓄力(起跳准备)--->b.跳起并移动一段距离(空中跃进)--->c.落地调整

    当状态机进入‘攻击状态’时,在enter()中设置起跳速度,并播放‘a动画’。a动画播放期间,do()函数什么也不做。

   a动画结束后,do()函数中开始执行move_and_slide()。

b动画不要用play()播放,而是手动控制动画帧:

                在上升过程中,设置动画为“空中跃进-第1帧”

                在下降过程中,设置动画为“空中跃进-第2帧”

    当史莱姆落回地板时(is_on_floor),播放c动画,不再执行move_and_slide()。

c动画结束后,退出攻击状态,转到移动/待机状态

#== gdScript
#== 攻击状态
var is_jump = 0 # 是否处于空中跳跃阶段
var to_end = 0 # 是否处于落地调整阶段
func enter():print("进入攻击状态")# 设置起跳速度chara.velocity.x = $"../Run".direct.x*40chara.velocity.y=-300$"../../AnimatedSprite2D".play("攻击准备")
func do():# 空中移动过程if is_jump==1:chara.velocity.y+=chara.gravity*0.01chara.move_and_slide()## 可以在这里判断是否触碰到玩家并造成伤害# 空中移动动画if chara.velocity.y>=0&&to_end==0:$"../../AnimatedSprite2D".frame=1 # 下降期间动画# 落地if chara.is_on_floor()&&to_end==0&&is_jump==1:is_jump=0 # 不再移动位置to_end=1 # 该if块只执行一次$"../../AnimatedSprite2D".play("攻击结束")	func exit():to_end=0 # 记得重置变量func _on_animated_sprite_2d_animation_finished():# 若开启了"动画循环",则不会触发finished信号if $"../../AnimatedSprite2D".animation=="攻击准备": is_jump=1 # 开始移动$"../../AnimatedSprite2D".animation="攻击过程"$"../../AnimatedSprite2D".frame=0 # 上升期间动画if $"../../AnimatedSprite2D".animation=="攻击结束":get_parent().change_state($"../Run") # 转移到移动状态

关键是对攻击进一步细分


http://www.mrgr.cn/news/4337.html

相关文章:

  • 【vue3】组件通信
  • 【大模型理论篇】关于LLaMA 3.1 405B以及小模型的崛起
  • Nginx: 配置项之server_name指令用法梳理
  • 什么是零拷贝?以及数据在内存中的流动途径
  • 手撕⼆叉树——堆
  • (2024)vue2+vue3学习笔记(持续更新)
  • 【精选】基于Python大型购物商城系统(京东购物商城,淘宝购物商城,拼多多购物商城爬虫系统)
  • H5,防止 h5 无限 debugger
  • 转转系统源码开发
  • 关于NetTopologySuite这个C#库的学习
  • 轮播图制作思路
  • 黑神话悟空苹果电脑可以玩吗?MacBook玩黑神话悟空游戏攻略 crossover软件永久激活码分享 crossover免费使用教程
  • 稳压二极管、肖特基二极管、TVS管、静电ESD管的区别
  • 数据结构—— 再探二叉树
  • ES高级查询Query DSL查询详解、term术语级别查询、全文检索、highlight高亮
  • 简单笔记--Qt控件的重要属性--QWidget
  • 大数据应用整理
  • 数据结构中的双向链表
  • 深入理解逻辑回归
  • JAVA学习-练习试用Java实现“路径交叉”