pygame 飞机大战碰撞检查的运用(三)用sprite,实现完美碰撞检查

本文介绍如何在pygame中通过使用精灵(sprite)和mask实现精确的碰撞检测,避免了仅依赖矩形框检查导致的不准确问题。通过创建mask并调用collide_mask()函数,可以在两个精灵相撞时获取第一个碰撞点,提高碰撞检测的准确性。这种方法适用于需要频繁进行碰撞检查且图像形状不规则的情况。文章提供了一个示例,展示了在hero和bullets精灵之间进行碰撞检查的代码实现。
摘要由CSDN通过智能技术生成

目标:实现完美的碰撞检查

前面的只是普通的碰撞检查,用到了矩形框的范围。图像如果都不是矩形,用普通检查,两种已经相碰,但画面显示还未相碰,这就很尴尬了。

sprite模块中,有个collide_mask()函数可以利用。

ygame.sprite.collide_mask()

Collision detection between two sprites, using masks.

collide_mask(SpriteLeft, SpriteRight) -> point

Returns first point on the mask where the masks collided, or None if there was no collision.

Tests for collision between two sprites, by testing if their bitmasks overlap. If the sprites have a "mask" attribute, that is used as the mask, otherwise a mask is created from the sprite image. Intended to be passed as a collided callback function to the *collide functions. Sprites must have a "rect" and an optional "mask" attribute.

You should consider creating a mask for your sprite at load time if you are going to check collisions many times. This will increase the performance, otherwise this can be an expensive function because it will create the masks each time you check for collisions.

sprite.mask = pygame.mask.from_surface(sprite.image)

简单的翻译下,被检查对象要有mask属性,用于检查的范围。pygame还有专门的mask模块, from_surface()可以将Surface对象中的非透明部分表示为mask并返回。

在对象中定义

self.mask = pygame.mask.from_surface(self.image)  #类要继承至sprite

碰撞检查的函数改为:
beshoted = pygame.sprite.spriteco

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值