Как сделать pygame.key.get_pressed () более отзывчивым? - PullRequest
2 голосов
/ 19 июня 2020

Вот начало моего кода для игры со змейкой. Между нажатием клавиши со стрелкой и фактическим поворотом змейки есть досадная задержка.

Трудно точно повернуть и схватить «яблоко».

Я бы хотел, чтобы это было более отзывчивым. Как я могу настроить свой код, чтобы сделать поворот более отзывчивым?

import random
import pygame
pygame.init()

#----------------------------
# CONSTANTS
#----------------------------

window_width = 800
window_height = 800
segment_size = 24

win = pygame.display.set_mode((window_width, window_height))
pygame.display.set_caption('Snake Game')

#----------------------------
# CLASSES
#----------------------------
class Segment:
    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.width = segment_size
        self.height = segment_size
        self.vel = segment_size
        self.dir = 'right'

    def move(self):
        if self.dir == 'right':
            self.x += self.vel
        elif self.dir == 'left':
            self.x -= self.vel
        elif self.dir == 'up':
            self.y -= self.vel
        else:
            self.y += self.vel

class Apple:
    def __init__(self):
        self.x = (random.randint(0, window_width//segment_size)) * segment_size
        self.y = (random.randint(0, window_height//segment_size)) * segment_size
        self.width = segment_size
        self.height = segment_size
        self.vel = segment_size

#----------------------------
# FUNCTIONS
#----------------------------

def draw_grid(win):
    for x in range (0, window_width, segment_size):
        pygame.draw.line(win, (75, 75, 75), (x, 0), (x, window_height), 1)
    for y in range (0, window_height, segment_size):
        pygame.draw.line(win, (75, 75, 75), (0, y), (window_width, y), 1)

#----------------------------
# REDRAW WINDOW
#----------------------------

def redraw_window(win):
    win.fill((0, 0, 0)) # fill screen with black
    draw_grid(win) # draw grid
    pygame.draw.rect(win, (255, 255, 255), (s.x, s.y, s.width, s.height)) # draw snake
    pygame.draw.rect(win, (255, 0, 0), (a.x, a.y, a.width, a.height)) # draw apple
    s.move() # move snake
    pygame.display.update()

#----------------------------
# MAIN GAME LOOP
#----------------------------
clock = pygame.time.Clock()

segments = []
s = Segment(48, 48)
a = Apple()

running = True
while running:    

    clock.tick(30)

    # listen for window closure
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    # listen for key presses
    keys = pygame.key.get_pressed()
    for key in keys:
        if keys[pygame.K_LEFT]:
            s.dir = 'left'
        if keys[pygame.K_RIGHT]:
            s.dir = 'right'
        if keys[pygame.K_UP]:
            s.dir = 'up'
        if keys[pygame.K_DOWN]:
            s.dir = 'down'

    redraw_window(win)

pygame.quit()

Есть ли что-нибудь еще, что вы могли бы сделать здесь, чтобы оптимизировать код на этом этапе. Спасибо!

Ответы [ 2 ]

1 голос
/ 23 июня 2020

Увеличьте вашу тактовую частоту с 30 до 60 или 90, так как это будет обновлять вашу игру чаще:

clock.tick(90)

вместо

clock.tick(30)

, просто убедитесь, что вы уменьшили скорость на которого движется ваша змея, потому что увеличение тактовой частоты будет означать больше итераций игры l oop в секунду, и, следовательно, движение змеи будет увеличиваться чаще

1 голос
/ 23 июня 2020

Это:

# listen for key presses
keys = pygame.key.get_pressed()
for key in keys:
    if keys[pygame.K_LEFT]:
        s.dir = 'left'
    if keys[pygame.K_RIGHT]:
        s.dir = 'right'
    if keys[pygame.K_UP]:
        s.dir = 'up'
    if keys[pygame.K_DOWN]:
        s.dir = 'down'

не нужно.

Вы не используете переменную key, поэтому нет смысла использовать это для l oop. Вместо этого сделайте это:

# listen for key presses
keys = pygame.key.get_pressed()

if keys[pygame.K_LEFT]:
    s.dir = 'left'
if keys[pygame.K_RIGHT]:
    s.dir = 'right'
if keys[pygame.K_UP]:
    s.dir = 'up'
if keys[pygame.K_DOWN]:
    s.dir = 'down'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...