111
社区成员




这个作业属于哪个课程 | 2401_CS_SE_FZU |
---|---|
这个作业要求在哪里 | 软件工程实践总结&个人技术博客 |
这个作业的目标 | 个人技术总结 |
其他参考文献 | 《构建之法》 |
Godot中的AnimatedSprite节点用于播放多个纹理作为动画帧的精灵动画。用于2D游戏中的角色动作、物体动画,以及背景动画等场景实现。学习该技术可以实现所需要的动画效果。技术难点在于精确控制动画帧和处理复杂的动画逻辑。
介绍
这是主角的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节点?
这需要选中AnimatedSprite2D节点,为想实现的动作,添加所需的动画帧即可。
主角的操作
需要用到上面讲到的animationTree和animationPlayer节点,主要是animationTree节点,在其中可以添加想要的动作,而每个动作是有包含对应的朝向的,当通过键盘进行wsad方向移动时。
而实现这些需要将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)
同样是使用的AnimatedSprite节点,由于背景是固定所以其父结点选用了staticbody2d,但这不影响动画的实现,因为动画需要自动播放,所以仅需要选择自动加载功能配合循环播放功能即可,无需在脚本中添加函数控制。
问题:使用AnimatedSprite节点如何与animationPlayer节点建立联系
由于使用普通的Sprite节点可以直接添加animationPlayer和animationTree节点进行人物动画的实现,因为animationplayer就可以选用图片的不同帧来做动画效果
但是这个功能其实和AnimatedSprite节点的添加帧做动画的功能重合了,但是在原有的Godot引擎上,如果只在AnimatedSprite节点添加动画是无法实现将其也同步加载到animationPlayer节点的。而animationTree节点的使用必须用到animationPlayer节点,否则无法执行人物复杂动画的实现。
解决:
需要使用插件,这个插件功能是将AnimatedSprite2D节点下的所有动画导入到AnimationPlay节点下。
第一步单击编辑器中部的AssetLib按钮,在搜索框中输入anima,然后在列表中找到AnimatedSpritetoAnimationPlayerConvertor4.0。
下载完成后在AnimationPlay节点检查器的下方就会出现可进行导入的选项
选择文件夹中的所需要的AnimatedSprite2D节点,然后点击导入,这样子就解决了问题。当然具体方法我也是从社区的一篇大佬的博客学的。
角色动画以及背景动画的实现属于游戏的可玩性的核心,没有动画效果,就没有游戏的动感与美感。快跟我来一起使用AnimatedSprite2D节点让我们的游戏画面动起来吧!这样子游戏才有灵魂,玩起来才会有趣。