Pygame执行程序后运行缓慢

问题描述 投票:1回答:3

我正在制作一款侵略太空的游戏,并且我有一个名为bulletboost的功能,可以在其中加载图像并将其粘贴到屏幕上任意x和y点处。

def bulletboost():
        fastbullets.append((randint(50 ,800)))
        fastbullets.append((randint(0,100)))
        bul=image.load("image/bullet.png").convert()
        gameDisplay.blit(bul,(fastbullets[0],fastbullets[1]))

这是游戏的全部代码(很长):

import sys
from pygame import *
from math import *
from random import *
import random
import math
init()

display_width = 1000
display_height = 700

shipx = 350
shipy = 550

current_level=0

spawner=0

asteroids=[]
astroidX=randint(0,800)
astroidY=randint(50,500)
astroidY_change=0

counter=0

alien=[]
aliencounter=0
enemy_y =0
enemy_x=0

fastbullets=[]

gameover=False

alienbullets=[]
w=[0,3]

gameDisplay = display.set_mode((display_width,display_height))

screen=display.set_mode((1000,700))



white = (255,255,255)
black = (0,0,0)


red = (200,0,0)
light_red = (255,0,0)

yellow = (200,200,0)
light_yellow = (255,255,0)

green = (34,177,76)
light_green = (0,255,0)

blue = (0,0,255)

clock = time.Clock()

explosion_sound = mixer.Sound('./sounds/boom.wav')
bullet_sound = mixer.Sound('./sounds/shot1.wav')

bg_sound = mixer.Sound('./sounds/bgmusic1.ogg')

smallfont = font.SysFont("comicsansms", 25)
medfont = font.SysFont("comicsansms", 50)
largefont = font.SysFont("comicsansms", 85)
xlargefont = font.SysFont("Girassol", 100)

textx = 8
texty = 40


bg_imgs = ['./image/bg_big.png',
        './image/seamless_space.png',
        './image/space3.jpg']
bg_move_dis = 0
bg_1 = image.load(bg_imgs[0]).convert()
bg_2 = image.load(bg_imgs[1]).convert()
bg_3 = image.load(bg_imgs[2]).convert()

Score_1 = 200
Score_2 = 200

if (Score_1 + Score_2) < 500:
    background = bg_1
elif (Score_1 + Score_2) < 1500:
    background = bg_2
else:
    background = bg_3



v=[0,-5]#horiz and vertical speed of the bullet
#print(ets)


bullets=[]#empty list for bullets

astroid=image.load("image/meteorBrown_med1.png").convert_alpha()

alienspaceship=image.load("image/ufo.png").convert_alpha()

def show_score(x,y):
    score = smallfont.render("Score : " + str(score_value), True, light_yellow)
    screen.blit(score,(x,y))
def show_lives(x,y):
    lives = smallfont.render("Lives : " + str(livesr), True, green)
    screen.blit(lives,(x,y))
def show_level(x,y):
    level = smallfont.render("Level : " + str(current_level), True, blue)
    screen.blit(level,(x,y))

def text_objects(text, color,size = "small"):

    if size == "small":
        textSurface = smallfont.render(text, True, color)
    if size == "medium":
        textSurface = medfont.render(text, True, color)
    if size == "large":
        textSurface = largefont.render(text, True, color)
    if size == "xlarge":
        textSurface = xlargefont.render(text, True, color)

    return textSurface, textSurface.get_rect()

def text_to_button(msg, color, buttonx, buttony, buttonwidth, buttonheight, size = "small"):
    textSurf, textRect = text_objects(msg,color,size)
    textRect.center = ((buttonx+(buttonwidth/2)), buttony+(buttonheight/2))
    gameDisplay.blit(textSurf, textRect)

def message_to_screen(msg,color, y_displace = 0, size = "small"):
    textSurf, textRect = text_objects(msg,color,size)
    textRect.center = (int(display_width / 2), int(display_height / 2)+y_displace)
    gameDisplay.blit(textSurf, textRect)

