在Pygame中如何提高Fps

2024-07-05 08:54:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我是python和pygame的初学者,我一直在制作一个2D自上而下的游戏(非常类似于《塞尔达传奇》)。我只制作了开始屏幕和第一个屏幕,你可以在那里到处跑,但fps处于20度以下,我想知道我能做些什么来提高它。我根本不知道该做什么

import pygame
import sys
import os
pygame.mixer.init()
pygame.font.init()
pygame.init()
pygame.mixer.music.load('Music/Start.mp3')
click = pygame.mixer.Sound('Music/Sounds/Click.wav')
pygame.mixer_music.play()

os.environ['SDL_VIDEO_CENTERED'] = "True"

clock = pygame.time.Clock()

walkRight = [pygame.image.load('Wraith/Wraith_01.png'), pygame.image.load('Wraith/Wraith_02.png'),
             pygame.image.load('Wraith/Wraith_03.png'), pygame.image.load('Wraith/Wraith_04.png'),
             pygame.image.load('Wraith/Wraith_05.png'), pygame.image.load('Wraith/Wraith_06.png'),
             pygame.image.load('Wraith/Wraith_07.png'), pygame.image.load('Wraith/Wraith_08.png'),
             pygame.image.load('Wraith/Wraith_09.png'), pygame.image.load('Wraith/Wraith_10.png'),
             pygame.image.load('Wraith/Wraith_11.png'), pygame.image.load('Wraith/Wraith_12.png'),
             pygame.image.load('Wraith/Wraith_01.png'), pygame.image.load('Wraith/Wraith_02.png'),
             pygame.image.load('Wraith/Wraith_03.png'), pygame.image.load('Wraith/Wraith_04.png'),
             pygame.image.load('Wraith/Wraith_05.png'), pygame.image.load('Wraith/Wraith_06.png'),
             pygame.image.load('Wraith/Wraith_07.png'), pygame.image.load('Wraith/Wraith_08.png'),
             pygame.image.load('Wraith/Wraith_09.png'), pygame.image.load('Wraith/Wraith_10.png'),
             pygame.image.load('Wraith/Wraith_11.png'), pygame.image.load('Wraith/Wraith_12.png'),
             pygame.image.load('Wraith/Wraith_01.png'), pygame.image.load('Wraith/Wraith_02.png'),
             pygame.image.load('Wraith/Wraith_03.png'), pygame.image.load('Wraith/Wraith_04.png'),
             pygame.image.load('Wraith/Wraith_05.png'), pygame.image.load('Wraith/Wraith_06.png'),
             pygame.image.load('Wraith/Wraith_07.png'), pygame.image.load('Wraith/Wraith_08.png'),
             pygame.image.load('Wraith/Wraith_09.png'), pygame.image.load('Wraith/Wraith_10.png'),
             pygame.image.load('Wraith/Wraith_11.png'), pygame.image.load('Wraith/Wraith_12.png'),
             pygame.image.load('Wraith/Wraith_01.png'), pygame.image.load('Wraith/Wraith_02.png'),
             pygame.image.load('Wraith/Wraith_03.png'), pygame.image.load('Wraith/Wraith_04.png'),
             pygame.image.load('Wraith/Wraith_05.png'), pygame.image.load('Wraith/Wraith_06.png'),
             pygame.image.load('Wraith/Wraith_07.png'), pygame.image.load('Wraith/Wraith_08.png'),
             pygame.image.load('Wraith/Wraith_09.png'), pygame.image.load('Wraith/Wraith_10.png'),
             pygame.image.load('Wraith/Wraith_11.png'), pygame.image.load('Wraith/Wraith_12.png'),
             pygame.image.load('Wraith/Wraith_01.png'), pygame.image.load('Wraith/Wraith_02.png'),
             pygame.image.load('Wraith/Wraith_03.png'), pygame.image.load('Wraith/Wraith_04.png'),
             pygame.image.load('Wraith/Wraith_05.png'), pygame.image.load('Wraith/Wraith_06.png'),
             pygame.image.load('Wraith/Wraith_07.png'), pygame.image.load('Wraith/Wraith_08.png'),
             pygame.image.load('Wraith/Wraith_09.png'), pygame.image.load('Wraith/Wraith_10.png'),
             pygame.image.load('Wraith/Wraith_11.png'), pygame.image.load('Wraith/Wraith_12.png')]
