Sprite 精灵对象使用说明
关注 1800
如何在 Pygame 中通过精灵组绘制和更新精灵视频演示 YouTube如何在 Pygame 中通过精灵组绘制和更新精灵视频演示 Bilibili
Pygame 中的 sprite 模块
Pygame 包的sprite模块,包含了与游戏精灵有关的函数和类。游戏精灵可以被理解为游戏中一些元素,比如,游戏角色,道具等,这些元素未必是可见的,比如,一个隐形的敌人。
Pygame 中的 Sprite 对象
sprite模块的Sprite对象表示了游戏中的精灵,该对象一般被包含在一个或多个Group精灵组对象中,其构造器如下。
Sprite(*groups)
- groups 参数
可变参数
groups所包含的位置参数,是将要添加精灵的精灵组对象(或嵌套包含精灵组对象的序列对象)。
设置精灵的表面(图像),位置,碰撞区域
如何在 Pygame 中获取和设置精灵的位置、图像、碰撞检测区域视频演示 YouTube如何在 Pygame 中获取和设置精灵的位置、图像、碰撞检测区域视频演示 Bilibili
一般情况下,Sprite对象需要名称为image和rect的变量(可在派生类的构造器中或其他位置为他们赋值)。其中,image变量是一个Surface表面对象,这决定了精灵的外观(如果被绘制的话),rect变量是一个Rect矩形对象,他决定了精灵的位置,并被用于碰撞检测。
sprite.image
sprite.rect
sprite.image = image
sprite.rect = rect
- image 值
image是表示精灵外观的Surface表面对象(表面除了可以绘制图像,也可以绘制简单的图形,比如矩形)。- rect 值
rect是表示精灵位置和碰撞检测区域的Rect矩形对象。
表面,矩形
关于表面对象和矩形对象,请参考如何使用 Surface 表面对象?以及表面(图像)的透明度,透明颜色键,颜色,大小等问题和Rect 矩形对象使用说明两节。
设置绘制精灵的图层
Sprite对象的layer属性是一个整数,表示用于绘制精灵的图层,数值较小的图层将优先被绘制,这意味着他们可能会被后来的图层覆盖。
sprite.layer
sprite.layer = layer
- layer 值
layer是表示用于绘制精灵的图层的整数。
layer 属性仅在 LayeredUpdates 类型的精灵组中发挥作用
如果将精灵加入非LayeredUpdates类型的精灵组,那么设置layer属性可能不会产生任何效果,正确的做法是将精灵加入类型为LayeredUpdates的精灵组对象(或继承自LayeredUpdates的对象)。
使用 layer 属性时的限制
如果你希望通过layer属性设置精灵的图层,那么需要在精灵加入任何精灵组之前,否则将导致异常AttributeError: Can't set layer directly after adding to group. Use group.change_layer(sprite, new_layer) instead.。
如果layer属性从未被设置过(由开发人员或 Pygame 自身),那么读取他将导致异常AttributeError: '…' object has no attribute '_layer'. Did you mean: 'layer'?。
将精灵添加至精灵组
Sprite对象的add方法,可用于将精灵对象添加至一个或多个Group精灵组对象。
add(*groups)
- groups 参数
可变参数
groups所包含的位置参数,是将要添加精灵的精灵组对象(或嵌套包含精灵组对象的序列对象)。
将精灵从精灵组中移除
Sprite对象的remove方法,可用于将精灵对象从一个或多个Group精灵组对象中移除。
remove(*groups)
- groups 参数
可变参数
groups所包含的位置参数,是将要移除精灵的精灵组对象(或嵌套包含精灵组对象的序列对象)。
Sprite对象的kill方法,可用于从所有包含该精灵的精灵组对象中,移除该精灵。该方法并不会真正的销毁(“杀死”)精灵对象,他仅仅是从精灵组对象中移除了精灵,这些被移除的精灵依然可以被使用,包括重新加入新的精灵组。
kill()
判断精灵是否在任意精灵组中
Sprite对象的alive方法,可用于判断精灵是否被包含在任意某个精灵组对象中。
alive()
- 返回值
如果
alive方法返回True,那么表示精灵被包含某一个或多个精灵组对象中。
获取所有包含精灵的精灵组
Sprite对象的groups方法,可用于获取所有包含该精灵的精灵组对象。
groups()
- 返回值
groups方法返回一个列表,包含了所有包含该精灵的精灵组对象。
更新精灵
默认情况下,Sprite对象的update方法不会实现任何效果,其参数通常来自于所在的精灵组对象的update方法。如果要使用update方法,应在派生类中重写他,以实现与精灵有关的状态的更新,比如,角色判断自己的生命值是否小于等于0。
update(*args, **kwargs)
- args 参数
可变参数
args所包含的位置参数,通常来自于其所在精灵组对象的update方法。- kwargs 参数
可变参数
kwargs所包含的关键字参数,通常来自于其所在精灵组对象的update方法。
Pygame 中的 WeakSprite 对象
sprite模块中的WeakSprite类派生自Sprite类,与Sprite不同的是,WeakSprite对包含自己的精灵组对象进行弱引用。这意味着如果一个精灵组对象只包含WeakSprite对象,并且精灵组对象没有被强引用,那么该精灵组对象可以被垃圾回收。
WeakSprite 对象的使用场景
如果不再使用的精灵被开发人员从精灵组中移除,WeakSprite对象的使用场景可能并不多,因为这使得回收精灵组与被移除的精灵无关。但对于一些临时的精灵组,WeakSprite对象可能是有用的。
Pygame 中的 DirtySprite 对象
sprite模块中的脏精灵类DirtySprite派生自Sprite类,拥有比Sprite更多的功能,其中最重要的是可以设置是否需要重绘,这表示在每一次的游戏循环中,你可以根据情况来决定是否重新绘制某个精灵,对于始终固定不变或很少改变的元素,仅在必要时对其进行绘制,可以提高游戏的渲染效率。
DirtySprite 对象拥有的功能可能仅在 LayeredDirty 类型的精灵组中有效
如果将脏精灵加入非LayeredDirty类型的精灵组,那么脏精灵的一些效果可能不会显现,正确的做法是将脏精灵加入类型为LayeredDirty的精灵组对象(或继承自LayeredDirty的对象)。
获取和设置脏精灵表面(图像)被绘制的区域
DirtySprite类的source_rect变量是一个Rect矩形对象(默认值为None),表示需要绘制脏精灵表面的哪个区域(当然表面中除了可以绘制图像,也可以直接绘制简单的图形,比如矩形)。如果该变量为None,那么将绘制脏精灵的整个表面。
dirtysprite.source_rect
dirtysprite.source_rect = source_rect
- source_rect 值
source_rect是表示需要绘制的区域,以表面的左上角坐标为原点。
获取和设置脏精灵是否需要重绘
DirtySprite类的dirty变量是一个整数(默认值为1),表示是否需要重绘精灵,当其所在的精灵组对象的draw方法被调用时。dirty为1表示需要重绘,为0表示不需要重绘,为2表示始终进行重绘。
在精灵组对象的draw方法被调用后,其包含的精灵的dirty变量会被修改为0,如果此时dirty为1的话。这意味着,在没有必要的情况下,不会重新绘制精灵。另外,如果通过visible属性设置了精灵是否可见,那么dirty变量会被设置为1,如果此时dirty为0的话。这意味着,设置精灵的可见性将导致其被重绘。
dirtysprite.dirty
dirtysprite.dirty = dirty
- dirty 值
dirty是表示精灵是否需要重绘的整数。
获取和设置脏精灵是否可见
DirtySprite类的visible属性是一个整数(默认值为1),表示脏精灵是否可见,即是否被绘制,1表示可见,0表示不可见。
dirtysprite.visible
dirtysprite.visible = visible
- visible 值
visible是表示脏精灵是否可见的整数。
visible 属性为 0 并不会阻止调用 update 方法
visible属性为0将导致脏精灵不被绘制,但不会阻止脏精灵的update方法被执行,如果你了调用精灵组的update方法。
获取和设置脏精灵的颜色混合模式
DirtySprite类的blendmode变量(默认值为0),表示在绘制脏精灵时所采用的颜色混合模式,其取值与Surface对象的blit或fill方法的special_flags相同。
dirtysprite.blendmode
dirtysprite.blendmode = blendmode
- blendmode 值
blendmode是表示颜色混合模式的整数。
绘制
关于颜色混合模式,颜色混和模式的取值,请参考Pygame 中的颜色混合模式一段。
Pygame 中的 WeakDirtySprite 对象
sprite模块中的WeakDirtySprite类派生自WeakSprite和DirtySprite类,拥有这两个基类的共同特点。
内容分类
获取源码
本部分所使用的源码,可在 GitHub 上浏览,地址如下:
https://github.com/codebeatme/pygame/tree/master/src/zh/sprite
讲解视频
如何在 Pygame 中获取和设置精灵的位置、图像、碰撞检测区域·YouTube如何在 Pygame 中获取和设置精灵的位置、图像、碰撞检测区域·Bilibili
如何在 Pygame 中通过精灵组绘制和更新精灵·YouTube如何在 Pygame 中通过精灵组绘制和更新精灵·Bilibili