def button(text, x, y, width, height, inactive_color, active_color, action = None):
    cur = mouse.get_pos()
    click = mouse.get_pressed()
    #print(click)
    if x + width > cur[0] > x and y + height > cur[1] > y:
        draw.rect(gameDisplay, active_color, (x,y,width,height))
        if click[0] == 1 and action != None:
            if action == "Quit":
                quit()

            if action == "Play":
                play()
            if action == "Controls":
                control_menu()
            if action == "Back":
                game_intro()
            if action =="Start":
                gameLoop()

    else:
        draw.rect(gameDisplay, inactive_color, (x,y,width,height))

    text_to_button(text,black,x,y,width,height)

def game_intro():
    menu_1 = image.load('./image/menubackground.jpg')
    gameDisplay.blit(menu_1,(0,0))

    intro = True

    while intro:
        for evt in event.get():
                #print(event)
                if evt.type == QUIT:
                    quit()


                if evt.type == KEYDOWN:
                    if evt.key == K_c:
                        intro = False
                    elif evt.key == K_q:

                        quit()



        message_to_screen("Space Heroes!",green,-210,size="xlarge")
        message_to_screen("The objective is to shoot and destroy",white,-30)
        message_to_screen("the enemy ships before they destroy you.",white,10)
        message_to_screen("Defeat all of them to advance to next level!.",white,50)
        message_to_screen("By Wafi Hassan",blue, 110)

        button("Play", 230,500,100,50, green, light_green, action="Play")
        button("Controls", 430,500,100,50, yellow, light_yellow, action="Controls")
        button("Quit", 630,500,100,50, red, light_red, action ="Quit")

        display.update()

        clock.tick(15)



def control_menu():
    menu_1 = image.load('./image/menubackground.jpg')
    gameDisplay.blit(menu_1,(0,0))

    intro = True

    while intro:
        for evt in event.get():
                #print(event)
                if evt.type == QUIT:
                    quit()


                if evt.type == KEYDOWN:
                    if evt.key == K_c:
                        intro = False
                    elif evt.key == K_q:

                        quit()

        message_to_screen("Controls",blue,-210,size="large")
        message_to_screen("SPACE    -    SHOOT",white,-30)
        message_to_screen("A-D   -  Left and Right movement",white,10)

        button("Back", 550,500,100,50, red, light_red, action ="Back")

        display.update()

        clock.tick(15)

def game_over():
    global alien
    global alienbullets
    global livesr
    global score_value
    global shipx
    global shipy
    global current_level
    global aliencounter
    global asteroids
    global bullets
    bullets=[]
    asteroids=[]
    aliencounter=0
    alien=[]
    alienbullets=[]
    livesr=1
    score_value=0
    shipx=350
    shipy=550
    current_level=1
    bg_sound.stop()
    menu_1 = image.load('./image/gameover.jpg').convert_alpha()
    gameDisplay.blit(menu_1,(0,0))

    gameover = True

    while gameover:
        for evt in event.get():
            if evt.type == QUIT:
                gameover=False
                quit()





        button("QUIT", 550,500,100,50, red, light_red, action ="Quit")
        button("RESTART", 310,500,115,50, red, light_red, action ="Start")

        display.update()

        clock.tick(15)




