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实现精准碰撞检测