第四节 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)      # 用来调整闪动频率

运行效果:

alt 绘制多组矩形

二、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()

运行效果初始界面图:

alt 迷宫探险二初始

运行效果失败效果图:

alt 迷宫探险二失败

运行效果成功效果图:

alt 迷宫探险二成功

results matching ""

    No results matching ""