在网格中移动一个正方形

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 循环迭代中绘制的(除了浪费地在屏幕外绘制新的网格线),就像你之前绘制玩家的所有位置一样。

要解决这个问题,您的游戏绘制循环的结构应如下所示:

  1. 清除屏幕。
  2. 绘制整个网格,而不是一次只绘制两条线。在函数中执行此操作(例如 draw_grid)。
  3. 在新玩家位置绘制矩形。同样在函数中执行此操作(例如 draw_player)。
  4. 冲洗并重复下一次迭代!

实施这些小改动,您的代码可能如下所示:

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"。随着您的代码变得越来越大,推断哪些函数正在更改这些变量将变得更加困难,因为每个函数都可能访问这些变量。