python - 我如何优化这个简单的 python pygame 代码
问题描述
我已经面临使用 pygame 制作游戏的挑战(我正在制作蛇,所以它应该很容易......但我从未使用过 pygame)所以使用更有效的语言不是一种选择。所以我的问题是我更新蛇网格太慢了,而且我在 pygame 中没有足够的经验来解决这个问题,任何有帮助的人都可以。另外作为一个注释,如果我只填充网格,它不会在 Snake 后面清除。使用 python 3.8
import pygame
import time
import random
pygame.init()
display_width = 800
display_height = 600
display = pygame.display.set_mode((display_width,display_height))
pygame.display.set_caption("Snake")
pureblue = (0,0,255)
purered = (255,0,0)
puregreen = (0,255,0)
white = (255,255,255)
black = (1,1,1)
grey = (50,50,50)
darkgrey = (25,25,25)
clock = pygame.time.Clock()
snake_block = 10
snake_speed = 30
font_style = pygame.font.SysFont(None, 50)
def drawGrid():
blockSize = 10
for x in range(display_width):
for y in range(display_height):
rect = pygame.Rect(x*blockSize, y*blockSize,blockSize, blockSize)
pygame.draw.rect(display, darkgrey, rect, 1)
def message(msg, colour):
text = font_style.render(msg, True, colour)
display.blit(text, [display_width/2, display_height/2])
def SnakeGameLoop():
game_over = False
X = display_width/2
Y = display_height/2
X_change = 0
Y_change = 0
while not game_over:
for event in pygame.event.get():
if event.type == pygame.QUIT:
game_over = True
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
X_change = -10
Y_change = 0
elif event.key == pygame.K_RIGHT:
X_change = 10
Y_change = 0
elif event.key == pygame.K_UP:
X_change = 0
Y_change = -10
elif event.key == pygame.K_DOWN:
X_change = 0
Y_change = 10
if X >= display_width or X < 0 or Y >= display_height or Y < 0:
game_over = True
X += X_change
Y += Y_change
display.fill(grey)
drawGrid()
pygame.draw.rect(display,puregreen,[X,Y,10,10])
pygame.display.update()
clock.tick(15)
message("You lost", purered)
pygame.display.update()
time.sleep(2)
pygame.quit()
quit()
SnakeGameLoop()
解决方案
为了提高游戏的性能,在应用程序循环之前pygame.Surface
,在屏幕大小的对象上绘制网格:
def drawGrid(surf):
surf.fill(grey)
blockSize = 10
for x in range(display_width):
for y in range(display_height):
rect = pygame.Rect(x*blockSize, y*blockSize,blockSize, blockSize)
pygame.draw.rect(surf, darkgrey, rect, 1)
grid_surf = pygame.Surface(display.get_size())
drawGrid(grid_surf)
blit
在应用程序循环中,每帧显示一次表面,而不是每帧绘制一次网格:
def SnakeGameLoop():
# [...]
while not game_over:
# [...]
display.blit(grid_surf, (0, 0))
pygame.draw.rect(display,puregreen,[X,Y,10,10])
pygame.display.update()
推荐阅读
- ios - Xcode 12.5 调试器自 macOS Big Sur 11.3 起运行缓慢(本机 Swift 项目)
- java - 如何在java中提取前两个字符和后两个字符之间的字符串?
- time - 如何验证时间是否在SSRS中的时间范围内
- javascript - 无法合并两个对象数组
- kubernetes - 工作节点上的 kubernetes 内存承诺限制是什么?
- javascript - 理解 JavaScript 中的逻辑非运算符
- opencv - 删除“从区域图像中的文本和地图标记”?
- java - 给定一个无限序列,将其分解为多个区间,并返回一个新的无限序列,其中包含每个区间的平均值
- sql - 如何使总和匹配位于不同行中的两个 ID - Redshift
- javascript - 返回带有回调函数参数的函数