def play():
    display_width = 1000
    display_height = 700
    screen=display.set_mode((display_width,display_height))
    running=True
    y=0
    while running:
        for evt in event.get():
            #print(event)
                if evt.type == QUIT:
                    quit()


                if evt.type == KEYDOWN:
                    if evt.key == K_e:
                          gameLoop()

        rel_y = y % bg_3.get_rect().width
        screen.blit(bg_3,(0,rel_y - bg_3.get_rect().width))
        if rel_y < 600:
            screen.blit(bg_3,(0,rel_y))
        y +=1

        message_to_screen("Attention, Fighter! ",blue,-300,size="medium")
        message_to_screen("You have been summoned by our government to protect our planet Kiblar.",white,-210)
        message_to_screen("We are being attacked by incoming enemies from the planet Noxus.",white,-170)
        message_to_screen("You are our only defender left, protect us at all costs!",white,-130)
        message_to_screen("Intelligence reports that there are 2 waves of enemies.",white,-90)
        message_to_screen("After you eliminate them all, they will send their mothership Dengrau.",white,-50)
        message_to_screen("Killing Dengrau will save our existence on galaxy 1029 from the rival planet Noxus.",white,-10)
        message_to_screen("ARE YOU READY TO TAKE THIS CHALLENGE?!",white,130)
        message_to_screen("CLICK [E] TO START!",red,190)


        display.update()

        myclock.tick(120)

    quit()


def enemy_generate(): 

    for i in range(5):
        asteroids.append((randint(50 ,800),randint(0,100)))



def drawScene(screen,sx,sy,bull,alienbull,alien,asteroids):

    lee=image.load("image/laserRed16.png").convert_alpha()
    bt=image.load("image/missile.png").convert_alpha()
##    astrow=image.load("image/meteorBrown_med1.png").convert_alpha
    spaceship=image.load("image/ship.png").convert_alpha()
    screen.blit(spaceship,[sx,sy])  

    for b in bull:
        screen.blit(bt,(b[0],b[1]))#drawing the bullets


    for en in alien:  

        screen.blit(alienspaceship,(en[0],en[1]))


    for a in asteroids:  
        astroid=image.load("image/meteorBrown_med1.png").convert_alpha()
        screen.blit(astroid,(a[0],(a[1]+astroidY_change))) ######################## change


    for eb in alienbull:

        screen.blit(lee,(eb[0],eb[1]))#drawing the bullets       


    display.update()

score_value=0
lives=3
def checkHits(bull,targ,astero,crate):
    global score_value
    global rapidbullet
    for b in bull:# go through each bullet
        for a in astero:
            aliendistance = math.sqrt((math.pow(b[0]-a[0],2)) + (math.pow(b[1]-a[1],2)))
            if aliendistance < 40:
                asteroids.remove(a)
                bull.remove(b)
                explosion_sound.play()
                score_value+=1
                break
        for t in targ: #go through each target
            distance = math.sqrt((math.pow(b[0]-t[0],2)) + (math.pow(b[1]-t[1],2)))
            if distance < 60:
                targ.remove(t)#removes the target
                bull.remove(b)#removes the bullet
                explosion_sound.play()
                score_value += 1
                if score_value==10:
                    level_2()
                elif score_value==30:
                    level_3()
                elif score_value==60:
                    gamefinish()
                break
        for c in crate:
            boxdistance=math.sqrt((math.pow(b[0]-fastbullets[1],2)) + (math.pow(b[1]-fastbullets[0],2)))
            if boxdistance<30: 
                crate.remove(c)
                bull.remove(b)
                explosion_sound.play()
                rapidbullet=20
                break


livesr=1
def checkalienbullets(alienbull):
    global livesr
    global score_value
    for a in alienbull:
        alienbdistance=math.sqrt((math.pow(a[0]-shipx,2)) + (math.pow(a[1]-shipy,2)))
        if alienbdistance<40:
            livesr-=1
            print(livesr)
            if livesr==0:
                game_over()
def bulletboost():
        fastbullets.append((randint(50 ,800)))
        fastbullets.append((randint(0,100)))
        bul=image.load("image/bullet.png").convert()
        gameDisplay.blit(bul,(fastbullets[0],fastbullets[1]))




def moveBullets(bull):
    for b in bull:
        b[0]+=b[2]
        b[1]+=b[3]
        if b[1]>700:#off-screen
            bull.remove(b)

def move_alien_bull(ebull):
    for e in ebull:
        e[0]+=e[2]
        e[1]+=e[3]
        if e[1]>700:#off-screen
            ebull.remove(e)

