【问题标题】:Pygame code very slow despite all troubleshooting尽管进行了所有故障排除,Pygame 代码仍然很慢
【发布时间】:2020-12-18 07:42:43
【问题描述】:

所以我从 pygame 介绍教程中编写了这个游戏,添加了菜单和所有修改它。每当我在 MBP 17 上运行游戏时,它的运行速度都非常慢。我用谷歌搜索了它,并尝试了所有解决方案,但无济于事。此外,输入我的 event.unicode 非常糟糕,我必须多次按下同一个键才能注册。任何帮助表示赞赏。

import sys
import pygame
import random
import math
import mysql.connector as mysql
import pygame_textinput

pygame.init()
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption('Die Alien Die')

#database requirements
msql = mysql.connect(user='root', password='7014403396', database='gamer')
cursor = msql.cursor()

#background
background = pygame.image.load('back.png').convert()
pygame.mixer.music.load('y2mate.com - Star Wars_ Sith Battle Theme Music_XS4_5xlA3Ls_320kbps.mp3')
pygame.mixer.music.play(-1)
clock = pygame.time.Clock()
#millenium falcom
playerimg = pygame.image.load('mfc.png')
playerX = 350
playerY = 480
dx = 0
dy = 0

#alien die
alienimg = []
alienX =[]
alienY =[]
adx = []
ady = []
no_of_aliens = 8
for i in range(no_of_aliens):
    alienimg.append(pygame.image.load('spaceship.png'))
    alienX.append(random.randint(0,735))
    alienY.append(random.randint(50,250))
    adx.append(0.3)
    ady.append(random.randint(20,43))

#bullets
bulletimg = pygame.image.load('bullet.png')
bulletX = 0
bulletY = 480
bdx = 0
bdy = 1
visibility = False

score = 0
font=pygame.font.Font('freesansbold.ttf',32)
font2 = pygame.font.Font('freesansbold.ttf',25)
font3 = pygame.font.Font('freesansbold.ttf',22)

# Game Over
over_font = pygame.font.Font('freesansbold.ttf', 64)



click = False
def EnterUser():
    texty = ''
    global click
    while True:
        screen.fill((255, 255, 255))
        textinput = pygame_textinput.TextInput()
        events = pygame.event.get()
        textinput.update(events)
        screen.blit(textinput.get_surface(), (50, 150))
        buttong = pygame.Rect(50, 330, 200, 50)
        mx, my = pygame.mouse.get_pos()
        pygame.draw.rect(screen, (255, 0, 0), buttong)


        draw_text('enter username', font, (0, 0, 0), screen, 20, 20)
        draw_text("Press Enter", font2, (0, 0, 0), screen, 50, 200)
        draw_text("If you leave username blank", font2, (0, 0, 0), screen, 50, 250)
        draw_text("your score wont register", font2, (0, 0, 0), screen, 50, 280)
        text_surface = font.render(texty, True, (0,0,0))
        screen.blit(text_surface, (50, 150))
        draw_text('Lets Go', font2, (0, 0, 0), screen, 52, 340)
        if buttong.collidepoint((mx, my)):
            if click:
                main_menu()




        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            if event.type == pygame.KEYDOWN:
                texty += event.unicode
                if event.key == pygame.K_BACKSPACE:
                    texty = texty[:-1]
                if event.key == pygame.K_ESCAPE:
                    pygame.quit()
                if event.type == pygame.K_RETURN:
                    main_menu()
            if event.type == pygame.MOUSEBUTTONDOWN:
                if event.button == 1:
                    click = True
        pygame.display.update()



def draw_text(text, font, color, surface, x, y):
    textobj = font.render(text, 1, color)
    textrect = textobj.get_rect()
    textrect.topleft = (x, y)
    surface.blit(textobj, textrect)

def player(x, y):
    screen.blit(playerimg, (x, y))

def alien(x,y,i):
    screen.blit(alienimg[i],(x,y))

def shoot(x,y):
    global visibility
    visibility = True
    screen.blit(bulletimg,(x+25,y+10))

