开发者社区> 问答> 正文

如何使pygame声音只播放一次,然后停止,直到再次满足要求?

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

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()

问题来源StackOverflow 地址:/questions/59386358/how-to-make-a-pygame-sound-only-play-once-then-stop-until-the-requirements-are

展开
收起
kun坤 2019-12-25 22:00:41 951 0
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()
    
        # ...
    
    2019-12-25 22:00:54
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载