Pygame精�和碰撞检测
在开始å¦ä¹ 相关知识点之å‰�,我们有必è¦�å…ˆå¦ä¹ ç²¾ç�µå’Œç¢°æ’žæ£€æµ‹çš„å�«ä¹‰ã€‚
ç²¾ç�µï¼ˆè‹±æ–‡è¯‘为 Sprite),其实在一个游æˆ�程åº�ä¸ï¼Œç²¾ç�µæœ¬è´¨æŒ‡çš„æ˜¯ä¸€å¼ å¼ å°�尺寸的图片,比如游æˆ�ä¸çš„å�„ç§�é�“å…·ã€�人物ã€�场景装饰ç‰ï¼Œå®ƒä»¬éƒ½å�¯ä»¥çœ‹å�šæˆ�ä¸€å¼ å¼ å°�çš„“ç²¾ç�µ”图。除æ¤ä¹‹å¤–,人物的移动也å�¯ä»¥çœ‹å�šæ˜¯ä¸€ç³»åˆ—å°�ç²¾ç�µå›¾æž„æˆ�çš„åº�列(按帧组æˆ�çš„åº�列),如下图所示:

图1:动作�帧分解图
如果将é€�帧分解å�Žçš„åŠ¨ä½œï¼ŒæŒ‰ç…§ä¸€å®šçš„é¢‘çŽ‡æ’æ”¾ï¼Œé‚£ä¹ˆå°±å½¢æˆ�了动画精ç�µï¼Œæ‚¨å°†ä¼šçœ‹åˆ°é›„鹰展翅高飞ã€�人在ç–马奔腾ã€�è¿�动员奋力跳远。
ç²¾ç�µæœ‰ä¸ªç‰¹ç‚¹å°±æ˜¯å…�许精ç�µä¹‹é—´è¿›è¡Œäº¤äº’,也称之为碰撞,而碰撞检测,指的就是检测两个精ç�µä¹‹é—´æ˜¯å�¦å�‘生了碰撞。比如在贪å�ƒè›‡æ¸¸æˆ�ä¸è›‡çš„头部是å�¦ä¸Žé£Ÿç‰©å�‘生了碰撞,或者飞机大战游æˆ�ä¸å�弹是å�¦å‡»ä¸äº†å¤–星人ç‰ç‰ã€‚当检测到碰撞å�‘生å�Žï¼ŒæŽ¥ä¸‹æ�¥ä¼šè§¦å�‘æŸ�些事件,比如å�弹击ä¸å¤–星人,外星人就会消失,玩家的得分也会éš�ä¹‹å¢žåŠ ï¼Œå¹¶ä¸”åœ¨æ¸¸æˆ�å±�幕上å�ˆä¼šå‡ºçŽ°ä¸€ä¸ªå¤–æ˜Ÿäººã€‚
Pygame 专门æ��供了一个处ç�†ç²¾ç�µçš„æ¨¡å�—,也就是 sprite(pygame.sprite)模å�—。通常情况下,我们使用该模å�—的基类 Sprite æ�¥åˆ›å»ºä¸€ä¸ªå�类,从而达到处ç�†ç²¾ç�µçš„目的,该å�ç±»æ��供了æ“�作精ç�µçš„常用属性和方法,如下所示:
注æ„�,当游æˆ�䏿œ‰å¤§é‡�的精ç�µæ—¶ï¼Œæ“�作它们将å�˜å¾—å¤�æ�‚ï¼Œæ¤æ—¶é€šè¿‡æž„建精ç�µå®¹å™¨ï¼ˆgroup 类)也就是精ç�µç»„æ�¥ç»Ÿä¸€ç®¡ç�†è¿™äº›ç²¾ç�µã€‚构建方法如下:
下é�¢çœ‹ä¸€ç»„简å�•的示例,代ç �如下所示:

图2:�行结果
接下�,我们将 snake2 的

图3:�行结果
除上述内容外,Pygame 还æ��供许多其他模å�—,比如 mixer(声音)ã€�movieï¼ˆæ’æ”¾è§†é¢‘)ã€�musicï¼ˆæ’æ”¾éŸ³é¢‘)ã€�sndarray(æ“�作声音数æ�®ï¼‰ç‰æ¨¡å�—,由于这些模å�—使用起æ�¥è¾ƒä¸ºç®€å�•ï¼Œå› æ¤è¿™é‡Œä¸�å†�é€�一介ç»�,感兴趣的朋å�‹å�¯ä»¥é˜…读 Pygame 官方文档 —>点击å‰�å¾€ï¼�
ç²¾ç�µï¼ˆè‹±æ–‡è¯‘为 Sprite),其实在一个游æˆ�程åº�ä¸ï¼Œç²¾ç�µæœ¬è´¨æŒ‡çš„æ˜¯ä¸€å¼ å¼ å°�尺寸的图片,比如游æˆ�ä¸çš„å�„ç§�é�“å…·ã€�人物ã€�场景装饰ç‰ï¼Œå®ƒä»¬éƒ½å�¯ä»¥çœ‹å�šæˆ�ä¸€å¼ å¼ å°�çš„“ç²¾ç�µ”图。除æ¤ä¹‹å¤–,人物的移动也å�¯ä»¥çœ‹å�šæ˜¯ä¸€ç³»åˆ—å°�ç²¾ç�µå›¾æž„æˆ�çš„åº�列(按帧组æˆ�çš„åº�列),如下图所示:

图1:动作�帧分解图
如果将é€�帧分解å�Žçš„åŠ¨ä½œï¼ŒæŒ‰ç…§ä¸€å®šçš„é¢‘çŽ‡æ’æ”¾ï¼Œé‚£ä¹ˆå°±å½¢æˆ�了动画精ç�µï¼Œæ‚¨å°†ä¼šçœ‹åˆ°é›„鹰展翅高飞ã€�人在ç–马奔腾ã€�è¿�动员奋力跳远。
ç²¾ç�µæœ‰ä¸ªç‰¹ç‚¹å°±æ˜¯å…�许精ç�µä¹‹é—´è¿›è¡Œäº¤äº’,也称之为碰撞,而碰撞检测,指的就是检测两个精ç�µä¹‹é—´æ˜¯å�¦å�‘生了碰撞。比如在贪å�ƒè›‡æ¸¸æˆ�ä¸è›‡çš„头部是å�¦ä¸Žé£Ÿç‰©å�‘生了碰撞,或者飞机大战游æˆ�ä¸å�弹是å�¦å‡»ä¸äº†å¤–星人ç‰ç‰ã€‚当检测到碰撞å�‘生å�Žï¼ŒæŽ¥ä¸‹æ�¥ä¼šè§¦å�‘æŸ�些事件,比如å�弹击ä¸å¤–星人,外星人就会消失,玩家的得分也会éš�ä¹‹å¢žåŠ ï¼Œå¹¶ä¸”åœ¨æ¸¸æˆ�å±�幕上å�ˆä¼šå‡ºçŽ°ä¸€ä¸ªå¤–æ˜Ÿäººã€‚
Pygame 专门æ��供了一个处ç�†ç²¾ç�µçš„æ¨¡å�—,也就是 sprite(pygame.sprite)模å�—。通常情况下,我们使用该模å�—的基类 Sprite æ�¥åˆ›å»ºä¸€ä¸ªå�类,从而达到处ç�†ç²¾ç�µçš„目的,该å�ç±»æ��供了æ“�作精ç�µçš„常用属性和方法,如下所示:
| 属性&方法 | 说明 |
|---|---|
| self.image | åŠ è½½è¦�显示的精ç�µå›¾ç‰‡ï¼ŒæŽ§åˆ¶å›¾ç‰‡å¤§å°�和填充色 |
| self.rect | 精�图片显示在哪个�置 |
| Sprite.update() | 刷新精�图,使其相应效果生效 |
| Sprite.add() | æ·»åŠ ç²¾ç�µå›¾åˆ°ç²¾ç�µç»„ä¸ï¼ˆgroups) |
| Sprite.remove() | 从精ç�µç»„ä¸åˆ 除选ä¸çš„ç²¾ç�µå›¾ |
| Sprite.kill() | åˆ é™¤ç²¾ç�µç»„ä¸å…¨éƒ¨çš„ç²¾ç�µ |
| Sprite.alive() | åˆ¤æ–æŸ�个精ç�µæ˜¯å�¦å±žäºŽç²¾ç�µç»„ |
注æ„�,当游æˆ�䏿œ‰å¤§é‡�的精ç�µæ—¶ï¼Œæ“�作它们将å�˜å¾—å¤�æ�‚ï¼Œæ¤æ—¶é€šè¿‡æž„建精ç�µå®¹å™¨ï¼ˆgroup 类)也就是精ç�µç»„æ�¥ç»Ÿä¸€ç®¡ç�†è¿™äº›ç²¾ç�µã€‚构建方法如下:
# 创建精ç�µç»„ group = pygame.sprite.Group() # å�‘ç»„å†…æ·»åŠ ä¸€ä¸ªç²¾ç�µ group.add(sprite_one)于æ¤å�Œæ—¶
pygame.sprite模�也�供了多�检测精�是�碰撞的方法,如下所示:| 方法 | 说明 |
|---|---|
| pygame.sprite.collide_rect() | 两个精�之间的矩形检测,�矩形区域是�有交汇,返回一个布尔值。 |
| pygame.sprite.collide_circle() | 两个精�之间的圆形检测,�圆形区域是�有交汇,返回一个布尔值。 |
| pygame.sprite.collide_mask() | 两个精ç�µä¹‹é—´çš„åƒ�ç´ è’™ç‰ˆæ£€æµ‹ï¼Œæ›´ä¸ºç²¾å‡†çš„ä¸€ç§�检测方å¼�。 |
| pygame.sprite.spritecollide() | 精�和精�组之间的矩形碰撞检测,一个组内的所有精�会�一地对�外一个�个精�进行碰撞检测,返回值是一个列表,包�了�生碰撞的所有精�。 |
| pygame.sprite.spritecollideany() | ç²¾ç�µå’Œç²¾ç�µç»„之间的矩形碰撞检测,上述函数的å�˜ä½“,当å�‘生碰撞时,返回组内的一个精ç�µï¼Œæ— 碰撞å�‘生时,返回 None。 |
| pygame.sprite.groupcollide() | 检测在两个组之间å�‘生碰撞的所有精ç�µï¼Œå®ƒè¿”回值是一个å—典,将第一组ä¸å�‘生碰撞的精ç�µä½œä¸ºé”®ï¼Œç¬¬äºŒä¸ªç»„ä¸å�‘生碰撞的精ç�µä½œä¸ºå€¼ã€‚ |
下é�¢çœ‹ä¸€ç»„简å�•的示例,代ç �如下所示:
import pygame
class Snake(pygame.sprite.Sprite):
#å®šä¹‰æž„é€ å‡½æ•°
def __init__(self,filename,location):
# 调父类æ�¥åˆ�始化å�ç±»
pygame.sprite.Sprite.__init__(self)
# åŠ è½½å›¾ç‰‡
self.image = pygame.image.load(filename)
# 获�图片rect区域
self.rect = self.image.get_rect()
# 设置�置
self.rect.topleft=location
# �始化pygame
pygame.init()
screen = pygame.display.set_mode((500,400))
pygame.display.set_caption('Cè¯è¨€ä¸æ–‡ç½‘')
# 填充为白色�幕
screen.fill((255,255,255))
filename ="C:/Users/Administrator/Desktop/snake.png"
location =(100,150)
snake1 = Snake(filename,location)
# 碰撞检测,必须有两个精ç�µï¼Œå› æ¤å†�创建一个精ç�µï¼Œå¹¶ä½¿ç”¨locationæ�¥æŽ§åˆ¶ç¬¬äºŒä¸ªç²¾ç�µçš„ä½�ç½®
location_2 = (100,80)
snake2 = Snake('C:/Users/Administrator/Desktop/logo.png',location_2)
# 调用 collide_rect()进行矩形区域检测,返回一个布尔值,碰撞返回True,�则返回False
crash_result = pygame.sprite.collide_rect(snake1,snake2)
if crash_result:
print("精�碰撞了!")
pass
else:
print('精�没碰撞')
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
exit()
# 绘制精�到�幕上
screen.blit(snake1.image,snake1.rect)
screen.blit(snake2.image,snake2.rect)
# 刷新显示�幕
pygame.display.update()
当精�没有�生碰撞时,程�的�行结果如下:
图2:�行结果
接下�,我们将 snake2 的
location_2�数�为 (100,140),然��次�行程�,这时两个精�就会�生碰撞,�行结果如下:
图3:�行结果
除上述内容外,Pygame 还æ��供许多其他模å�—,比如 mixer(声音)ã€�movieï¼ˆæ’æ”¾è§†é¢‘)ã€�musicï¼ˆæ’æ”¾éŸ³é¢‘)ã€�sndarray(æ“�作声音数æ�®ï¼‰ç‰æ¨¡å�—,由于这些模å�—使用起æ�¥è¾ƒä¸ºç®€å�•ï¼Œå› æ¤è¿™é‡Œä¸�å†�é€�一介ç»�,感兴趣的朋å�‹å�¯ä»¥é˜…读 Pygame 官方文档 —>点击å‰�å¾€ï¼�
关注公众å�·ã€Œç«™é•¿ä¸¥é•¿ç”Ÿã€�,在手机上阅读所有教程,éš�æ—¶éš�地都能å¦ä¹ 。本公众å�·ç”±Cè¯è¨€ä¸æ–‡ç½‘站长亲自è¿�è�¥ï¼Œé•¿æœŸæ›´æ–°ï¼Œå�šæŒ�原创。

微信扫ç �关注公众å�·
优秀文ç«
- GCC -o选项:指定输出文件
- C++ seekp和seekg函数用法详解
- C++三�继承方�
- 什么是数�结构
- Goè¯è¨€flag包:命令行å�‚æ•°è§£æž�
- Djangoæ–‡ä»¶ä¸Šä¼ ä¸ŽCSV文件下载
- C++11ç§»åŠ¨æž„é€ å‡½æ•°çš„åŠŸèƒ½å’Œç”¨æ³•
- Eclipse执行Maven命令
- Redis数�备份和还原
- JavaScript是什么