【问题标题】:Play sound in Godot when a kinematicbody2D collides with a tile map?当 kinematicbody2D 与瓦片地图碰撞时在 Godot 中播放声音?
【发布时间】:2021-08-08 13:17:08
【问题描述】:

我的游戏中的玩家是一个 kinematicbody2D,我希望在它与瓦片地图碰撞时播放音效。我的播放器使用move_and_slide() 与瓦片地图碰撞。

当玩家点击地图时如何触发声音播放?我只希望在播放器最初与瓦片地图碰撞后播放声音;如果玩家坐在地板上,它不应该一遍又一遍地播放。

我知道如何通过 StreamAudioPlayer 使用声音,我只需要在我想要播放声音时触发声音播放。

【问题讨论】:

  • 您只想在播放器落地时播放声音吗?还是你想做别的事?
  • 落地、撞墙或撞天花板。

标签: godot


【解决方案1】:

move_and_slide 之前和之后跟踪is_on_floor 的更简单方法。

例如:

var was_on_floor = is_on_floor()
move_and_slide(velocity, Vector2.UP)
if is_on_floor() and not was_on_floor:
    $sound.play()

每当您调用move_and_slide 时,Godot 都会更新您从is_on_flooris_on_wallis_on_ceiling 获得的值。要知道什么是墙壁、地板或天花板,Godot 使用您传递的向量作为第二个参数(如果您传递Vector2.ZERO,那么一切都是墙壁)。


如果您只想检查它是否与某物发生碰撞,您可以在move_and_slide 之后使用get_slide_count。如果没有冲突,函数get_slide_count 应该给你0

if get_slide_count() > 0:
    $sound.play()

或者您可以检查move_and_slide 返回的速度是否与您通过的速度不同。意味着它确实发生了碰撞(或滑动)。

var old_velocity = velocity
velocity = move_and_slide(velocity, Vector2.UP)
if velocity != old_velocity:
    $sound.play()

您也可以使用get_slide_collision,它会为您提供KinematicCollision2D 对象:

for i in get_slide_count():
    var collision = get_slide_collision(i)
    print("Collided with: ", collision.collider.name)

这会让你识别KinematicBody2D与什么碰撞,然后你可以相应地选择一个声音。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-29
    • 2015-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    相关资源
    最近更新 更多