Sprite 精灵对象使用说明
关注 1260
如何在 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