image.pngimage.png
我们设置Shadow的Flip V也就是垂直翻转为true,y轴的scale(缩放)设为0.5。用Modulate设置一个较暗的颜色。
image.pngimage.png
为Player设置代码如下:

  1. extends Sprite
  2. var speed = 200 # 移动的速度
  3. var jump_height = 30 # 跳跃高度
  4. var gravity = 10 # 重力加速度
  5. var is_jumping = false # 是否正在跳跃
  6. var old_pos # 记录跳跃前的位置
  7. onready var shadow = $"../Shadow"
  8. func _process(delta):
  9. if is_jumping:
  10. if position.y + gravity < old_pos:
  11. position.y += gravity
  12. else:
  13. position.y = old_pos
  14. is_jumping = false
  15. var dir = Input.get_vector(
  16. "ui_left",
  17. "ui_right",
  18. "ui_up",
  19. "ui_down"
  20. )
  21. position += dir * speed * delta
  22. shadow.position += dir * speed * delta # 让影子跟随移动
  23. if Input.is_action_just_pressed("ui_accept"):
  24. old_pos = position.y
  25. position.y -= jump_height
  26. is_jumping = true

此时,影子会跟随玩家进行移动,但是在跳跃时又待在原地不动。
基础的效果就实现了,接下来就是细节调整。为了表现“真实”的的跳跃与影子效果,我们要将跳跃高度与影子的大小和透明度做反比。

最终代码

  1. extends Sprite
  2. var speed = 200 # 移动的速度
  3. var jump_height = 50 # 跳跃高度
  4. var gravity = 50 # 重力加速度
  5. var is_jumping = false # 是否正在跳跃
  6. var old_pos # 记录跳跃前的位置
  7. var old_shadow_scale
  8. onready var shadow = $"../Shadow"
  9. func _process(delta):
  10. if is_jumping:
  11. if position.y + gravity * delta < old_pos:
  12. position.y += gravity * delta
  13. print(shadow.scale + old_shadow_scale * 0.1,"\n",old_shadow_scale)
  14. if shadow.scale + old_shadow_scale * 0.1 * delta < old_shadow_scale:
  15. shadow.scale = shadow.scale + old_shadow_scale * 0.1 * delta
  16. shadow.modulate.a += 0.1 * delta
  17. else:
  18. position.y = old_pos
  19. is_jumping = false
  20. shadow.scale = old_shadow_scale # 影子瞬间缩放为原来的大小
  21. shadow.modulate.a = 1 # 影子的透明度变为100%
  22. var dir = Input.get_vector(
  23. "ui_left",
  24. "ui_right",
  25. "ui_up",
  26. "ui_down"
  27. )
  28. position += dir * speed * delta
  29. shadow.position += dir * speed * delta # 让影子跟随移动
  30. if Input.is_action_just_pressed("ui_accept"):
  31. old_pos = position.y
  32. position.y -= jump_height
  33. old_shadow_scale = shadow.scale
  34. shadow.scale -= shadow.scale * 0.2 # 影子瞬间缩放为原来的一半大小
  35. shadow.modulate.a = 0.2 # 影子的透明度变为50%
  36. is_jumping = true

运行效果

基础动画示例2.gif