def level_2():
    global asteroids
    global alien
    global aliencounter
    global alienbullets
    global shipx
    global shipy
    global current_level
    global livesr
    global score_value
    global enemy_y
    global astroidY 
    global astroidY_change
    global bullets
    bullets=[]
    asteriodY_change=0
    alien=[]
    aliencounter=0
    rapidbullet=40
    y=0
    alienbullets=[]
    shipx=350
    shipy=550
    ship_x =0
    ship_y=0 
    current_level+=1
    livesr+=1
    direction= None
    running=True
    function=True
    while running:
        astroidY_change += .5
        #enemy_y += 0
        #global alienbullets
        for evt in event.get():
            if evt.type==QUIT:
                running=False
                quit()
            if evt.type==KEYDOWN:
                if evt.key == K_LEFT:
                    ship_x = -2.5
                if evt.key == K_RIGHT:
                    ship_x = 2.5
##                if evt.key == K_UP: 
##                    ship_y = -2
##                if evt.key == K_DOWN: 
##                    ship_y = 2
            if evt.type==KEYUP:
                if evt.key == K_LEFT or evt.key == K_RIGHT: 
                    ship_x = 0
##                    ship_y = 0

        shipx += ship_x
##        shipy += ship_y 

        if shipx <= 0: 
            shipx = 0
        elif shipx >= 900:
            shipx = 900

##        if shipy <= 0: 
##            shipy = 0
##        elif shipy >= 650:
##            shipy = 650



        # astroid Movement
        astroidY += astroidY_change

        if astroidY_change >=650: 
           astroidY_change =0    


        if rapidbullet<40:
            rapidbullet+=1

        keys=key.get_pressed()       
        if keys[32] and rapidbullet==40:#32 is the space key
            bullet_sound.play()

            bullets.append([shipx,shipy,v[0],v[1]]) 
            rapidbullet=0


        if random.randrange(0,6*20) == 1 and score_value<=30:
            aliencounter+=1
            x= randint(50,700)
            y= randint(0,100)
            alien.append([x,y])
            alienbullets.append([x,y,w[0],w[1]])




        rel_y = y % bg_3.get_rect().width
        screen.blit(bg_3,(0,rel_y - bg_3.get_rect().width))
        if rel_y < 700:
            screen.blit(bg_3,(0,rel_y))
        y +=1

        if enemy_y >= 600: 
           enemy_y = 0

        show_score(textx,texty)
        show_lives(10,70)
        show_level(10,10)
        moveBullets(bullets)
        move_alien_bull(alienbullets)
        checkHits(bullets,alien,asteroids,fastbullets)
        checkalienbullets(alienbullets)
        drawScene(screen,shipx,shipy,bullets,alienbullets,alien,asteroids) 

        display.update()
        myclock.tick(120)

    quit()


def level_3():
    enemy_generate()
    global alien
    global aliencounter
    global alienbullets
    global shipx
    global shipy
    global current_level
    global livesr
    global score_value
    global enemy_y
    global astroidY 
    global astroidY_change
    global bullets
    bullets=[]
    asteriodY_change=0
    alien=[]
    aliencounter=0
    rapidbullet=40
    alienbullets=[]
    y=0
    shipx=350
    shipy=550
    ship_x =0
    ship_y=0 
    current_level+=1
    livesr+=1
    direction= None
    running=True
    function=True
    while running:
        astroidY_change += .5
        #global alienbullets
        for evt in event.get():
            if evt.type==QUIT:
                running=False
                quit()
            if evt.type==KEYDOWN:
                if evt.key == K_LEFT:
                    ship_x = -2.5
                if evt.key == K_RIGHT:
                    ship_x = 2.5
##                if evt.key == K_UP: 
##                    ship_y = -2
##                if evt.key == K_DOWN: 
##                    ship_y = 2
            if evt.type==KEYUP:
                if evt.key == K_LEFT or evt.key == K_RIGHT: 
                    ship_x = 0
