个人技术总结——探索Godot中的动画效果实现

222200217张伟琦 2024-12-14 19:16:43
这个作业属于哪个课程2401_CS_SE_FZU
这个作业要求在哪里软件工程实践总结&个人技术博客
这个作业的目标个人技术总结
其他参考文献《构建之法》

目录

  • 探索Godot中的动画效果实现:AnimatedSprite节点的使用
  • 1 技术概述
  • 2 技术详述
  • 2.1 人物动作的实现
  • 2.2 场景背景中的动画
  • 2.3流程图
  • 3 技术使用中遇到的问题和解决过程
  • 总结
  • 参考博客、参考文档

探索Godot中的动画效果实现:AnimatedSprite节点的使用

1 技术概述

Godot中的AnimatedSprite节点用于播放多个纹理作为动画帧的精灵动画。用于2D游戏中的角色动作、物体动画,以及背景动画等场景实现。学习该技术可以实现所需要的动画效果。技术难点在于精确控制动画帧和处理复杂的动画逻辑。

2 技术详述

2.1 人物动作的实现

img

介绍

这是主角的2d场景,右方是主角节点的组成。使用CharacterBody2D作为根节点,其子节点包括有背包节点,交互气泡节点,而最重要的是AnimatedSprite2D节点以及和他配合的animationTree和animationPlayer节点,其实有了后面这两个节点就能实现动画的播放。那为什么还需要用到AnimatedSprite2D节点呢?如果仅仅是使用普通的sprite节点,只能导入同一张图片的不同帧动画。而AnimatedSprite2D节点不仅能添加不同图片的不同帧动画,以适应需求的变化。而且在脚本中如果仅仅是要实现简单的动作,比如npc的动作可以直接使用.play()函数。
例如以下函数表示 npc 人物执行‘run’的动画,然后跟随主角的位置运动,并根据运动方向进行角色朝向的调整。

    anima.play("run")
    var direction =  player.global_position-global_position
    if direction.x<0:
        anima.flip_h=true
    else:
        anima.flip_h = false
    global_position = global_position.move_toward(player.global_position,SPEED)

如何使用AnimatedSprite2D节点?

img

这需要选中AnimatedSprite2D节点,为想实现的动作,添加所需的动画帧即可。
主角的操作
需要用到上面讲到的animationTree和animationPlayer节点,主要是animationTree节点,在其中可以添加想要的动作,而每个动作是有包含对应的朝向的,当通过键盘进行wsad方向移动时。

img

而实现这些需要将animationTree的相关的路径作为函数的参数,在gd脚本文件中使用例如:anima_tree.set("parameters/Idle/blend_position",direction)这是加载动作,anima_tree["parameters/playback"].travel("Walk")这是运行动作。而其中的Input.is_action_just_pressed("attack")判断键盘是否输入的对应按键,命名与映射在godot中可以自定义编辑,比如这个以attack为命名的按键其实是键盘上的“J”,"ui_left","ui_right","ui_up", "ui_down"也就是控制移动方向的,经典的wsad按键或者键盘中的 上下左右箭头。具体使用如下图的,

func walk_state():
    var direction = Vector2.ZERO
    direction.x = Input.get_axis("ui_left", "ui_right")
    direction.y = Input.get_axis("ui_up", "ui_down")
    direction = direction.normalized()
    if direction:
        anima_tree.set("parameters/Idle/blend_position",direction)
        anima_tree.set("parameters/Walk/blend_position",direction)
        anima_tree.set("parameters/Attack/blend_position",direction)
        anima_tree.set("parameters/Pick/blend_position",direction)
        anima_tree["parameters/playback"].travel("Walk")
        velocity = direction * SPEED
        stick.setup_direction(direction)
    else:
        anima_tree["parameters/playback"].travel("Idle")
        velocity= Vector2.ZERO
    if Input.is_action_just_pressed("attack"):
        velocity= Vector2.ZERO
        state = ATTACK
    elif Input.is_action_just_pressed("pickUP"):
        velocity= Vector2.ZERO
        state = PICK
        if Globals.is_pickup && Globals.neverPick:
            Globals.pickArea.collect(inventory)

2.2 场景背景中的动画

img

同样是使用的AnimatedSprite节点,由于背景是固定所以其父结点选用了staticbody2d,但这不影响动画的实现,因为动画需要自动播放,所以仅需要选择自动加载功能配合循环播放功能即可,无需在脚本中添加函数控制。

img

2.3流程图

img

3 技术使用中遇到的问题和解决过程

问题:使用AnimatedSprite节点如何与animationPlayer节点建立联系

由于使用普通的Sprite节点可以直接添加animationPlayer和animationTree节点进行人物动画的实现,因为animationplayer就可以选用图片的不同帧来做动画效果

img

img

但是这个功能其实和AnimatedSprite节点的添加帧做动画的功能重合了,但是在原有的Godot引擎上,如果只在AnimatedSprite节点添加动画是无法实现将其也同步加载到animationPlayer节点的。而animationTree节点的使用必须用到animationPlayer节点,否则无法执行人物复杂动画的实现。

解决:
需要使用插件,这个插件功能是将AnimatedSprite2D节点下的所有动画导入到AnimationPlay节点下。
第一步单击编辑器中部的AssetLib按钮,在搜索框中输入anima,然后在列表中找到AnimatedSpritetoAnimationPlayerConvertor4.0。
下载完成后在AnimationPlay节点检查器的下方就会出现可进行导入的选项

img

选择文件夹中的所需要的AnimatedSprite2D节点,然后点击导入,这样子就解决了问题。当然具体方法我也是从社区的一篇大佬的博客学的。

总结

角色动画以及背景动画的实现属于游戏的可玩性的核心,没有动画效果,就没有游戏的动感与美感。快跟我来一起使用AnimatedSprite2D节点让我们的游戏画面动起来吧!这样子游戏才有灵魂,玩起来才会有趣。

参考博客、参考文档

...全文
3542 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

111

社区成员

发帖
与我相关
我的任务
社区描述
202401_CS_SE_FZU
软件工程 高校
社区管理员
  • FZU_SE_TeacherL
  • 林日臻
  • 防震水泥
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