蛇游戏:蛇的连续移动有问题
Snake-Game: Having problems with continious movement of the snake
立方体只移动一次。
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()
立方体移动,但仅在按键后移动一次。按下方向后,它应该会继续朝一个方向移动。
不知道怎么让它一直动,看了很多视频还是不明白
可能是因为你在调用方法的时候
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% 确定这会起作用。
告诉我!
在主循环中,当您调用pygame.event.get()
时,程序会一直等待,直到有新的事件发生。在 pygame 中,只有一个新的按键符合 "event";按住一个键不会连续触发 "event".
相反,您将需要调用不同的函数。 As per this question、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]:
...
根据 OP 希望在按下另一个键之前发生移动的评论,而不是是否按住某个键,涉及到一个完全独立的解决方案。相反,必须重构代码以包含一个用于表示最后按下的方向的变量,以及一个持续朝该方向移动的定时循环。
在Cube的__init__
方法中,添加:
self.lastDir = null
在 Cube 中创建一个新方法 class 来处理按键事件:
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
立方体只移动一次。
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()
立方体移动,但仅在按键后移动一次。按下方向后,它应该会继续朝一个方向移动。 不知道怎么让它一直动,看了很多视频还是不明白
可能是因为你在调用方法的时候
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% 确定这会起作用。
告诉我!
在主循环中,当您调用pygame.event.get()
时,程序会一直等待,直到有新的事件发生。在 pygame 中,只有一个新的按键符合 "event";按住一个键不会连续触发 "event".
相反,您将需要调用不同的函数。 As per this question、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]:
...
根据 OP 希望在按下另一个键之前发生移动的评论,而不是是否按住某个键,涉及到一个完全独立的解决方案。相反,必须重构代码以包含一个用于表示最后按下的方向的变量,以及一个持续朝该方向移动的定时循环。
在Cube的__init__
方法中,添加:
self.lastDir = null
在 Cube 中创建一个新方法 class 来处理按键事件:
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