Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何修复多次播放pygame音乐的问题?_Python_Pygame - Fatal编程技术网

Python 如何修复多次播放pygame音乐的问题?

Python 如何修复多次播放pygame音乐的问题?,python,pygame,Python,Pygame,我正在用pygame做一个游戏。当玩家死亡时,它会播放“游戏结束”音乐,但会播放多次。我将循环设置为0,但它再次播放多次 import pygame pygame.init() # creating our window win = pygame.display.set_mode((800, 480)) pygame.display.set_caption("My First Game") # creating our icon game_icon = pygame.i

我正在用pygame做一个游戏。当玩家死亡时,它会播放“游戏结束”音乐,但会播放多次。我将循环设置为0,但它再次播放多次

import pygame

pygame.init()

# creating our window
win = pygame.display.set_mode((800, 480))
pygame.display.set_caption("My First Game")

# creating our icon
game_icon = pygame.image.load('logo.png')
pygame.display.set_icon(game_icon)

# player variables
player_x = 0
player_y = 240

# jumping variables
is_jump = False
jump_count = 10

# enemy variables
enemy_x = 100
enemy_y = 240
enemy_left = False
enemy_right = True

# dead variable
is_dead = False

# score and score timer variables
score = 0
score_timer = 0

# main loop
run = True
while run:
    pygame.time.delay(50)
    # checking if user pressed the exit button(he probly rage quit) then quiting our game
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
    # controls
    keys = pygame.key.get_pressed()
    # left control
    if keys[pygame.K_LEFT] and player_x != 0:
        player_x -= 5
    # right control
    if keys[pygame.K_RIGHT] and player_x != 735:
        player_x += 5
    # jump control
    if not(is_jump) and not(is_dead):
        if keys[pygame.K_UP]:
            is_jump = True
            pygame.mixer.music.load("jump.wav")
            pygame.mixer.music.play(loops=0)
    elif not(is_dead):
        if jump_count >= -10:
            neg = 1
            if jump_count < 0:
                neg = -1
            player_y -= (jump_count ** 2) * 0.5 * neg
            jump_count -= 1
        else:
            is_jump = False
            jump_count = 10

    # drawing player and enemy
    if not(is_dead):
        player = pygame.draw.rect(
            win, (255, 0, 0), (player_x, player_y, 64, 64))
        enemy = pygame.draw.rect(win, (0, 0, 255), (enemy_x, enemy_y, 64, 64))

    # enemy movement
    if enemy_right:
        enemy_x = enemy_x + 5
        if enemy_x == 735:
            enemy_right = False
            enemy_left = True
    if enemy_left:
        enemy_x = enemy_x - 5
        if enemy_x == 0:
            enemy_left = False
            enemy_right = True

    # checking collision between enemy and player
    if player.colliderect(enemy):
        is_dead = True

    # checking if collision has happend and player died
    if is_dead:
        # displaying game over if player is dead
        font_over = pygame.font.Font("freesansbold.ttf", 64)
        game_over = font_over.render("Game Over", True, (255, 255, 255))
        win.blit(game_over, (230, 200))
        # dead sound
        pygame.mixer.music.load("over.wav")
        pygame.mixer.music.play(loops=0)

    # displaying score
    font_score = pygame.font.Font("freesansbold.ttf", 32)
    score_text = font_score.render(
        "Score: " + str(score), True, (255, 255, 255))
    win.blit(score_text, (0, 0))

    # score and score timer
    if not(is_dead):
        score_timer += 1
        if score_timer == 60:
            score += 1
            score_timer = 0

    # updating our window and filling it black
    pygame.display.update()
    win.fill((0, 0, 0))

# quiting the game if user no longer whants to play
pygame.quit()
导入pygame
pygame.init()
#创建我们的窗口
win=pygame.display.set_模式((800480))
pygame.display.set_标题(“我的第一个游戏”)
#创建我们的图标
game\u icon=pygame.image.load('logo.png')
pygame.display.set_图标(游戏图标)
#玩家变量
玩家x=0
玩家_y=240
#跳跃变量
是_jump=False吗
跳转计数=10
#敌人变数
敌人x=100
敌人_y=240
敌人左=假
敌人右=正确
#死变量
你死了吗
#分数和分数计时器变量
分数=0
记分计时器=0
#主回路
运行=真
运行时:
pygame。时间。延迟(50)
#检查用户是否按下退出按钮(他可能愤怒地退出),然后退出我们的游戏
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
运行=错误
#控制
keys=pygame.key.get_pressed()
#左控制
如果键[pygame.K_左]和玩家_x!=0:
玩家_x-=5
#右控制
如果键[pygame.K_RIGHT]和玩家_x!=735:
玩家x+=5
#跳转控制
如果没有(正在跳转)和没有(正在死亡):
如果键[pygame.K_UP]:
是真的吗
pygame.mixer.music.load(“jump.wav”)
pygame.mixer.music.play(循环=0)
如果没有(你死了):
如果跳转计数>=-10:
负=1
如果跳转计数<0:
负=-1
玩家y-=(跳跃计数**2)*0.5*负
跳转计数-=1
其他:
是_jump=False吗
跳转计数=10
#画玩家和敌人
如果没有(你死了):
player=pygame.draw.rect(
赢,(255,0,0),(玩家x,玩家y,64,64))
敌方=pygame.draw.rect(赢,(0,0,255),(敌方x,敌方y,64,64))
#敌军运动
如果你是对的:
敌方=敌方+5
如果敌人_x==735:
敌人右=假
敌人左=正确
如果敌人离开:
敌人x=敌人x-5
如果敌人_x==0:
敌人左=假
敌人右=正确
#检查敌方和玩家之间的碰撞
如果玩家.collide rect(敌人):
你死了吗
#检查碰撞是否发生,玩家是否死亡
如果你死了:
#如果玩家死亡,则显示游戏结束
font\u over=pygame.font.font(“freesansbold.ttf”,64)
game_over=font_over.render(“game over”,True,(255,255))
赢。布利特(游戏结束,(230200))
#死音
pygame.mixer.music.load(“over.wav”)
pygame.mixer.music.play(循环=0)
#显示分数
font\u score=pygame.font.font(“freesansbold.ttf”,32)
score\u text=font\u score.render(
分数:“+str(分数),真,(255,255,255))
win.blit(分数文本,(0,0))
#记分计时器
如果没有(你死了):
记分计时器+=1
如果分数\计时器==60:
分数+=1
记分计时器=0
#更新我们的窗口并将其填充为黑色
pygame.display.update()
赢。填充((0,0,0))
#如果用户不再玩游戏,则退出游戏
pygame.quit()

只有当玩家退出时,您才能退出主游戏循环(运行时)。 您正在运行代码,以便在循环的每次迭代中通过音乐玩游戏,因此,一旦is_dead变量设置为true,则每次运行主循环时,通过音乐玩游戏的代码都将重复(直到用户退出应用程序)

要解决此问题,可以声明一个变量
hasPlayedGameOverSound=False
。可能就在您声明is_dead变量之后最好。 然后将#dead sound注释后的两行更改为

if not hasPlayedGameOverSound:
    pygame.mixer.music.load("over.wav")
    pygame.mixer.music.play(loops=0)
    hasPlayedGameOverSound = True

这将确保“声音游戏”只玩一次

如果还解释了如何解决问题,这个答案会更好。