walkLeft = [pygame.image.load('Wraith/Wraith_13.png'), pygame.image.load('Wraith/Wraith_14.png'),
            pygame.image.load('Wraith/Wraith_15.png'), pygame.image.load('Wraith/Wraith_16.png'),
            pygame.image.load('Wraith/Wraith_17.png'), pygame.image.load('Wraith/Wraith_18.png'),
            pygame.image.load('Wraith/Wraith_19.png'), pygame.image.load('Wraith/Wraith_20.png'),
            pygame.image.load('Wraith/Wraith_21.png'), pygame.image.load('Wraith/Wraith_22.png'),
            pygame.image.load('Wraith/Wraith_23.png'), pygame.image.load('Wraith/Wraith_24.png'),
            pygame.image.load('Wraith/Wraith_13.png'), pygame.image.load('Wraith/Wraith_14.png'),
            pygame.image.load('Wraith/Wraith_15.png'), pygame.image.load('Wraith/Wraith_16.png'),
            pygame.image.load('Wraith/Wraith_17.png'), pygame.image.load('Wraith/Wraith_18.png'),
            pygame.image.load('Wraith/Wraith_19.png'), pygame.image.load('Wraith/Wraith_20.png'),
            pygame.image.load('Wraith/Wraith_21.png'), pygame.image.load('Wraith/Wraith_22.png'),
            pygame.image.load('Wraith/Wraith_23.png'), pygame.image.load('Wraith/Wraith_24.png'),
            pygame.image.load('Wraith/Wraith_13.png'), pygame.image.load('Wraith/Wraith_14.png'),
            pygame.image.load('Wraith/Wraith_15.png'), pygame.image.load('Wraith/Wraith_16.png'),
            pygame.image.load('Wraith/Wraith_17.png'), pygame.image.load('Wraith/Wraith_18.png'),
            pygame.image.load('Wraith/Wraith_19.png'), pygame.image.load('Wraith/Wraith_20.png'),
            pygame.image.load('Wraith/Wraith_21.png'), pygame.image.load('Wraith/Wraith_22.png'),
            pygame.image.load('Wraith/Wraith_23.png'), pygame.image.load('Wraith/Wraith_24.png'),
            pygame.image.load('Wraith/Wraith_13.png'), pygame.image.load('Wraith/Wraith_14.png'),
            pygame.image.load('Wraith/Wraith_15.png'), pygame.image.load('Wraith/Wraith_16.png'),
            pygame.image.load('Wraith/Wraith_17.png'), pygame.image.load('Wraith/Wraith_18.png'),
            pygame.image.load('Wraith/Wraith_19.png'), pygame.image.load('Wraith/Wraith_20.png'),
            pygame.image.load('Wraith/Wraith_21.png'), pygame.image.load('Wraith/Wraith_22.png'),
            pygame.image.load('Wraith/Wraith_23.png'), pygame.image.load('Wraith/Wraith_24.png'),
            pygame.image.load('Wraith/Wraith_13.png'), pygame.image.load('Wraith/Wraith_14.png'),
            pygame.image.load('Wraith/Wraith_15.png'), pygame.image.load('Wraith/Wraith_16.png'),
            pygame.image.load('Wraith/Wraith_17.png'), pygame.image.load('Wraith/Wraith_18.png'),
            pygame.image.load('Wraith/Wraith_19.png'), pygame.image.load('Wraith/Wraith_20.png'),
            pygame.image.load('Wraith/Wraith_21.png'), pygame.image.load('Wraith/Wraith_22.png'),
            pygame.image.load('Wraith/Wraith_23.png'), pygame.image.load('Wraith/Wraith_24.png')]
