在网格中移动一个正方形
moving a square in a grid
在方格中移动
import pygame
from pygame.locals import *
pygame.init()
clock = pygame.time.Clock()
w = 1008
h = 640
left = 16
top = 16
width = 16
height = 16
YELLOW = (255, 255, 55)
BLUE = (0, 0, 255)
BLACK = (0, 0, 0)
bg = (255, 255, 255)
x = 0
y = 0
screen = pygame.display.set_mode((w, h))
gameExit = False
while not gameExit:
for event in pygame.event.get():
if event.type == pygame.QUIT:
gameExit = True
if event.type == KEYDOWN:
if event.key == K_DOWN:
top += 16
if event.key == K_UP:
top -= 16
if event.key == K_RIGHT:
left += 16
if event.key == K_LEFT:
left -= 16
x += 16
y += 16
screen.fill(BLACK)
pygame.draw.rect(screen, [255, 255, 55], [left, top, width, height], 0)
pygame.draw.line(screen, bg, (w - 16, y), (16, y), 1)
pygame.draw.line(screen, bg, (x, h - 16), (y, 16), 1)
pygame.display.flip()
pygame.quit()
此时如果我 #out screen.fill() 网格出现在屏幕上并且 rect 移动时有一个尾巴在后面,如果我从 screen.fill() 网格中拿走 # 就会消失但 rect 移动正确,没有尾巴我希望两者都发生。
您的代码存在的问题是它没有按照您的预期运行。每次迭代 while 循环时,将 x 和 y 值递增 16 并绘制一条水平线和一条垂直线。这似乎绘制了一个网格,因为 屏幕不会在您的 while 循环迭代之间自动清除。然而,结果是,过了一会儿,你的 x 和 y 值增加到你开始绘制越来越多屏幕外的网格线的程度(尝试打印出开始以及循环中这些行的终点(如果不清楚)!
当您在开始绘制网格线之前添加 screen.fill(BLACK)
调用时,您基本上清除了整个屏幕。由于您没有重新绘制旧的网格线,因此只会绘制下一对网格线,其余的将丢失。由于新的一对网格线最终会离开屏幕(如第一段中所述),因此您的代码似乎没有绘制任何网格线。
当您注释掉 screen.fill(BLACK)
时,以前的绘图不会被清除。所有网格都是在多次 while 循环迭代中绘制的(除了浪费地在屏幕外绘制新的网格线),就像你之前绘制玩家的所有位置一样。
要解决这个问题,您的游戏绘制循环的结构应如下所示:
- 清除屏幕。
- 绘制整个网格,而不是一次只绘制两条线。在函数中执行此操作(例如
draw_grid
)。
- 在新玩家位置绘制矩形。同样在函数中执行此操作(例如
draw_player
)。
- 冲洗并重复下一次迭代!
实施这些小改动,您的代码可能如下所示:
import pygame
from pygame.locals import *
def draw_grid():
screen.fill(BLACK)
for y in range(height, h, height):#horizontal lines
pygame.draw.line(screen, bg, (width, y), (w - width, y), 1)
for x in range(width, w, width):#vertical lines
pygame.draw.line(screen, bg, (x, height), (x, h - height), 1)
def draw_player():
pygame.draw.rect(screen, [255, 255, 55], [left, top, width, height], 0)
pygame.init()
clock = pygame.time.Clock()
w = 1008
h = 640
left = 16
top = 16
width = 16
height = 16
YELLOW = (255, 255, 55)
BLUE = (0, 0, 255)
BLACK = (0, 0, 0)
bg = (255, 255, 255)
x = 0
y = 0
screen = pygame.display.set_mode((w, h))
gameExit = False
while not gameExit:
for event in pygame.event.get():
if event.type == pygame.QUIT:
gameExit = True
if event.type == KEYDOWN:
if event.key == K_DOWN:
top += 16
if event.key == K_UP:
top -= 16
if event.key == K_RIGHT:
left += 16
if event.key == K_LEFT:
left -= 16
draw_grid()
draw_player()
pygame.display.flip()
pygame.quit()
话虽这么说,此代码还有很多改进空间,我将留给您。最大的问题是您正在使用 一组全局变量 。这些基本上是 while 循环之前列出的所有变量。当它们可变时,使用此类全局变量是 "evil"。随着您的代码变得越来越大,推断哪些函数正在更改这些变量将变得更加困难,因为每个函数都可能访问这些变量。
在方格中移动
import pygame
from pygame.locals import *
pygame.init()
clock = pygame.time.Clock()
w = 1008
h = 640
left = 16
top = 16
width = 16
height = 16
YELLOW = (255, 255, 55)
BLUE = (0, 0, 255)
BLACK = (0, 0, 0)
bg = (255, 255, 255)
x = 0
y = 0
screen = pygame.display.set_mode((w, h))
gameExit = False
while not gameExit:
for event in pygame.event.get():
if event.type == pygame.QUIT:
gameExit = True
if event.type == KEYDOWN:
if event.key == K_DOWN:
top += 16
if event.key == K_UP:
top -= 16
if event.key == K_RIGHT:
left += 16
if event.key == K_LEFT:
left -= 16
x += 16
y += 16
screen.fill(BLACK)
pygame.draw.rect(screen, [255, 255, 55], [left, top, width, height], 0)
pygame.draw.line(screen, bg, (w - 16, y), (16, y), 1)
pygame.draw.line(screen, bg, (x, h - 16), (y, 16), 1)
pygame.display.flip()
pygame.quit()
此时如果我 #out screen.fill() 网格出现在屏幕上并且 rect 移动时有一个尾巴在后面,如果我从 screen.fill() 网格中拿走 # 就会消失但 rect 移动正确,没有尾巴我希望两者都发生。
您的代码存在的问题是它没有按照您的预期运行。每次迭代 while 循环时,将 x 和 y 值递增 16 并绘制一条水平线和一条垂直线。这似乎绘制了一个网格,因为 屏幕不会在您的 while 循环迭代之间自动清除。然而,结果是,过了一会儿,你的 x 和 y 值增加到你开始绘制越来越多屏幕外的网格线的程度(尝试打印出开始以及循环中这些行的终点(如果不清楚)!
当您在开始绘制网格线之前添加 screen.fill(BLACK)
调用时,您基本上清除了整个屏幕。由于您没有重新绘制旧的网格线,因此只会绘制下一对网格线,其余的将丢失。由于新的一对网格线最终会离开屏幕(如第一段中所述),因此您的代码似乎没有绘制任何网格线。
当您注释掉 screen.fill(BLACK)
时,以前的绘图不会被清除。所有网格都是在多次 while 循环迭代中绘制的(除了浪费地在屏幕外绘制新的网格线),就像你之前绘制玩家的所有位置一样。
要解决这个问题,您的游戏绘制循环的结构应如下所示:
- 清除屏幕。
- 绘制整个网格,而不是一次只绘制两条线。在函数中执行此操作(例如
draw_grid
)。 - 在新玩家位置绘制矩形。同样在函数中执行此操作(例如
draw_player
)。 - 冲洗并重复下一次迭代!
实施这些小改动,您的代码可能如下所示:
import pygame
from pygame.locals import *
def draw_grid():
screen.fill(BLACK)
for y in range(height, h, height):#horizontal lines
pygame.draw.line(screen, bg, (width, y), (w - width, y), 1)
for x in range(width, w, width):#vertical lines
pygame.draw.line(screen, bg, (x, height), (x, h - height), 1)
def draw_player():
pygame.draw.rect(screen, [255, 255, 55], [left, top, width, height], 0)
pygame.init()
clock = pygame.time.Clock()
w = 1008
h = 640
left = 16
top = 16
width = 16
height = 16
YELLOW = (255, 255, 55)
BLUE = (0, 0, 255)
BLACK = (0, 0, 0)
bg = (255, 255, 255)
x = 0
y = 0
screen = pygame.display.set_mode((w, h))
gameExit = False
while not gameExit:
for event in pygame.event.get():
if event.type == pygame.QUIT:
gameExit = True
if event.type == KEYDOWN:
if event.key == K_DOWN:
top += 16
if event.key == K_UP:
top -= 16
if event.key == K_RIGHT:
left += 16
if event.key == K_LEFT:
left -= 16
draw_grid()
draw_player()
pygame.display.flip()
pygame.quit()
话虽这么说,此代码还有很多改进空间,我将留给您。最大的问题是您正在使用 一组全局变量 。这些基本上是 while 循环之前列出的所有变量。当它们可变时,使用此类全局变量是 "evil"。随着您的代码变得越来越大,推断哪些函数正在更改这些变量将变得更加困难,因为每个函数都可能访问这些变量。