Pygame 是一款基于 Python 语言的游戏开发库,它提供了所有游戏开发所需要的必要工具,包括图像处理、音频处理、事件处理、窗口管理等功能。在 Pygame 中,开发者不仅可以制作出复杂的游戏,还可以实现常见的图形应用程序。
移动矩形物体的方法如下:
- 创建窗口和矩形物体
首先,我们需要使用 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_size
和 rect_pos
变量分别表示矩形的大小和位置,接着,我们使用 pygame.Rect()
函数将 rect_pos
和 rect_size
传递给它来创建一个 Rect
对象,用于描述矩形的位置和大小。注意,这里我们通过计算将矩形定位在了窗口的中心。
- 移动矩形
在 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
列表中。然后,我们在主循环中检测按键并移动所有矩形。在每个主循环迭代中,我们都会绘制所有的矩形。这允许我们同时移动所有矩形,并保持它们在同一画布上。