URLhttps://learnscript.net/zh/pygame/sprite/
    复制链接转到说明  示例

    Sprite 精灵对象使用说明

    我被代码海扁署名-非商业-禁演绎
    阅读 11:07·字数 3339·更新 

    Pygame 中的 sprite 模块

    Pygame 包的sprite模块,包含了与游戏精灵有关的函数和类。游戏精灵可以被理解为游戏中一些元素,比如,游戏角色,道具等,这些元素未必是可见的,比如,一个隐形的敌人。

    Pygame 中的 Sprite 对象

    sprite模块的Sprite对象表示了游戏中的精灵,该对象一般被包含在一个或多个Group精灵组对象中,其构造器如下。

    Sprite(*groups)

    groups 参数

    可变参数groups所包含的位置参数,是将要添加精灵的精灵组对象(或嵌套包含精灵组对象的序列对象)。

    设置精灵的表面(图像),位置,碰撞区域

    一般情况下,Sprite对象需要名称为imagerect的变量(可在派生类的构造器中或其他位置为他们赋值)。其中,image变量是一个Surface表面对象,这决定了精灵的外观(如果被绘制的话),rect变量是一个Rect矩形对象,他决定了精灵的位置,并被用于碰撞检测。

    sprite.image
    sprite.rect
    sprite.image = image
    sprite.rect = rect

    image 值

    image是表示精灵外观的Surface表面对象(表面除了可以绘制图像,也可以绘制简单的图形,比如矩形)。

    rect 值

    rect是表示精灵位置和碰撞检测区域的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方法被调用时。dirty1表示需要重绘,为0表示不需要重绘,为2表示始终进行重绘。

    在精灵组对象的draw方法被调用后,其包含的精灵的dirty变量会被修改为0,如果此时dirty1的话。这意味着,在没有必要的情况下,不会重新绘制精灵。另外,如果通过visible属性设置了精灵是否可见,那么dirty变量会被设置为1,如果此时dirty0的话。这意味着,设置精灵的可见性将导致其被重绘。

    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对象的blitfill方法的special_flags相同。

    dirtysprite.blendmode
    dirtysprite.blendmode = blendmode

    blendmode 值

    blendmode是表示颜色混合模式的整数。

    绘制

    关于颜色混合模式,颜色混和模式的取值,请参考Pygame 中的颜色混合模式一段。

    Pygame 中的 WeakDirtySprite 对象

    sprite模块中的WeakDirtySprite类派生自WeakSpriteDirtySprite类,拥有这两个基类的共同特点。

    内容分类

    获取源码

    本部分所使用的源码,可在 GitHub 上浏览,地址如下:

    https://github.com/codebeatme/pygame/tree/master/src/zh/sprite

    讲解视频

    如何在 Pygame 中获取和设置精灵的位置、图像、碰撞检测区域·YouTube如何在 Pygame 中获取和设置精灵的位置、图像、碰撞检测区域·Bilibili
    如何在 Pygame 中通过精灵组绘制和更新精灵·YouTube如何在 Pygame 中通过精灵组绘制和更新精灵·Bilibili