def collide(bulletX,bulletY,alienX,alienY):
    distance = math.sqrt(math.pow(alienX-bulletX,2)+math.pow(alienY-bulletY,2))
    if distance < 27:
        return True
    else:
        return False

def showscore(x,y):
    sscore=font.render('Score: '+str(score),True,(141,27,31))
    screen.blit(sscore,(x,y))

def game_over_text():
    over_text = over_font.render("GAME OVER", True, (255, 255, 255))
    screen.blit(over_text, (200, 250))
    fscore = score
    save_score()

def save_score():
    t = "INSERT INTO alien VALUES('{}', '{}')".format(texty, str(score))
    #val = (texty, str(score))
    cursor.execute(t)
    msql.commit()

#def show_high():

def main_menu():
    while True:
        screen.fill((0, 0, 0))
        draw_text('Main Menu', font, (255, 255, 255), screen, 20, 20)

        mx, my = pygame.mouse.get_pos()

        button_1 = pygame.Rect(50, 100, 200, 50)
        button_2 = pygame.Rect(50, 200, 200, 50)


        if button_1.collidepoint((mx, my)):
            if click:
                game()
        if button_2.collidepoint((mx, my)):
            if click:
                options()
        pygame.draw.rect(screen, (255, 0, 0), button_1)
        pygame.draw.rect(screen, (255, 0, 0), button_2)
        draw_text('Alien Destroyer', font2, (0,0,0), screen, 52, 110)
        draw_text('Show high scores', font3, (0,0,0), screen, 52, 206)
        draw_text('for Alien Destroyer', font3, (0,0,0), screen, 52, 230)

        click = False
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_ESCAPE:
                    pygame.quit()
            if event.type == pygame.MOUSEBUTTONDOWN:
                if event.button == 1:
                    click = True

        pygame.display.update()

# game loop
def game():
    global dx
    global dy
    global adx
    global ady
    global bdx
    global bdy
    global playerY
    global playerX
    global alienX
    global alienY
    global bulletY
    global bulletX
    global visibility
    global score
    running = True
    while running:
        clock.tick(60)
        screen.fill((0, 0, 0))
        screen.blit(background, (0, 0))
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    dx = -1
                if event.key == pygame.K_RIGHT:
                    dx = 1
                if event.key == pygame.K_SPACE:
                    pygame.mixer.music.load('laser.wav')
                    pygame.mixer.music.play()
                    bulletX = playerX
                    shoot(bulletX, bulletY)

            if event.type == pygame.KEYUP:
                if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
                    dx = 0
        playerX += dx
        if playerX <= 0:
            playerX = 0
        elif playerX >= 736:
            playerX = 736

        for i in range(no_of_aliens):
            if alienY[i] > 440:
                for j in range(no_of_aliens):
                    alienY[j] = 2000
                game_over_text()
                break
            alienX[i] += adx[i]
            if alienX[i] <= 0:
                adx[i] = 0.3
                alienY[i] += ady[i]
            elif alienX[i] >= 736:
                adx[i] = -0.3
                alienY[i] += ady[i]
            death = collide(bulletX, bulletY, alienX[i], alienY[i])
            if death:
                pygame.mixer.music.load('explosion.wav')
                pygame.mixer.music.play()
                bulletY = 480
                visibility = False
                score += 1
                alienX[i] = random.randint(0, 735)
                alienY[i] = random.randint(30, 130)
            alien(alienX[i], alienY[i], i)


        if bulletY <= 0:
            bulletY = 480
            visibility = False
        if visibility is True:
            shoot(bulletX, bulletY)
            bulletY -= bdy

        showscore(10, 10)
        player(playerX, playerY)


        pygame.display.update()

EnterUser()

【问题讨论】:

    标签: python-3.x macos pygame


    【解决方案1】:

    问题是您多次调用pygame.event.get()(行:89、174、208)。这会导致不同的事件队列不一致并导致问题。有一个简单的解决方法。 在您的主应用程序循环中,调用一次pygame.event.get()

    def game:
        while running:
            #omitted code
            events = pygame.event.get()
            for event in events:
                 #...
    

    然后,您可以将events 变量作为参数传递给其他函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-07
      • 2016-03-17
      • 1970-01-01
      • 2015-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多