我们设置Shadow的Flip V也就是垂直翻转为true,y轴的scale(缩放)设为0.5。用Modulate设置一个较暗的颜色。
为Player设置代码如下:
extends Sprite
var 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 += gravity
else:
position.y = old_pos
is_jumping = false
var dir = Input.get_vector(
"ui_left",
"ui_right",
"ui_up",
"ui_down"
)
position += dir * speed * delta
shadow.position += dir * speed * delta # 让影子跟随移动
if Input.is_action_just_pressed("ui_accept"):
old_pos = position.y
position.y -= jump_height
is_jumping = true
此时,影子会跟随玩家进行移动,但是在跳跃时又待在原地不动。
基础的效果就实现了,接下来就是细节调整。为了表现“真实”的的跳跃与影子效果,我们要将跳跃高度与影子的大小和透明度做反比。
最终代码
extends Sprite
var speed = 200 # 移动的速度
var jump_height = 50 # 跳跃高度
var gravity = 50 # 重力加速度
var is_jumping = false # 是否正在跳跃
var old_pos # 记录跳跃前的位置
var old_shadow_scale
onready var shadow = $"../Shadow"
func _process(delta):
if is_jumping:
if position.y + gravity * delta < old_pos:
position.y += gravity * delta
print(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 * delta
shadow.modulate.a += 0.1 * delta
else:
position.y = old_pos
is_jumping = false
shadow.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 * delta
shadow.position += dir * speed * delta # 让影子跟随移动
if Input.is_action_just_pressed("ui_accept"):
old_pos = position.y
position.y -= jump_height
old_shadow_scale = shadow.scale
shadow.scale -= shadow.scale * 0.2 # 影子瞬间缩放为原来的一半大小
shadow.modulate.a = 0.2 # 影子的透明度变为50%
is_jumping = true