python - Pygame (A bit racey) 游戏错误

标签 python pygame

在游戏中,当您第一次启动它时,会出现游戏开始菜单/介绍,它有 2 个按钮(开始游戏)(退出)

现在,当您开始游戏并实际玩游戏时,当您按下 P(暂停)时,会出现 2 个按钮(继续)(主菜单),如果您单击继续,它会正常完成游戏。但是,当您单击主菜单时,它会关闭游戏而不是返回到介绍,当您与您拥有的汽车(再试一次)和(主菜单)发生碰撞时,也会出现同样的问题,如果您单击主菜单,它会关闭游戏

关于可能是什么问题的任何想法?(忽略评论)

import pygame
import time
import random

pygame.init()

crash_sound = pygame.mixer.Sound("C:\Users\itzrb_000\Documents\Untitled.wav")
pygame.mixer.music.load("C:\Users\itzrb_000\Downloads\Cool_Ride.mp3")

display_width = 800
display_height = 600

black = (0,0,0)
white = (255,255,255)
red = (200,0,0)
green = (0,200,0)
blue = (0,0,255)

bright_green = (0,255,0)
bright_red = (255,0,0)

car_width = 50

gameDisplay = pygame.display.set_mode((display_width,display_height))#game screen size
pygame.display.set_caption('What A Ride')
clock = pygame.time.Clock()

carImg = pygame.image.load('C:\Users\itzrb_000\Downloads\Car_Green_Front.png')
gameBackground = pygame.image.load('C:\WhatARide_Background.png')
icon = pygame.image.load('C:\Users\itzrb_000\Downloads\Car_Green_Front - Copy.png')

pygame.display.set_icon(icon)

pause = False

car1 = pygame.image.load('C:\Users\itzrb_000\Downloads\download (3).png')
car2 = pygame.image.load('C:\Users\itzrb_000\Downloads\download (2).png')
car3 = pygame.image.load('C:\Users\itzrb_000\Downloads\images.png')
rock = pygame.image.load('C:\Users\itzrb_000\Downloads\Rock.png')

def background():
    gameDisplay.blit(gameBackground,(0,0))

'''def cars(ystart):
    objects = [car1, car2, car3, rock]
    num_of_objects = random.randint(1,4)
    for x in range(num_of_objects):
        y = random.choice(objects)
        objectblit = random.randrange(130, 625) - (y.get_width())
        gameDisplay.blit(y,(random.randrange(130, 625)))'''

def score(count):
    font = pygame.font.SysFont(None,25)
    text = font.render("Score: "+str(count),True, blue)
    gameDisplay.blit(text,(0,0))

def things(thingx, thingy, thingw, thingh, color):
    pygame.draw.rect(gameDisplay, color, [thingx, thingy, thingw, thingh])

def car(x,y):
    gameDisplay.blit(carImg,(x,y))

def text_objects(text,font):
    textSurface = font.render(text, True, white)
    return textSurface, textSurface.get_rect()

def message_display(text):
    largeText = pygame.font.Font('freesansbold.ttf',115)
    TextSurf, TextRect = text_objects(text, largeText)
    TextRect.center = ((display_width*0.5),(display_height*0.5))
    gameDisplay.blit(TextSurf, TextRect)#blit display object

    pygame.display.update()

    time.sleep(2)

    game_loop()

def crash():
    pygame.mixer.music.stop()
    pygame.mixer.Sound.play(crash_sound)

    largeText = pygame.font.Font("freesansbold.ttf", 115)
    TextSurf, TextRect = text_objects("You Crashed", largeText)
    TextRect.center = ((display_width * 0.5), (display_height * 0.5))
    gameDisplay.blit(TextSurf, TextRect)  # blit display object
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()
        button("Try Again!", 300, 400, 200, 50, green, bright_green, game_loop)
        button("Main Menu!", 300, 470, 200, 50, red, bright_red, game_intro)

        pygame.display.update()
        clock.tick(20)

