【问题标题】:How to make a pygame sound only play once, then stop until the requirements are met again?如何使pygame声音只播放一次,然后停止直到再次满足要求?
【发布时间】:2019-12-18 06:10:50
【问题描述】:

我正在制作一个精灵收集游戏,我收集精灵并计算分数。如果我撞到墙上,它会发出撞墙的声音。撞墙的时候,我只希望声音播放一次,直到再次满足要求时再播放。这是我与墙壁发生声音碰撞的代码。

def wallCollide():
    if player.rect.x == 1 and player.rect.y < 479:
        bumpWall.play()
    if player.rect.y == 1 and player.rect.x < 479:
        bumpWall.play()
    if player.rect.x == 478 and player.rect.y < 479:
        bumpWall.play()
    if player.rect.y == 478 and player.rect.x < 479:
        bumpWall.play()

【问题讨论】:

  • 也许您应该在if 之前设置play = False,并在if 内部设置play = True,然后在检查完所有碰撞后使用它来播放sond。或者也许你应该使用player.rect.coliderect(list_with_many_rect) 在一行中检查所有内容。
  • 或者你应该将玩家向后移动一点,这样它在碰撞后就不会碰到墙壁。如果您不向后移动,那么它会一直碰撞。
  • 或者你也应该检查一下速度。如果你碰了墙但你不动(速度是0)那么不要播放声音。

标签: python python-3.x pygame


【解决方案1】:

快速破解方法是将玩家移动(传送)到距离墙壁 2~5 像素的地方,在玩家撞墙的同一帧。

但如果您希望玩家留在墙内和/或在墙附近滑动,那么您需要更强大的解决方案。使用状态机:

PL_STATE_WITHIN_BOUNDS = 1
PL_STATE_JUST_HIT_THE_WALL = 2
PL_STATE_COLLIDING_WITH_THE_WALL = 3

def calc_next_player_state(player, pl_state):
    # Convert your `wallCollide` to return bool:
    # - False when within bounds
    # - True when colliding with the wall
    if is_colliding_with_the_wall(player):
        if pl_state == PL_STATE_WITHIN_BOUNDS:
            return PL_STATE_JUST_HIT_THE_WALL
        else:
            return PL_STATE_COLLIDING_WITH_THE_WALL
    else:
        return PL_STATE_WITHIN_BOUNDS

pl_state = PL_STATE_WITHIN_BOUNDS

while True:  # Game's main loop
    # ...

    pl_state = calc_next_player_state(player, pl_state)
    if pl_state == PL_STATE_JUST_HIT_THE_WALL:
        bump_wall.play()

    # ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多