Pygame 屏幕抖动减慢游戏速度 如何修复?

问题描述

所以我试图在玩家跳跃时为他做一个屏幕抖动

video 当我对我的 render_offset 进行 blitting 时,它会在我的玩家跳跃时让我的屏幕抖动,当我加载到我的游戏中时,游戏会运行得很慢,我不知道为什么?我正在尝试为我的游戏实现一种屏幕抖动方法,但这总是会使我的游戏启动缓慢,我不知道为什么,因为当我添加这部分以使我的屏幕抖动工作时,我只是将我的 render_offset 写入我的窗口我在我的游戏中加载所有东西都运行缓慢并且屏幕抖动工作但如果我删除它就不会工作并且游戏将运行平稳我需要一种方法来使这项工作不滞后我的屏幕谢谢!

        window.blit(window,(render_offset))

如果我们点击空格,屏幕抖动是如何工作的,那么我们的抖动将等于 20 在它下面说如果震动不是> 0:然后保持-震动为1然后我们有一个带有列表的渲染变量然后在它下面我们说如果震动然后随机化两个列表

         # screenshakey
        if keys[pygame.K_SPACE]:
            shake = 20

        if shake > 0:
            shake -= 1

        render_offset = [0,0]
        if shake :
            render_offset[0] = random.randint(0,8) - 4
            render_offset[1] = random.randint(0,8) - 4

我的完整游戏代码Script

我不确定为什么它适用于我的测试版本,即使我为我的游戏做了同样的事情,为什么它在我的游戏中滞后,但在这里没有滞后任何有用的修复表示赞赏!我正在尝试在我的播放器无延迟跳跃时进行屏幕抖动,谢谢!

import pygame,time,random
pygame.init()

WINDOW_SIZE = (500,500)
window = pygame.display.set_mode((WINDOW_SIZE),pygame.NOFRAME)
display = pygame.Surface((500,500)) # used as the surface for rendering,which is scaled

class player:
    def __init__(self,x,y,height,width,color):
        self.x = x
        self.y = y
        self.height = height
        self.width = width
        self.color = color
        self.rect = pygame.Rect(x,width)
    def draw(self):
        self.rect.topleft = (self.x,self.y)
        pygame.draw.rect(display,self.color,self.rect)

white = (205,105,205)
player1 = player(250,250,50,white)
player2 = player(290,150,white)
player3 = player(350,white)

def redraw():
    display.fill((0,0))
    player1.draw()
    player2.draw()
    player3.draw()


run = True
fps = 60
clock = pygame.time.Clock()

screenshake = 0
while run:
    clock.tick(fps)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    keys = pygame.key.get_pressed()
# 
     # screenshakey
    if keys[pygame.K_SPACE]:
        screenshake = 30

    if keys[pygame.K_RIGHT]:
        player1.x += 4
    if keys[pygame.K_LEFT]:
        player1.x -= 4
        
        
    if screenshake > 0:
        screenshake -= 1

    render_offset = [0,0]
    if screenshake:
        render_offset[0] = random.randint(0,8) - 4
        render_offset[1] = random.randint(0,8) - 4

    redraw()
    window.blit(pygame.transform.scale(display,WINDOW_SIZE),render_offset)

    pygame.display.update()

pygame.quit()

解决方法

尝试使用 blit 方法的可选区域参数来提高性能:

也可以传递一个可选的区域矩形。这表示要绘制的源 Surface 的一小部分。

计算 display Surface 的缩小面积:

pos = max(0,render_offset[0]),max(0,render_offset[1])
    
area_rect = display.get_rect()
area_rect.width -= abs(render_offset[0])
area_rect.height -= abs(render_offset[1])
    
window.blit(display,pos,area_rect)