

我们设置Shadow的Flip V也就是垂直翻转为true,y轴的scale(缩放)设为0.5。用Modulate设置一个较暗的颜色。

为Player设置代码如下:
extends Spritevar speed = 200 # 移动的速度var jump_height = 30 # 跳跃高度var gravity = 10 # 重力加速度var is_jumping = false # 是否正在跳跃var old_pos # 记录跳跃前的位置onready var shadow = $"../Shadow"func _process(delta):if is_jumping:if position.y + gravity < old_pos:position.y += gravityelse:position.y = old_posis_jumping = falsevar dir = Input.get_vector("ui_left","ui_right","ui_up","ui_down")position += dir * speed * deltashadow.position += dir * speed * delta # 让影子跟随移动if Input.is_action_just_pressed("ui_accept"):old_pos = position.yposition.y -= jump_heightis_jumping = true
此时,影子会跟随玩家进行移动,但是在跳跃时又待在原地不动。
基础的效果就实现了,接下来就是细节调整。为了表现“真实”的的跳跃与影子效果,我们要将跳跃高度与影子的大小和透明度做反比。
最终代码
extends Spritevar speed = 200 # 移动的速度var jump_height = 50 # 跳跃高度var gravity = 50 # 重力加速度var is_jumping = false # 是否正在跳跃var old_pos # 记录跳跃前的位置var old_shadow_scaleonready var shadow = $"../Shadow"func _process(delta):if is_jumping:if position.y + gravity * delta < old_pos:position.y += gravity * deltaprint(shadow.scale + old_shadow_scale * 0.1,"\n",old_shadow_scale)if shadow.scale + old_shadow_scale * 0.1 * delta < old_shadow_scale:shadow.scale = shadow.scale + old_shadow_scale * 0.1 * deltashadow.modulate.a += 0.1 * deltaelse:position.y = old_posis_jumping = falseshadow.scale = old_shadow_scale # 影子瞬间缩放为原来的大小shadow.modulate.a = 1 # 影子的透明度变为100%var dir = Input.get_vector("ui_left","ui_right","ui_up","ui_down")position += dir * speed * deltashadow.position += dir * speed * delta # 让影子跟随移动if Input.is_action_just_pressed("ui_accept"):old_pos = position.yposition.y -= jump_heightold_shadow_scale = shadow.scaleshadow.scale -= shadow.scale * 0.2 # 影子瞬间缩放为原来的一半大小shadow.modulate.a = 0.2 # 影子的透明度变为50%is_jumping = true
运行效果

