pygame游戏检测矩形是否碰撞指定颜色的自定义函数(仅5行代码)

Posted geng_zhaoying

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pygame游戏检测矩形是否碰撞指定颜色的自定义函数(仅5行代码)相关的知识,希望对你有一定的参考价值。

游戏中经常要检测角色之间的碰撞。pygame提供了各种图形之间碰撞检测,似乎并没有一个检测矩形与某颜色碰撞的函数。本文用pygame自定义一个函数,完成矩形与某颜色碰撞的检测。
pygame语句screen=pygame.display.set_mode((400,300))创建1个Surface实例作为显示窗体,这个screen水平方向400点,垂直方向300点的一个矩形,可用一个2维数组描述。在screen上可以画各种图形(如线和矩形)或Surface实例,先画的图形将被后画图形覆盖。完成1帧图像后,将screen拷贝到屏幕。如编写这样一个程序,在窗体两侧各画了1条黑色竖线,两线之间画一个小矩形,令其沿x轴方向不停移动,每当碰到黑线,反向运动。那么如何判断小矩形是否碰到黑色(线)呢?可在把小矩形画到screen前,检测在screen上小矩形所在新位置内是否有黑色点。具体方法是将screen每点颜色值保存到一个2维数组,从这个2维数组中创建一个矩形切片,矩形切片的位置和大小是小矩形在screen上新位置,然后判断该切片中是否有黑色的点。实际实现代码如下。

import pygame
def collide_color(aSurface,aRect,aColor):
    pixel=pygame.PixelArray(aSurface)#锁定aSurface,将各点颜色保存在2维数组
    aPixel=pixel[aRect.x:aRect.x+aRect.width,aRect.y:aRect.y+aRect.height]
    pygame.PixelArray.close(pixel) #解锁aSurface并删除数组,上句得到数组切片
    return aColor in aPixel#指定颜色在切片中返回真,两者颜色应同为rgb或rgba

函数的参数1是一个Surface实例,这里是上文创建的screen;参数2是矩形移动后新位置;参数3是要检测的颜色。第1条语句锁定aSurface,即不允许在aSurface画图形,并将aSurface上各点颜色值保存在一个2维数组中,注意数组是PixelArray实例,不是python的列表。第2条语句是做数组切片,切片范围是矩形在aSurface上新位置。第3条语句解锁aSurface对象,并删除第1条语句创建的2维数组。最后函数返回一个布尔值,即判断aColor颜色是否在切片数组中,两者颜色格式应相同,同是rgb或rgba。注意,很多网上文章介绍第3条语句使用del Pixel解锁,pygame1.9.4版本前是可以的,pygame1.9.4版本后,用del Pixel,不能解锁aSurface对象,但不报错。特别注意必须在画小矩形前检测,因画了小矩形后将会覆盖黑线,就无法检测了。另外要检测的黑色线必须在检查前画到screen上,因此在游戏窗体画图形的顺序十分重要。
本例并非必须采用检测矩形碰撞颜色方法,例如把两条黑线换成很窄Surface实例并填充黑色,就可以采用检测矩形碰撞矩形方法。但是如所画是任意黑色曲线,似乎只能采用检测矩形碰撞颜色方法了。
小矩形在两条黑色竖线间往返的程序运行效果图如下。

小矩形在两条黑色竖线间往返的完整程序如下。

import pygame
def collide_color(aSurface,aRect,aColor):
    pixel=pygame.PixelArray(aSurface)               #锁定aSurface,将各点颜色保存在2维数组
    aPixel=pixel[aRect.x:aRect.x+aRect.width,aRect.y:aRect.y+aRect.height]  #得到数组切片
    pygame.PixelArray.close(pixel)                  #解锁aSurface并删除数组
    return aColor in aPixel     #指定颜色在切片中返回真,否则返回假。两者颜色应同为rgb或rgba
bgcolor = pygame.Color('white')
red=pygame.Color('red')
black=pygame.Color('black')
pygame.init()
size = width, height = 200,100
screen = pygame.display.set_mode(size)
pygame.display.set_caption("检测矩形和颜色的碰撞")
rect = pygame.Rect( 100 ,35, 20, 20 )               #所画小矩形
dx=10                                               #小矩形移动速度
fclock = pygame.time.Clock()
fps = 4
angle=0
running = True
while running:    
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False        
    screen.fill(bgcolor)                                    #背景色
    pygame.draw.line(screen,black,(10,10),(10,90),5)        #画窗体两侧的两条黑线
    pygame.draw.line(screen,black,(190,10),(190,90),5)      #必须在检测前完成画黑线
    rect.x+=dx                                              #小矩形移到新位置
    if collide_color(screen,rect,black):                    #开始检测,必须在画矩形前检测
        dx=-(dx)                                            #碰到黑色线,速度反向
    pygame.draw.rect(screen, red, rect)                     #画小矩形
    pygame.display.update()                           
    fclock.tick(fps)
pygame.quit()

以上是关于pygame游戏检测矩形是否碰撞指定颜色的自定义函数(仅5行代码)的主要内容,如果未能解决你的问题,请参考以下文章

用pygame实现网上游戏‘球球情侣‘(检测矩形和某颜色碰撞的例子)

用pygame实现网上游戏‘球球情侣‘(检测矩形和某颜色碰撞的例子)

用pygame实现网上游戏‘球球情侣‘(检测矩形和某颜色碰撞的例子)

pygame.mask原理及使用pygame.mask实现精准碰撞检测

pygame.mask原理及使用pygame.mask实现精准碰撞检测

pygame.mask原理及使用pygame.mask实现精准碰撞检测