#python #optimization #pygame #pygame-surface
#python #оптимизация #pygame #pygame-поверхность
Вопрос:
Передо мной была поставлена задача создать игру с использованием pygame (я делаю snake, поэтому это должно быть легко… но я никогда не использовал pygame), поэтому использование более эффективного языка не вариант.Итак, мой вопрос в том, что я обновляю сетку snake слишком медленно, и у меня недостаточно опыта в pygame, чтобы исправить это, может кто-нибудь, кто поможет.Также в качестве примечания, если я только заполняю сетку, она не очищается за Змеей. Использование 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()
Комментарии:
1. Вы уверены,
drawGrid
что это делает вашу игру низкой? частота кадров в секунду ограниченаclock.tick(15)
(15 кадров в секунду)2. Я попытался увеличить это, и все, что он сделал, это замедлил загрузку, а затем запустил змею в стену.
Ответ №1:
Чтобы повысить производительность игры, нарисуйте сетку на 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()
Комментарии:
1. Большое вам спасибо, это очень помогает, я чувствую себя действительно глупо, спрашивая об этом, но я не могу изменить цвет фактических блоков в сетке, он просто постоянно черный, как мне это изменить Я оптимально хочу, чтобы между сетками было значение RGB (50,50,50), а линии сетки были (75,75,75)
2. Кроме того, в качестве примечания, с которым я возился, в любом случае поместите змею в сетку, когда блок не равен 10. (Я изменил его так, чтобы блоки сетки всегда были того же размера, что и змея, но он не совпадает с ним, и я не знаю, как я это сделаю)
3. @D.CMorgan 1. Я изменил ответ. Заполните (
surf.fill(grey)
) поверхность пояса перед рисованием сетки. 2. Это ошибка в вашем приложении. Однако это новый вопрос.