idle = [pygame.image.load('Wraith/Wraith_01_idle.png'), pygame.image.load('Wraith/Wraith_02_idle.png'),
        pygame.image.load('Wraith/Wraith_03_idle.png'), pygame.image.load('Wraith/Wraith_04_idle.png'),
        pygame.image.load('Wraith/Wraith_05_idle.png'), pygame.image.load('Wraith/Wraith_06_idle.png'),
        pygame.image.load('Wraith/Wraith_07_idle.png'), pygame.image.load('Wraith/Wraith_08_idle.png'),
        pygame.image.load('Wraith/Wraith_09_idle.png'), pygame.image.load('Wraith/Wraith_10_idle.png'),
        pygame.image.load('Wraith/Wraith_11_idle.png'), pygame.image.load('Wraith/Wraith_12_idle.png'),
        pygame.image.load('Wraith/Wraith_01_idle.png'), pygame.image.load('Wraith/Wraith_02_idle.png'),
        pygame.image.load('Wraith/Wraith_03_idle.png'), pygame.image.load('Wraith/Wraith_04_idle.png'),
        pygame.image.load('Wraith/Wraith_05_idle.png'), pygame.image.load('Wraith/Wraith_06_idle.png'),
        pygame.image.load('Wraith/Wraith_07_idle.png'), pygame.image.load('Wraith/Wraith_08_idle.png'),
        pygame.image.load('Wraith/Wraith_09_idle.png'), pygame.image.load('Wraith/Wraith_10_idle.png'),
        pygame.image.load('Wraith/Wraith_11_idle.png'), pygame.image.load('Wraith/Wraith_12_idle.png'),
        pygame.image.load('Wraith/Wraith_01_idle.png'), pygame.image.load('Wraith/Wraith_02_idle.png'),
        pygame.image.load('Wraith/Wraith_03_idle.png'), pygame.image.load('Wraith/Wraith_04_idle.png'),
        pygame.image.load('Wraith/Wraith_05_idle.png'), pygame.image.load('Wraith/Wraith_06_idle.png'),
        pygame.image.load('Wraith/Wraith_07_idle.png'), pygame.image.load('Wraith/Wraith_08_idle.png'),
        pygame.image.load('Wraith/Wraith_09_idle.png'), pygame.image.load('Wraith/Wraith_10_idle.png'),
        pygame.image.load('Wraith/Wraith_11_idle.png'), pygame.image.load('Wraith/Wraith_12_idle.png'),
        pygame.image.load('Wraith/Wraith_01_idle.png'), pygame.image.load('Wraith/Wraith_02_idle.png'),
        pygame.image.load('Wraith/Wraith_03_idle.png'), pygame.image.load('Wraith/Wraith_04_idle.png'),
        pygame.image.load('Wraith/Wraith_05_idle.png'), pygame.image.load('Wraith/Wraith_06_idle.png'),
        pygame.image.load('Wraith/Wraith_07_idle.png'), pygame.image.load('Wraith/Wraith_08_idle.png'),
        pygame.image.load('Wraith/Wraith_09_idle.png'), pygame.image.load('Wraith/Wraith_10_idle.png'),
        pygame.image.load('Wraith/Wraith_11_idle.png'), pygame.image.load('Wraith/Wraith_12_idle.png'),
        pygame.image.load('Wraith/Wraith_01_idle.png'), pygame.image.load('Wraith/Wraith_02_idle.png'),
        pygame.image.load('Wraith/Wraith_03_idle.png'), pygame.image.load('Wraith/Wraith_04_idle.png'),
        pygame.image.load('Wraith/Wraith_05_idle.png'), pygame.image.load('Wraith/Wraith_06_idle.png'),
        pygame.image.load('Wraith/Wraith_07_idle.png'), pygame.image.load('Wraith/Wraith_08_idle.png'),
        pygame.image.load('Wraith/Wraith_09_idle.png'), pygame.image.load('Wraith/Wraith_10_idle.png'),
        pygame.image.load('Wraith/Wraith_11_idle.png'), pygame.image.load('Wraith/Wraith_12_idle.png')]

fullheart = [pygame.image.load('Wraith/Heart.png'), pygame.image.load('Wraith/Heart.png')]
halfheart = [pygame.image.load('Wraith/HalfHeart.png'), pygame.image.load('Wraith/HalfHeart.png')]
noheart = [pygame.image.load('Wraith/NoHeart.png'), pygame.image.load('Wraith/NoHeart.png')]

bg = pygame.image.load('Ground/BG.png')
startscreen = pygame.image.load('Wraith/StartScreen.png')

sword = [pygame.image.load('Wraith/Sword.png'), pygame.image.load('Wraith/Sword.png')]
shield = [pygame.image.load('Wraith/Shield.png'), pygame.image.load('Wraith/Shield.png')]

redberries = [pygame.image.load('Wraith/RedBerries.png'), pygame.image.load('Wraith/RedBerries.png')]
blueberries = [pygame.image.load('Wraith/BlueBerries.png'), pygame.image.load('Wraith/BlueBerries.png')]

inventory = [pygame.image.load('Wraith/Inventory.png'), pygame.image.load('Wraith/Inventory.png')]
slots = [pygame.image.load('Wraith/Slots.png'), pygame.image.load('Wraith/Slots.png')]
notequipped = [pygame.image.load('Wraith/NotEquiped.png'), pygame.image.load('Wraith/NotEquiped.png')]

