Snake-Game: Проблемы с постоянным движением змеи - PullRequest
0 голосов
/ 21 января 2019

Куб движется только один раз.

import time
import pygame

pygame.init()


class Window(object):
    def __init__(self, width, height, bg):
        self.width = width
        self.height = height
        self.bg = bg

    def create(self):
        return pygame.display.set_mode((self.width, self.height))

Проблема где-то здесь

class Cube(object):
    def __init__(self, surface, x, y, width, height, color):
        self.surface = surface
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.color = color

    def move(self, lead_x_change=0, lead_y_change=0):
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                lead_x_change = -20
            elif event.key == pygame.K_RIGHT:
                lead_x_change = 20
            elif event.key == pygame.K_UP:
                lead_y_change = -20
            elif event.key == pygame.K_DOWN:
                lead_y_change = 20
        self.x += lead_x_change
        self.y += lead_y_change

    def draw(self):
        pygame.draw.rect(self.surface, self.color, (self.x, self.y, self.width, self.height))


window = Window(800, 600, (0, 0, 0))
surface = window.create()

head = Cube(surface, 400, 300, 20, 20, (255, 255, 255))

запуск gameloop

gameloop = True
while gameloop:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            quit()

        head.move()

        surface.fill((0, 0, 0))
        head.draw()
        pygame.display.update()

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

Ответы [ 3 ]

0 голосов
/ 21 января 2019

В основном цикле, когда вы вызываете pygame.event.get(), программа ожидает, пока не произойдет новое событие. В Pygame только новое нажатие клавиши квалифицируется как «событие»; удерживание клавиши не будет непрерывно запускать «событие».

Вместо этого вам нужно будет вызвать другую функцию. Согласно этому вопросу , pygame.key.get_pressed(), вероятно, больше, чем вы ищете. Вы захотите изменить свой основной цикл, чтобы он работал, даже если событие отсутствует, например:

gameloop = True
while gameloop:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            quit()
    # Note the next line is un-indented, so it executes anyway
    head.move()
    surface.fill((0, 0, 0))
    head.draw()
    pygame.display.update()

А также исправьте метод move (), который будет структурирован следующим образом:

keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
    lead_x_changed = -1    # Will move much faster now
elif keys[pygame.K_RIGHT]:
...
0 голосов
/ 21 января 2019

На основании комментария, что OP хочет, чтобы движение происходило до тех пор, пока не будет нажата другая клавиша, в отличие от того, нажата ли клавиша, существует совершенно отдельное решение.Вместо этого код должен быть реорганизован, чтобы вместо этого включить переменную для последнего нажатого направления, и синхронизированный цикл для непрерывного перемещения в этом направлении.

В методе __init__ куба добавьте:

self.lastDir = null

Создайте новый метод в классе Cube для обработки ключевого события:

def updateDir(self, event):
    if event.type == pygame.KEYDOWN and event.key in [pygame.K_LEFT, pygame.K_RIGHT, pygame.K_UP, pygame.K_DOWN]:
        self.lastDir = event.key

Измените метод move, чтобы он вместо этого основывался на self.lastDir вместо event.key:

if self.lastDir != null:
    if self.lastDir == pygame.K_LEFT:
        lead_x_change = -20
...

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

gameloop = True
while gameloop:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            quit()
        head.updateDir(event)
    head.move()
    surface.fill((0, 0, 0))
    head.draw()
    pygame.display.update()
    # Insert time.sleep(seconds) here if too fast
0 голосов
/ 21 января 2019

Может быть потому, что когда вы вызываете метод

head.move()

и в параметрах метода установите изменения отведений на 0. и когда это называется, это всегда 0.

Попробуйте изменить

def move(self, lead_x_change=0, lead_y_change=0):

до

def move(self, lead_x_change, lead_y_change):

Я не уверен на 100%, что это сработает.

Дайте мне знать!

...