第四节 Rect对象
一、Rect属性
1、创建矩形对象
格式:pygame.Rect(x, y, width, height)
参数x表示矩形左上角横坐标,参数y表示矩形左上角纵坐标。
参数width表示矩形的宽度,参数height表示矩形的高度。
2、绘制矩形
格式:
rectName=pygame.Rect(x, y, width, height)
pygame.draw.rect(screen,(R,G,B),rectName,w)
参数screen表示画布,(R,G,B)参数表示RGB颜色,rectName表示矩形名称,w表示粗细。
w是一个正整数,数字越大,线条越粗,当w为0时,矩形会被填充带颜色图形。
3、设置矩形的中心位置
格式:rectName.center=(x, y)
矩形的中心点的位置改变了,整个矩形的位置也随着这个点发生改变。
4、绘制一组矩形
代码演示:
for i in range(n):
myRect = pygame.Rect(100, 100, 50 + i * 30, 50 + i * 30)
myRect.center = (400, 300)
pygame.draw.rect(screen, (r, g, b), myRect, w)
for循环中的i是不断变化的,故宽和高50 + i * 30也是不断变化的。
5、获取随机数
语法如下:
import random
r = random.randint(num1, num2)
注意:使用随机数需要先倒入random,num1是起始位置,num2是终止数字,包含两个端点,返回的是num1到num2之间含两端的任意一个整数。
6、完整代码演示
# 完整代码演示
import pygame, sys, random, time
pygame.init()
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("创意画板")
# 添加背景音乐
pygame.mixer.music.load("bgsound.wav")
pygame.mixer.music.play(-1)
def drawRect(x, y, n): # 参数为中心x,中心y,圈数
for i in range(n):
myRect = pygame.Rect(100, 100, 50 + i * 30, 50 + i * 30)
myRect.center = (x, y)
r = random.randint(0, 255)
g = random.randint(0, 255)
b = random.randint(0, 255)
w = random.randint(1, 20)
pygame.draw.rect(screen, (r, g, b), myRect, w)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
screen.fill((0, 0, 0))
drawRect(400, 300, 10)
drawRect(200, 450, 5)
drawRect(200, 150, 5)
drawRect(600, 150, 5)
drawRect(600, 450, 5)
pygame.display.update()
time.sleep(0.3) # 用来调整闪动频率
运行效果:
二、Rect碰撞检测
将图片和矩形绑定在一起,当检测矩形和矩形之间是否发生碰撞时,也相当于检测图片之间是否发生碰撞。
1、绑定图片和矩形Rect
格式和步骤:
1、加载图片:hImg = pygame.image.load("hero.png")
2、创建Rect对象:heroRect = pygame.Rect(50,50,50,50)
3、绑定图片和矩形:screen.blit(hImag,heroRect)
小贴士:绑定图片和Rect对象只需要将绘制图片语句screen.blit(图片,坐标位置)的第二个参数改为矩形Rect就可以了。
2、获取矩形的坐标
语法如下:
rect1=pygame.Rect(x, y, width, height)
获取rect1矩形对象的x坐标:rect1.x
获取rect1矩形对象的y坐标:rect1.y
3、碰撞检测colliderect
格式:rect1.colliderect(rect2)
注意矩形位置,一个在.之前,一个在括号里
示例:矩形heroRect和矩形winRect碰撞检测
if heroRect.colliderect(winRect):
print("英雄和宝箱发生碰撞了,恭喜成功了!")
4、碰撞检测collidelist
语法格式:矩形.collidelist(矩形组成的列表)
示例:判断矩形heroRect和列表eRectList是否碰撞
if heroRect.collidelist(eRectList) != -1:
print("撞一起啦!")
1、如果位置,矩形放在.前面,列表放在括号里。
2、如果没有发生碰撞,返回-1。
3、如果发生了碰撞,返回列表中被碰撞的矩形索引值。
5、完整代码展示
import pygame, sys, xesmap
pygame.init()
screen = pygame.display.set_mode((600, 600))
pygame.display.set_caption("迷宫探险(二)")
# 加载本案例中需要各种图片素材
bImg = pygame.image.load("box.png")
hImg = pygame.image.load("hero.png")
winbg = pygame.image.load("winbg.png")
failbg = pygame.image.load("failbg.png")
fImg = pygame.image.load("dragon.png")
bgImg = pygame.image.load("bg1.png")
eImg = pygame.image.load("enemy.png")
# 创建可多英雄矩形heroRect
heroRect = pygame.Rect(50, 50, 50, 50)
# 创建宝箱矩形winRect
winRect = xesmap.get_winRect()
# 创建敌人矩形eRectList
eRectList = xesmap.get_eRect()
# 播放背景音乐
pygame.mixer.music.load("bgMusic.wav")
pygame.mixer.music.play(-1)
# 定义加载音效函数,参数musicFile为音效文件
def playSound(musicFile):
sound = pygame.mixer.Sound(musicFile)
sound.play()
play = True # 游戏开始
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
# 调用playSound 函数,播放移动音效,文件为moveMusic.wav
playSound("moveMusic.wav")
if event.key == pygame.K_UP:
# 英雄的移动不能超过上边界
if heroRect.y > 50:
heroRect.y = heroRect.y - 50
elif event.key == pygame.K_DOWN:
# 英雄的移动不能超过下边界
if heroRect.y < 500:
heroRect.y = heroRect.y + 50
elif event.key == pygame.K_LEFT:
# 英雄的移动不能超过左边界
if heroRect.x > 50:
heroRect.x = heroRect.x - 50
elif event.key == pygame.K_RIGHT:
# 英雄的移动不能超过右边界
if heroRect.x < 500:
heroRect.x = heroRect.x + 50
if play == True:
# 绘制背景地图
screen.blit(bgImg, (0, 0))
# 绘制可多英雄
screen.blit(hImg, heroRect)
# 绘制宝箱
screen.blit(bImg, winRect)
# 绘制飞龙
flyRect = xesmap.dragon() # 创建飞龙矩形flyRect
screen.blit(fImg, flyRect)
# 绘制很多敌人
for rect in eRectList:
screen.blit(eImg, rect)
# 检测英雄是否和宝箱碰撞
if heroRect.colliderect(winRect):
screen.blit(winbg, (0, 0))
playSound("successMusic.wav")
play = False # 游戏结束
# 检测英雄heroRect是否和飞龙flyRect碰撞
elif heroRect.colliderect(flyRect):
screen.blit(failbg, (0, 0))
# 调用playSound 函数,播放失败音效,文件为failMusic.wav
playSound("failMusic.wav")
play = False # 游戏结束
# 检测英雄是否和敌人碰撞
elif heroRect.collidelist(eRectList) != -1:
screen.blit(failbg, (0, 0))
# 调用playSound 函数,播放失败音效,文件为failMusic.wav
playSound("failMusic.wav")
play = False # 游戏结束
pygame.display.update()
运行效果初始界面图:
运行效果失败效果图:
运行效果成功效果图: