3.Pygame Rect
在每个游戏中,每个对象都需要一组固定的边界来定义它占据的空间。当对象与其他对象交互或“碰撞”时,这些固定边界是必不可少的。
通过定义这些边界,游戏能够检测到两个或多个边界何时重叠或接触。随后处理哪些对象正在交互。
常见的例子是当玩家的剑与敌人相撞时,或者当游戏中的两辆汽车相撞时,甚至当玩家站在地上时。这些类型的交互通常称为碰撞检测。
Rect对象
在 Pygame 中,我们围绕我们创建的对象创建“矩形”(简称 Rect)以定义它的边界。
Pygame 是一个非常基本的游戏库,它只提供矩形边界,不提供球体或不规则形状等其他边界。这就是为什么它只用于小型项目。
这个矩形对象与 Sprite 本身具有相同的宽度和高度,并代表它的边界。
Pygame 带有几个函数,可以检测两个或多个矩形对象是否相互交叉,也称为“碰撞”。检测这些交叉点的行为就是所谓的碰撞检测。
在 Pygame 中创建一个矩形
实际上有几种方法可以在 Pygame 中创建 Rect。
使用 Pygame 矩形类
在 Pygame 中创建 Rect 对象的最基本方法是简单地将两个元组传递给Pygame.Rect()类。第一个元组 (left, top) 表示矩形在窗口中的位置,而第二个元组 (width, height) 表示矩形的尺寸。
object = pygame.Rect((20, 50), (50, 100))
上面的代码在坐标 (20, 50) 处创建了一个矩形,宽度为 50,高度为 100。
使用图像创建矩形
这是 Pygame 游戏教程中挑选出来的一个示例。通常我们为我们的 Sprites 导入图像,例如下面示例中的 Player Sprite。
class Player(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = pygame.image.load("Player.png")
self.rect = self.image.get_rect()
不必找出图像的尺寸并创建合适的矩形对象,您只需get_rect()在图像对象上使用该函数,自动创建适当的矩形尺寸。
将矩形绘制到屏幕上
通常我们使用 Rect只是为了碰撞检测,但有时我们实际上想在屏幕上绘制 矩形 形状。我们不能为此使用该blit()功能,而是需要使用以下方法。
pygame.draw.rect(surface, color, pygame.Rect(30, 30, 60, 60))
Pygame 矩形函数
Pygame 中有十几种不同的矩形相关函数,所以我们不会在不太常见或不重要的函数上浪费太多时间。
碰撞矩形
colliderect() 函数用于检查两个矩形对象是否相互交叉/重叠/碰撞。请注意,如果只有边界接触,则返回 False (0)。
import pygame
object1 = pygame.Rect((20, 50), (50, 100))
object2 = pygame.Rect((10, 10), (100, 100))
object3 = pygame.Rect((0, 0), (50, 50))
print(object1.colliderect(object2))
print(object1.colliderect(object3))
print(object2.colliderect(object3))
对于检测到的任何碰撞,返回 True (1),否则返回 False (0)。
在 rect 对象上使用上述方法,您可以确定它是否与传递给它的参数的 rect 对象有联系。简单来说,您可以判断精灵 A 是否与精灵 B 接触。
移动矩形
另一个重要的函数是使用move()一组 X 和 Y 坐标将矩形移动到的函数,然后返回一个新的矩形对象。
object1 = pygame.Rect((20, 50), (50, 100))
object2 = object1.move(100, 100)
print(object1.topleft)
print(object2.topleft)
(20, 50)
(120, 150)
或者,您可以使用move_ip()功能。move_ip()与move()的区别是,move_ip是直接对rect对象进行修改,而move对rect对象的属性进行修改后,会返回一个新的对象。
object1 = pygame.Rect((20, 50), (50, 100))
object1.move_ip(100, 100)
print(object1.topleft)
(120, 150)
其他Rect方法
碰撞点
与 colliderect 相同,但用于比较一对坐标而不是另一个矩形对象。
object1 = pygame.Rect((20, 50), (50, 100))
print(object1.collidepoint(50, 75))
1
碰撞列表
collidelist是一个将矩形与矩形对象列表进行比较的函数。如果检测到与列表中任何矩形的冲突,则返回它的索引。
object1 = pygame.Rect((20, 50), (50, 100))
object2 = pygame.Rect((10, 10), (100, 100))
object3 = pygame.Rect((0, 0), (50, 50))
object4 = pygame.Rect((100, 100), (30, 50))
list = [object4, object3, object2]
print(object1.collidelist(list))
2
注意:仅返回第一次碰撞的索引。
Rect.update()方法
update()方法可以修改Rect对象的所有属性。它是 Rect 类的精确复制品,需要两个元组。
import pygame
object1 = pygame.Rect((20, 50), (50, 100))
object1.update((30, 30), (50, 50))
print(object1.topleft)
print(object1.size)
(30, 30)
(50, 50)
矩形对象属性
>>> object1.y
50
>>> object1.x
20
>>> object1.topright
(70, 50)
>>> object1.center
(45, 100)
>>> object1.size
(50, 100)
>>> object1.height
100
>>> object1.right
70
>>> object1.midright
(70, 100)
>>> object1.w
50
这是一个Rect对象拥有的所有属性。
x, y, top, left, bottom, right, totopleft, bottomleft, topright, bottomright, midtop, midleft, middottom, midright, center, centerx, centery, 大小, width, height, w, h