Pygame l oop редко проверяет скорость - PullRequest
6 голосов
/ 03 августа 2020

Я пытаюсь воссоздать змею в pygame (python 3), и то, что я пытаюсь сделать, это каждый кадр, проверять скорость змеи, проверяя нажатие клавиш, но очень редко понимает, что я нажимаю клавишу, что я делаю не так / что мне делать вместо этого (код ниже), я не понимаю, почему это не работает, поскольку все остальное может работать мгновенно, например, функция очистки и даже handle (), который делает очень похожий вещь, поэтому для меня не имеет смысла, почему она не работает

import pygame
from pygame.locals import *
import math
import random

pygame.init()
display = pygame.display.set_mode((512, 512))
pygame.display.set_caption("Snake")
display.fill((255, 255, 255))

def handle():
    global x, y
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()

def make_apple():
    x, y = random.randint(0, 502), random.randint(0, 502)
    pygame.draw.rect(display, (255, 0, 0), (x, y, 10, 10))
    return x, y

# -- COLLISION DETECTION -- #

def r(fox, foy, cR, sox, soy):
    dx = abs(fox - sox)
    dy = abs(foy - soy)
    if dx < cR and dy < cR:
        return True
    else:
        return False

def clear(aX, aY):
    global x, y
    display.fill((255, 255, 255))
    pygame.draw.rect(display, (255, 0, 0), (aX, aY, 10, 10))
    draw_snake(x, y)

def draw_snake(x, y):
    pygame.draw.rect(display, (0, 255, 0), (x, y, 10, 10))

def set_vel():
    for event in pygame.event.get():
        if event.type == KEYDOWN:
            print("KEY")
            if event.key == K_LEFT:
                yVel = 0
                xVel = -1
            elif event.key == K_RIGHT:
                yVel = 0
                xVel = 1
            elif event.key == K_UP:
                yVel = -1
                xVel = 0
            elif event.key == K_DOWN:
                yVel = 1
                xVel = 0
            return xVel, yVel
    return 0, 0
def update_pos(x, y, xV, yV):
    x += xV
    y += yV
    return x, y

aX, aY = make_apple()
x, y = 256, 256
length = 1
eaten = False

while True:
    velX, velY = set_vel()
    clear(aX, aY)
    handle()
    x, y = update_pos(x, y, velX, velY)
    if eaten:
        aX, aY = make_apple()
        eaten = False
    pygame.display.update()
    if r(x, y, 3, aX, aY):
        display.fill((255, 255, 255))
        eaten = True

Ответы [ 2 ]

4 голосов
/ 03 августа 2020

Ваша проблема в том, что когда вы вызываете pygame.event.get(), эта функция не только получает события, но и удаляет их из очереди. Это означает, что вызов его дважды за кадр (как в set_vel и handle) может дать странные результаты.

Когда я пишу pygame, у меня есть for event in pygame.event.get() l oop в моем while True. Попробуйте сделать это и переместите обработку выхода и изменение скорости в True l oop вместо их собственных функций.

3 голосов
/ 03 августа 2020

Как упоминалось в другом ответе, pygame.event.get() получить все сообщения и удалить их из очереди. Таким образом, либо 1-й, либо 2-й l oop получает событие, но никогда оба цикла не получат все события. Это приводит к тому, что некоторые события кажутся пропущенными.

Получите список событий один раз в основном приложении l oop и передайте этот список функциям:

def handle(events):
    global x, y
    for event in events:
        if event.type == QUIT:
            pygame.quit()
def set_vel(events):
    for event in events:
        # [...]
while True:
    events = pygame.event.get()
  
    velX, velY = set_vel(events )
    clear(aX, aY)
    handle(events)

    # [...] 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...