##                    ship_y = 0

        shipx += ship_x
##        shipy += ship_y 

        if shipx <= 0: 
            shipx = 0
        elif shipx >= 900:
            shipx = 900

##        if shipy <= 0: 
##            shipy = 0
##        elif shipy >= 650:
##            shipy = 650



        # astroid Movement
        astroidY += astroidY_change

        if astroidY_change >=650: 
           astroidY_change =0    


        if rapidbullet<40:
            rapidbullet+=1

        keys=key.get_pressed()       
        if keys[32] and rapidbullet==40:#32 is the space key
            bullet_sound.play()

            bullets.append([shipx,shipy,v[0],v[1]]) 
            rapidbullet=0


        if random.randrange(0,6*15) == 1 and score_value<=60:
            aliencounter+=1
            x= randint(50,700)
            y= randint(0,100)
            alien.append([x,y])
            alienbullets.append([x,y,w[0],w[1]])




        rel_y = y % bg_3.get_rect().width
        screen.blit(bg_3,(0,rel_y - bg_3.get_rect().width))
        if rel_y < 700:
            screen.blit(bg_3,(0,rel_y))
        y +=1

        if enemy_y >= 600: 
           enemy_y = 0

        show_score(textx,texty)
        show_lives(10,70)
        show_level(10,10)
        moveBullets(bullets)
        move_alien_bull(alienbullets)
        checkHits(bullets,alien,asteroids,fastbullets)
        checkalienbullets(alienbullets)
        drawScene(screen,shipx,shipy,bullets,alienbullets,alien,asteroids) 

        display.update()
        myclock.tick(120)

    quit()

def gamefinish():
    global alien
    global alienbullets
    global livesr
    global score_value
    global shipx
    global shipy
    global current_level
    global aliencounter
    global asteroids
    global bullets
    bullets=[]
    asteroids=[]
    aliencounter=0
    alien=[]
    alienbullets=[]
    livesr=1
    score_value=0
    shipx=350
    shipy=550
    current_level=1
    bg_sound.stop()

    gameDisplay = display.set_mode((1000,700))
    bg_sound.stop()
    over = image.load('./image/gamewon.jpg').convert_alpha()
    gameDisplay.blit(over,(0,0))

    gamewin = True

    while gamewin:
        for evt in event.get():
            if evt.type == QUIT:
                gamewin=False
                quit()





        button("QUIT", 550,500,100,50, red, light_red, action ="Quit")
        button("MENU", 310,500,100,50, red, light_red, action ="Back")


##        texting=medfont.render("Your score:",show_score, True,(0,0,0))
##        gameDisplay.blit(texting,(0,0))


        display.update()

        clock.tick(15)

    print("Your score:", score_value)
    print("Level:", current_level)
    print("Lives Left:", livesr)






myclock=time.Clock()
##y=0

##enemy_generate() 

def gameLoop():
    gameover=False
    livesr=1
    bg_sound.play(-1)
    rapidbullet=40
    y=0
    score=0
    ship_x =0
    ship_y=0 
    global shipx
    global shipy
    global aliencounter
    global astroidY 
    global astroidY_change
    global enemy_y
    global alien
    global current_level
    global counter
    global bullets
    global spawner
    spawner=1
##    global livesr
    current_level=1
    direction= None
    running=True
    spawning=True

    bulletboost()
    while running:

        astroidY_change += .5
        #enemy_y += 0
        #global alienbullets
        for evt in event.get():
            if evt.type==QUIT:
                running=False
                quit()
            if evt.type==KEYDOWN:
                if evt.key == K_LEFT:
                    ship_x = -2.5
                if evt.key == K_RIGHT:
                    ship_x = 2.5
