python - Pygame屏幕抖动减慢游戏如何修复?
问题描述
所以我试图在玩家跳跃时为他制作屏幕震动
每当我对我的 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
我的完整游戏代码:脚本
我不确定为什么它可以在我的测试版本上运行,即使我对我的游戏做了同样的事情,为什么它在我的游戏上滞后,但在这里没有滞后,任何有用的修复都值得赞赏!当我的播放器毫无延迟地跳跃时,我正在尝试进行屏幕抖动,谢谢!
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,y,height,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,50,white)
player2 = player(290,250,150,50,white)
player3 = player(350,250,50,150,white)
def redraw():
display.fill((0,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
方法的可选 area 参数来提高性能:
也可以传递一个可选的区域矩形。这表示要绘制的源 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)
推荐阅读
- c - 无法打开或关闭绿色/蓝色 LED STM32F429ZI - Nucleo 板?
- vb.net - 字符串未被识别为有效的 DateTime Datetimepicker vb.net
- game-maker - 从字符串中删除标签
- pyspark - 如何将列表的 RDD 转换为压缩列表的 RDD?
- python-3.x - 运行放置在 PATH (cygwin) 中的 Python 脚本
- c++ - 从触摸回调访问矢量元素的方法时出现 BAD ACCESS 错误
- mysql - 在哈希分片中,是否有一种算法可以在 UUID V1 上启用两次哈希分区?
- android - Android - 带有 Rxkotlin 过滤器的 Kotlin 密封类
- html - 滚动条出现在引导构建网页的底部
- apache-spark - 我们可以在不爆炸蜂巢/火花中的行的情况下进行汇总或多维数据集吗