swordslot = [pygame.image.load("Wraith/SwordSlot.png"), pygame.image.load("Wraith/SwordSlot.png")]
shieldslot = [pygame.image.load('Wraith/ShieldSlot.png'), pygame.image.load('Wraith/ShieldSlot.png')]

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

font = pygame.font.SysFont("Arial", 18)
newfont = pygame.font.SysFont('Ariel', 150)


new = newfont.render("NEW GAME", True, black)
settings = newfont.render("SETTINGS", True, black)
quit = newfont.render("QUIT", True, black)

WIDTH = 1920
HEIGHT = 1080

playerx = 900
playery = 485

mouseposx = 175
mouseposy = 185

startx = 175
starty = 185

slotx = 175
sloty = 185

detectx = 0
detecty = 0

walkCount = 0
icon = 1
inv = 0

move_left = False
move_right = False
move_up = False
move_down = False

arangeinventory = False
accessinventory = False
mousepos = False

Heath = 6
ability1 = "Sword"
ability2 = "Shield"
ability3 = "Red Berries"

screen = pygame.display.set_mode((WIDTH, HEIGHT), pygame.FULLSCREEN)

game = True
startarea = True
slotloop = False


def redrawGameWindow():
    global walkCount
    global icon
    screen.blit(bg, (0, 0))

    screen.blit(update_fps(), (1900, 0))

    if walkCount + 1 >= 60:
        walkCount = 0

    if move_right == False and move_left == False:
        screen.blit(idle[walkCount], (playerx, playery))
        walkCount += 1
    if move_right:
        screen.blit(walkRight[walkCount], (playerx, playery))
        walkCount += 1
    if move_left:
        screen.blit(walkLeft[walkCount], (playerx, playery))
        walkCount += 1

    if Heath == 6:
        screen.blit(fullheart[icon], (0, 0))
        screen.blit(fullheart[icon], (64, 0))
        screen.blit(fullheart[icon], (128, 0))
    elif Heath == 5:
        screen.blit(fullheart[icon], (0, 0))
        screen.blit(fullheart[icon], (64, 0))
        screen.blit(halfheart[icon], (128, 0))
    elif Heath == 4:
        screen.blit(fullheart[icon], (0, 0))
        screen.blit(fullheart[icon], (64, 0))
        screen.blit(noheart[icon], (128, 0))
    elif Heath == 3:
        screen.blit(fullheart[icon], (0, 0))
        screen.blit(halfheart[icon], (64, 0))
        screen.blit(noheart[icon], (128, 0))
    elif Heath == 2:
        screen.blit(fullheart[icon], (0, 0))
        screen.blit(noheart[icon], (64, 0))
        screen.blit(noheart[icon], (128, 0))
    elif Heath == 1:
        screen.blit(halfheart[icon], (0, 0))
        screen.blit(noheart[icon], (64, 0))
        screen.blit(noheart[icon], (128, 0))

    if ability1 == "Sword":
        screen.blit(sword[icon], (1728, 888))
    if ability2 == "Shield":
        screen.blit(shield[icon], (1792, 760))
    if ability3 == "Red Berries":
        screen.blit(redberries[icon], (1601, 952))
    elif ability3 == "Blue Berries":
        screen.blit(blueberries[icon], (1601, 952))

    if accessinventory:
        arangeinventory = True
        screen.blit(inventory[icon], (0, 0))
        screen.blit(slots[icon], (175, 185))
        screen.blit(slots[icon], (769, 185))
        screen.blit(slots[icon], (1263, 185))
        screen.blit(swordslot[icon], (slotx, sloty))
        screen.blit(shieldslot[icon], (769, 185))
    pygame.display.update()


def update_fps():
    fps = str(int(clock.get_fps()))
    fps_text = font.render(fps, 1, white)
    return fps_text