##                if evt.key == K_UP: 
##                    ship_y = -2
##                if evt.key == K_DOWN: 
##                    ship_y = 2
            if evt.type==KEYUP:
                if evt.key == K_LEFT or evt.key == K_RIGHT: 
                    ship_x = 0
##                    ship_y = 0

        shipx += ship_x
##        shipy += ship_y 

        if shipx <= 0: 
            shipx = 0
        elif shipx >= 900:
            shipx = 900

##        if shipy <= 0: 
##            shipy = 0
##        elif shipy >= 650:
##            shipy = 650



        # astroid Movement
        astroidY += astroidY_change

        if astroidY_change >=650: 
           astroidY_change =0    


        if rapidbullet<40:
            rapidbullet+=1

        keys=key.get_pressed()       
        if keys[32] and rapidbullet==40:#32 is the space key
            bullet_sound.play()

            bullets.append([shipx,shipy,v[0],v[1]]) 
            rapidbullet=0


        if random.randrange(0,6*30) == 1 and score_value<=10:
            aliencounter+=1
            x= randint(50,700)
            y= randint(0,100)
            alien.append([x,y])
            alienbullets.append([x,y,w[0],w[1]])


##        if random.randrange(0,6*40) == 1:
##            aliencounter+=1
##            x= randint(50,700)
##            y= randint(0,100)
##            alien.append([x,y])
##            alienbullets.append([x,y,w[0],w[1]])
##            if aliencounter==10:
##                function=False



        rel_y = y % bg_3.get_rect().width
        screen.blit(bg_3,(0,rel_y - bg_3.get_rect().width))
        if rel_y < 700:
            screen.blit(bg_3,(0,rel_y))
        y +=1

        if enemy_y >= 600: 
           enemy_y = 0
        for i in range(1):
            bulletboost()

        show_score(textx,texty)
        show_lives(10,70)
        show_level(10,10)
        moveBullets(bullets)
        move_alien_bull(alienbullets)
        checkHits(bullets,alien,asteroids,fastbullets)
        checkalienbullets(alienbullets)
        drawScene(screen,shipx,shipy,bullets,alienbullets,alien,asteroids) 
        display.update()
        myclock.tick(120)
        spawner+=1

    quit()




game_intro()

问题是,当我运行游戏时,游戏开始时是平稳的,然后开始减速并变得如此缓慢,以至于一切都变成慢动作。任何帮助,将不胜感激。

python pygame python-3.2
3个回答
0
投票

您的快速项目列表越来越长。也许您的意思是:

def bulletboost():
    fasrbullets = [randint(50 ,800), (randint(0,100))]
    bul=image.load("image/bullet.png").convert()
    gameDisplay.blit(bul,(fastbullets[0],fastbullets[1]))

0
投票

当我重新创建太空侵略者游戏时,我遇到了同样的问题。尝试改用convert_alpha()。

bul = image.load("image/bullet.png").convert_alpha()

https://www.pygame.org/docs/ref/surface.html#pygame.Surface.convert_alpha


0
投票

问题是,图像“ image / bullet.png”已加载到每一帧中。加载图像是非常耗时的操作。在程序开始时(在display.set_mode之后的某个位置)加载一次图像:

gameDisplay = display.set_mode((display_width,display_height))

# [...]

bullet_image = image.load("image/bullet.png").convert_alpha()

并在blit项目符号时使用图像。但是请注意,子弹在生成时不必绘制。您必须在主应用程序循环中绘制项目符号。因此,您需要一个附加项目符号的函数和另一个绘制项目符号的函数:

def spawnbullet():
    global fastbullets
    x = randint(50 ,800))
    y = randint(0,100))
    fastbullets.append((x, y))

def bulletboost():
    for pos in fastbullets:
        gameDisplay.blit(bullet_image, pos)
def gameLoop():
    # [...]

    spawnbullet()
    while running:
        # [...]

        if enemy_y >= 600: 
            enemy_y = 0
        bulletboost()
© www.soinside.com 2019 - 2024. All rights reserved.