《pygame游戏开发实战指南》第四节 认识Recct对象
在前面的文章中,我们已经多次接触到了Rect
对象。当Surface
对象调用get_rect()函数后就会返回一个Rect
对象。本节将详细介绍有关Rect
对象的知识点。
项目代码下载地址: https://github.com/la-vie-est-belle/pygame_codes
4.1 什么是Rect以及如何创建Rect对象
在pygame中,Rect
对象用来存储和控制被绘制对象所在的矩形区域。在上一节的示例代码3-1中,我们加载了小恐龙图片,并通过get_rect()
函数获得了一个Rect
对象,然后通过该Rect
对象更新了小恐龙所在的矩形区域。
dino = pygame.image.load('dino_start.png').convert_alpha()
dino_rect = dino.get_rect()
dino_rect.topleft = (80, 450)
除了get_rect
函数,我们还可以直接通过Rect
类来实例化一个Rect
对象,只需要传入左上角xy坐标和宽高值,请看示例代码4-1。
pygame.Rect(left, top, width, height)
import sys
import pygamepygame.init()
screen = pygame.display.set_mode((500, 500))
pygame.display.set_caption('pygame demo')rect_area = pygame.Rect(0, 0, 100, 100) # 1
rect_area.topleft = (10, 10)while True:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()screen.fill((255, 255, 255))pygame.draw.rect(screen, (0, 255, 0), rect_area) # 2pygame.display.flip()
运行结果如下:
代码解释如下:
#1 通过Rect
类实例化了一个坐标为(0, 0)
,宽高都为100
像素的Rect
对象,保存到rect_area
变量中。然后将该矩形区域的左上角坐标设为了(0, 0)
。
#2 调用pygame.draw
模块中的rect()
函数在屏幕上绘制一个绿色矩形,传入rect_area
设置该绘制对象所在的矩形区域。
注:笔者会在下一结详细讲解如何在屏幕上绘制各种几何图形。
4.2 Rect对象的常用属性和函数
首先来看下Rect
对象的属性。
- x: 左上角x坐标。
- y: 左上角y坐标。
- w: 宽度。
- h: 高度。
- size: 尺寸,是一个元组(width, height)。
- top: 左上角y坐标,等同于y。
- left: 左上角x坐标,等同于x。
- bottom: 右下角y坐标。
- right: 右下角x坐标。
- centerx: 中心点x坐标。
- centery: 中心点y坐标。
- center: 中心点(x, y)坐标。
- topleft: 左上角(x, y)坐标。
- topright: 右上角(x, y)坐标。
- bottomleft: 左下角(x, y)坐标。
- bottomright: 右下角(x, y)坐标。
- midtop: 上边中心点(x, y)坐标。
- midleft: 左边中心点(x, y)坐标
- midright: 右边中心点(x, y)坐标。
在下面的示例代码4-2中我们使用了一些属性。
import sys
import pygamepygame.init()
screen = pygame.display.set_mode((500, 500))
pygame.display.set_caption('pygame demo')rect_area = pygame.Rect(0, 0, 100, 100)
rect_area.topleft = (10, 10) # 1
print(rect_area.topleft)rect_area.width = 200 # 2
rect_area.height = 300
print(rect_area.width)
print(rect_area.height)rect_area.center = (int(screen.get_width()/2), int(screen.get_height()/2)) # 3
print(rect_area.center)
print(rect_area.topleft)while True:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()screen.fill((255, 255, 255))pygame.draw.rect(screen, (0, 255, 0), rect_area)pygame.display.flip()
运行结果如下:
代码解释如下:
#1 将Rect
对象的左上角坐标设置为(10, 10)
并打印出来。
#2 设置Rect
对象的宽高,并打印出来。
#3 设置Rect
对象的中心点坐标为(int(screen.get_width()/2), int(screen.get_height()/2))
屏幕中心。
从以上代码示例中我们知道,既可以获取对象属性又可以直接给对象属性赋值。当修改其中一个属性时,其他属性也可能会跟着改变。比如给center
属性赋值后,Rect
对象的topleft
属性返回了(150, 100)
这个坐标。
注:所有属性都只接收整数或者整数元组。
下面是Rect
对象的一些常用函数。
- copy(): 复制一个
Rect
对象。 - move(x, y): 移动矩形区域,这里的x和y是指x和y方向上移动的偏移量。
- move_ip(x, y): 同上,只不过该函数是对原
Rect
对象直接进行操作,返回值为None。而move(x, y)函数会返回一个变换后的Rect
对象。 - inflate(x, y): 缩放矩形区域,这里的x和y是指x和y方向上的缩放量。如果传入的值是正的,就表示放大矩形区域,反之则缩小。
- inflate_ip(x, y): 同上,只不过该函数是对原
Rect
对象直接进行操作,返回值为None。而inflate(x, y)函数会返回一个变换后的Rect
对象。 - scale_by(x, y): 按倍数缩放矩形区域,这里的x和y是指x和y方向上的缩放倍数。如果传入0-1之间的值,就会按照指定倍数缩小;如果传入大于1的值,则会按照指定倍数放大。
- scale_by_ip(x, y): 同上,只不过该函数是对原
Rect
对象直接进行操作,返回值为None。而scale_by(x, y)函数会返回一个变换后的Rect
对象。 - contains(Rect): 判断传入的
Rect
对象所表示的矩形区域是否被包含在调用者Rect
对象所表示的矩形区域中。如果是包含的,则返回True,否则返回False。 - collidepoint(x, y): 判断坐标(x, y)是否在调用者
Rect
对象所表示的矩形区域中。是的话返回True,否则返回False。 - colliderect(Rect): 判断传入的
Rect
对象所表示的矩形区域和调用者Rect
对象所表示的矩形区域是否有重合。有的话返回True,否则返回False。 - collidelist(list): 传入一个
Rect
列表,返回列表中第一个跟调用者矩形区域有重合的Rect
对象。没有一个是重合的话,返回-1。 - collidelistall(list): 传入一个
Rect
列表,返回列表中跟调用者矩形区域有重合的Rect
对象索引所组成的列表。没有一个是重合的话,返回空列表。
在示例代码4-3中我们使用了其中一些函数。
import sys
import pygamepygame.init()
screen = pygame.display.set_mode((500, 500))
pygame.display.set_caption('pygame demo')rect_area = pygame.Rect(0, 0, 100, 100)
rect_area_copy1 = rect_area.copy() # 1
rect_area_copy1.topleft = (50, 50)
rect_area_copy2 = rect_area.copy()
rect_area_copy2.topleft = (10, 60)rect_area = rect_area.move(10, 10) # 2
rect_area.scale_by_ip(0.5, 0.5) # 3print(rect_area.contains(rect_area_copy1)) # 4
print(rect_area.colliderect(rect_area_copy1)) # 5
print(rect_area.collidelistall([rect_area_copy1, rect_area_copy2])) # 6while True:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()screen.fill((255, 255, 255))pygame.draw.rect(screen, (0, 255, 0), rect_area)pygame.draw.rect(screen, (0, 0, 255), rect_area_copy1)pygame.draw.rect(screen, (255, 0, 0), rect_area_copy2)pygame.display.flip()
运行结果如下:
代码解释如下:
#1 调用copy()
函数复制出了两个Rect
对象。
#2 调用move()
函数移动了rect_area
,该函数会返回一个变换后的Rect
对象,我们继续将其保存在rect_area
变量中。
#3 调用scale_by_ip()
函数传入0.5
,将宽和高都变成原来的一半。由于该函数是在原Rect
对象上操作的,所以没有返回值。
#4 调用contains()
函数判断rect_area
的矩形区域是否包含rect_area_copy1
的矩形区域。运行后会返回False
。
#5 调用colliderect()
函数判断rect_area
的矩形区域和rect_area_copy1
的矩形区域是否有重合。运行后会返回True
。
#6 调用collidelistall()
函数判断rect_area
的矩形区域和列表[rect_area_copy1, rect_area_copy2]
中的矩形区域是否有重合,有重合的话记录索引,最后会返回一个索引列表。运行后会返回[0, 1]
。
4.3 小结
在本节我们了解了Rect
对象的常见方法以及它常见的属性和函数。学完之后,我们就可以更好的在界面上操作绘制的图片了。
如果你喜欢笔者的这部专栏,可以给笔者一些打赏,或者通过购买一些项目来支持作者,非常感谢!