蛇游戏:蛇的连续运动遇到问题

时间:2019-01-21 16:13:50

标签: python pygame move

多维数据集仅移动一次。

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 = 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 :(得分:0)

也许是因为在您调用方法时

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%肯定会行得通。

让我知道!

答案 1 :(得分:0)

在主循环中,当您调用pygame.event.get()时,程序正在等待直到发生新事件。在pygame中,只有新的按键才可称为“事件”;按住键不会持续触发“事件”。

相反,您将需要调用其他函数。 As per this questionpygame.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]:
...

答案 2 :(得分:0)

基于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
...

最后,修改主循环以定期调用move方法,而不是等待新的移动:

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