Pygame Rect对象

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

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值