详解Pygame 移动矩形物体

  • Post category:Python

Pygame 是一款基于 Python 语言的游戏开发库,它提供了所有游戏开发所需要的必要工具,包括图像处理、音频处理、事件处理、窗口管理等功能。在 Pygame 中,开发者不仅可以制作出复杂的游戏,还可以实现常见的图形应用程序。

移动矩形物体的方法如下:

  1. 创建窗口和矩形物体

首先,我们需要使用 Pygame 提供的函数创建一个窗口和一个矩形物体。代码如下:

import pygame

pygame.init()

WIDTH = 800
HEIGHT = 600

screen = pygame.display.set_mode((WIDTH, HEIGHT))

rect_size = (50, 50)
rect_pos = (WIDTH // 2 - rect_size[0] // 2, HEIGHT // 2 - rect_size[1] // 2)

rect = pygame.Rect(rect_pos, rect_size)

首先,我们使用pygame.init()初始化 Pygame 库,设置窗口的大小为(WIDTH, HEIGHT)。然后,我们通过pygame.display.set_mode()函数创建了一个具有指定大小的窗口,并将返回值存储在 screen 变量中。在创建窗口之后,我们定义了 rect_sizerect_pos 变量分别表示矩形的大小和位置,接着,我们使用 pygame.Rect() 函数将 rect_posrect_size 传递给它来创建一个 Rect 对象,用于描述矩形的位置和大小。注意,这里我们通过计算将矩形定位在了窗口的中心。

  1. 移动矩形

在 Pygame 中,通过监听键盘事件来控制矩形的移动。我们可以使用pygame.K_系列常量检测按下的按键并改变矩形的位置。

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

    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        rect.move_ip(-5, 0)
    elif keys[pygame.K_RIGHT]:
        rect.move_ip(5, 0)
    elif keys[pygame.K_UP]:
        rect.move_ip(0, -5)
    elif keys[pygame.K_DOWN]:
        rect.move_ip(0, 5)

    screen.fill((255, 255, 255))
    pygame.draw.rect(screen, (0, 0, 0), rect)

    pygame.display.update()

在主循环中,我们首先监听了 pygame.QUIT 事件,当用户关闭窗口时,我们调用 pygame.quit()sys.exit() 关闭程序。接下来,我们使用pygame.key.get_pressed()获取当前按下的按键信息,并根据按键信息更改矩形的位置。在检测到按键事件后,我们使用 move_ip() 方法来改变矩形的位置。该方法的参数是一个水平和垂直移动的像素数值。例如,rect.move_ip(-5, 0) 表示矩形向左移动 5 个像素。在每个主循环迭代中,我们都用白色清空窗口,并在矩形上绘制黑色方块。最后,我们使用 pygame.display.update() 函数更新视图。

示例 1:移动矩形绘制成文本

实际应用中,我们可以将矩形物体里到指定的区域最大值作为限制范围,这个范围内,使用类似文本编辑器的方式,让矩形可以输入一些字符。下面是一个简单的示例:

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

    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        rect.move_ip(-5, 0)
    elif keys[pygame.K_RIGHT]:
        rect.move_ip(5, 0)
    elif keys[pygame.K_UP]:
        rect.move_ip(0, -5)
    elif keys[pygame.K_DOWN]:
        rect.move_ip(0, 5)
    elif event.type == pygame.KEYDOWN and event.key == pygame.K_BACKSPACE and len(text) > 0:
        text = text[:-1]
    elif event.type == pygame.KEYDOWN and event.key == pygame.K_RETURN:
        print("Text entered: ", text)
        text = ""
    elif event.type == pygame.KEYDOWN and len(text) < 10:
        text += event.unicode

    screen.fill((255, 255, 255))
    pygame.draw.rect(screen, (0, 0, 0), rect)

    font = pygame.font.Font(None, 30) 
    text_surface = font.render(text, True, (0, 0, 0))
    screen.blit(text_surface, ((rect.centerx - text_surface.get_width() // 2), (rect.centery - text_surface.get_height() // 2)))

    pygame.display.update()

在本示例中,我们添加了一些新的事件处理逻辑。首先,我们将输入的字符存储在一个名为 text 的变量中。当用户按下 BACKSPACE 键时,我们会从 text 变量中删除最后一个字符。当用户按下 RETURN 键时,我们会在控制台中打印出 text 变量的值,并清空它。我们还限制了输入的字符数量不得超过 10 个。之后,我们使用 Pygame 的字体渲染功能将 text 变量渲染到矩形中心的文本框中。

示例 2:移动多个矩形

前面的示例中只有一个矩形,我们可以将它扩展为多个矩形,每个矩形都能够独立移动。

import pygame
pygame.init()

WIDTH = 800
HEIGHT = 600

screen = pygame.display.set_mode((WIDTH, HEIGHT))

rect_size = (50, 50)
rect_pos_list = [(100, 200), (300, 400), (500, 100)]

rect_list = []
for pos in rect_pos_list:
  rect = pygame.Rect((*pos, *rect_size))
  rect_list.append(rect)

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

  keys = pygame.key.get_pressed()
  if keys[pygame.K_LEFT]:
    for rect in rect_list:
      rect.move_ip(-5, 0)
  elif keys[pygame.K_RIGHT]:
    for rect in rect_list:
      rect.move_ip(5, 0)
  elif keys[pygame.K_UP]:
    for rect in rect_list:
      rect.move_ip(0, -5)
  elif keys[pygame.K_DOWN]:
    for rect in rect_list:
      rect.move_ip(0, 5)

  screen.fill((255, 255, 255))

  for rect in rect_list:
    pygame.draw.rect(screen, (0, 0, 0), rect)

  pygame.display.update()

在本示例中,我们定义了 3 个不同位置的矩形,并将它们存储在 rect_list 列表中。然后,我们在主循环中检测按键并移动所有矩形。在每个主循环迭代中,我们都会绘制所有的矩形。这允许我们同时移动所有矩形,并保持它们在同一画布上。