def button(msg,x,y,w,h,ic,ac,action=None):
    mouse = pygame.mouse.get_pos()
    click = pygame.mouse.get_pressed()
    if x+w > mouse[0] > x and y+h > mouse[1] > y:
        pygame.draw.rect(gameDisplay, ac,(x,y,w,h))

        if click[0] == 1 and action != None:
            action()
    else:
        pygame.draw.rect(gameDisplay, ic,(x,y,w,h))

    smallText = pygame.font.SysFont("freesansbold.ttf",20)
    textSurf, textRect = text_objects(msg, smallText)
    textRect.center = ( (x+(w/2)), (y+(h/2)) )
    gameDisplay.blit(textSurf, textRect)

def quitgame():
    pygame.quit()
    quit()

def unpause():
    global pause
    pause = False
    pygame.mixer.music.unpause()
def paused():
    global pause
    pause = True
    pygame.mixer.music.pause()
    largeText = pygame.font.Font("freesansbold.ttf", 115)
    TextSurf, TextRect = text_objects("Paused", largeText)
    TextRect.center = ((display_width * 0.5), (display_height * 0.5))
    gameDisplay.blit(TextSurf, TextRect)  # blit display object
    while pause == True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()
        button("Continue!", 300, 400, 200, 50, green, bright_green,unpause)
        button("Main Menu", 300, 470, 200, 50, red, bright_red,game_intro)

        pygame.display.update()
        clock.tick(20)

def game_intro():
    intro = True

    while intro:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()

        gameDisplay.fill(blue)
        largeText = pygame.font.SysFont("comicsansms", 115)
        TextSurf, TextRect = text_objects("What A Ride", largeText)
        TextRect.center = ((display_width / 2), (display_height / 2))
        gameDisplay.blit(TextSurf, TextRect)

        button("Start Game", 300, 400, 200, 50, green, bright_green,game_loop)
        button("Quit", 300, 470, 200, 50, red, bright_red,quitgame)

        pygame.display.update()
        clock.tick(20)


def game_loop():
    global pause
    pygame.mixer.music.play(-1)
    x = (display_width * 0.45)
    y = (display_height * 0.8)

    x_change = 0

    thing_startx = random.randrange(130,625)
    thing_starty = -600
    thing_speed = 5
    thing_width = 100
    thing_height = 100

    dodged = 0

    gameExit = False

    while not gameExit:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    x_change = -5
                elif event.key == pygame.K_RIGHT:
                    x_change = 5
                if event.key == pygame.K_p:
                    pause = True
                    paused()

            if event.type == pygame.KEYUP:
                if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
                    x_change = 0

            print event
        x += x_change

        background()
        things(thing_startx, thing_starty, thing_width, thing_height, black)
        thing_starty += thing_speed
        car(x,y)
        score(dodged)

        if x > 625 - car_width or x < 130:
            crash()

        if thing_starty > display_height:
            thing_starty = 0 - thing_height
            thing_startx = random.randrange(130,625)
            dodged += 1
            thing_speed += 1
            thing_width += (dodged*1.2)
        if y < thing_starty+thing_height:
            if x > thing_startx and x < thing_startx + thing_width or x + car_width > thing_startx and x + car_width < thing_startx+thing_width:
                crash()
        pygame.display.update()
        clock.tick(51) #fps
game_intro()
game_loop()
pygame.quit()
quit()

最佳答案

因为您不会在触发按钮之前等待鼠标按钮被释放。

  • pause() 启动时,它会弹出两个按钮。
  • 用户将鼠标移动到主菜单
  • 用户点击鼠标。
  • 只要按下鼠标按钮,就会调用 game_intro(),这会将 Quit 按钮放在同一个位置。
  • 鼠标按钮按下,因此游戏退出。

关于python - Pygame (A bit racey) 游戏错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39502475/

相关文章:

python - Spark 中 Python 列的总和

python - 关闭 Pygame alpha

python - 有没有办法将 pygame.display.update 添加到缩进循环中

python - 寻找一种将矩形拟合到轮廓点的方法

python - 使用 Python 对 GAE 查询字符串进行 URL 编码

python - 共享和非共享内存大小之间的差异

python - django模板for循环某些表行仅显示一次

python - 获取所有 github 用户详细信息

python - 如何调整pygame中的图像大小以到达屏幕的顶部/底部?

Python 桌面集成——拖放