while game:
    for event in pygame.event.get():
        print(event)
        if event.type == pygame.QUIT:
            sys.exit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                sys.exit()

        while startarea:
            screen.blit(startscreen, (0, 0))
            screen.blit(new, (650, 488))
            screen.blit(quit, (790, 888))
            for event in pygame.event.get():
                if event.type == pygame.MOUSEBUTTONDOWN:
                    startx, starty = pygame.mouse.get_pos()
                    if startx >= 624 and startx <= 1257 and starty >= 855 and starty <= 1028:
                        click.play()
                        sys.exit()
                    elif startx >= 624 and startx <= 1257 and starty >= 445 and starty <= 618:
                        click.play()
                        startarea = False
                    else:
                        None
            pygame.display.update()

        if event.type == pygame.K_UP and playery > 0: playery -= 5
        if event.type == pygame.K_DOWN and playery < 1920 - 64: playery += 5
        if event.type == pygame.K_LEFT and playerx > 0: playerx -= 5
        if event.type == pygame.K_RIGHT and playerx < 1080 - 64: playerx += 5

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_a:
                move_left = True
                move_right = False
            if event.key == pygame.K_d:
                move_right = True
                move_left = False
            if event.key == pygame.K_w:
                move_up = True
            if event.key == pygame.K_s:
                move_down = True
            if event.key == pygame.K_i:
                inv += 1

        if event.type == pygame.KEYUP:
            if event.key == pygame.K_a:
                move_left = False
            if event.key == pygame.K_d:
                move_right = False
            if event.key == pygame.K_w:
                move_up = False
            if event.key == pygame.K_s:
                move_down = False

    if (inv % 2) == 0:
        arangeinventory = False
        accessinventory = False
        pygame.mixer.music.unpause()
    else:
        arangeinventory = True
        accessinventory = True
        pygame.mixer.music.pause()

    if playery > 0:
        playery -= 10
    if playery < 1060 - 50:
        playery += 10
    if playerx > 0:
        playerx -= 10
    if playerx < 1920 - 50:
        playerx += 10

    if move_left:
        playerx -= 10
    if move_right:
        playerx += 10
    if move_up:
        playery -= 10
    if move_down:
        playery += 10

    redrawGameWindow()

    clock.tick(60)

Tags: imageeventfalsemoveifpngloadscreen
1条回答
网友
1楼 · 发布于 2024-07-05 08:54:09

执行而不是的代码总是最快的

正如拉比76所建议的,你每一帧都暂停/取消暂停音乐,这是没有必要的。使用KEYUP事件触发它:

        if event.key == pygame.K_i:
            inv += 1
            if ( inv % 2 ):
                arangeinventory = False
                accessinventory = False
                pygame.mixer.music.unpause()
            else:
                arangeinventory = True
                accessinventory = True
                pygame.mixer.music.pause()

当你blit一个图像时,PyGame需要将其转换为与目标表面相同的格式。你可以做一次,也可以每次都做。我个人喜欢一次:

walkRight = [ pygame.image.load('Wraith/Wraith_01.png').convert_alpha(), 
              pygame.image.load('Wraith/Wraith_02.png').convert_alpha(),
              ...

别忘了convert()你的背景和健康栏图片也要

在这个动画加载中有很多代码,为什么要在已有的重复帧中加载呢?目前,您正在加载和存储同一帧集四次。当然,它不会在播放过程中减慢执行速度,但会不必要地使用资源。只加载您需要的图像。12点循环,而不是48点

walkRight = []
for i in range( 1, 13 ):
    filename = 'Wraith_%02d.png' % ( i )
    filename = os.path.join( 'Wraith', filename ) 
    frame = pygame.image.load( filename ).convert_alpha()
    walkRight.append( frame )
 ### etc. for left and idle.

要绘制健康条,您需要做3个独立的blit()。也许您可以预先创建一个健康栏图像列表,只需在屏幕上显示一次

您似乎没有使用太多的else逻辑。这对执行时间的影响非常小,但是如果在一个紧密的循环中,它会无缘无故地进行比较检查。例如,考虑你的方向代码:

if move_right == False and move_left == False:
    screen.blit(idle[walkCount], (playerx, playery))
    walkCount += 1
if move_right:
    screen.blit(walkRight[walkCount], (playerx, playery))
    walkCount += 1
if move_left:
    screen.blit(walkLeft[walkCount], (playerx, playery))
    walkCount += 1

玩家可以同时向左和向右行走吗;对吧??如果我们已经检查过玩家没有移动,为什么还要再次测试

if move_right:
    screen.blit(walkRight[walkCount], (playerx, playery))  # go right
elif move_left:
    screen.blit(walkLeft[walkCount], (playerx, playery))   # go left
else:
    screen.blit(idle[walkCount], (playerx, playery))       # idle
walkCount += 1

与事件逻辑类似,单个事件不能有超过1个键值,请使用if/elif/else,以便进行较少的检查。一旦得出结果,就不再进行进一步的测试

        if event.key == pygame.K_a:
            move_left = True
            move_right = False
        elif event.key == pygame.K_d:
            move_right = True
            move_left = False
        elif event.key == pygame.K_w:
            move_up = True
        ... etc.

相关问题 更多 >