pygame.sprite

这个模块包含几个游戏中使用的简单类。最主要的是Sprite类,还有几个容纳Sprite的Group类。是否使用这些类在Pygame中是可选的。这些类是轻量级的,仅仅提供了一个大部分游戏所共同需要的代码的起点。

Sprite类是用作游戏中各种类型对象的基类。还有一个Group基类用来简单的容纳sprites。一个游戏可以创建新的Group类用来操作它们包含的特殊的Sprite对象。

基本的Sprite类可以把它包含的Sprite画到Surface上。Group.draw方法需要每个Sprite都有一个Sprite.image属性和一个Sprite.rect属性。Group.clear方法需要相同的属性,可以用于删除所有的Sprite。还有更高级的Group:pygame.sprite.RenderUpdates可以跟踪图像脏的部分(需要更新的部分),pygame.sprite.OrderedUpdates可以以叠加顺序画Sprites。

最后,这个模块还包含几个碰撞检测函数。这些函数帮助我们找到多个Group里面的Sprite有哪些是相交的。要找到碰撞,Sprite必须有一个rect属性。

Group被设计成可以高效率的在里面添加和删除Sprite。它们允许快速测试一个sprite是否已经在一个group里面了。一个Sprite可以被包含在任意多个group里面。一个游戏可以使用一些Group来控制对象的显示,另外一些完全分开的group来控制交叉或者玩家运动。不用在Sprite的派生类中添加类型属性,可以把Sprites组织起来放在不同的group里面。这可以使以后查找Sprite更加容易。

Sprite和Group的关系用add和remove方法管理起来。这些方法可以带一个或者多个对象。这些类的默认的初始化函数带一个或者多个对象作为成员。可以在group里反复添加或者删除同一个Sprite对象。

虽然可以不需要从Sprite和AbstractGroup类继承而设计自己的sprite和group类,但是强烈建议你应该从它们继承。

Sprite类不是线程安全的。使用多线程时必须自己锁定它们。

1. pygame.sprite.Sprite

表示可见的游戏对象的简单基类

pygame.sprite.Sprite(*groups): return Sprite
    Sprite.update - 控制sprite的行为
    Sprite.add - 把sprite添加到group里
    Sprite.remove - 把sprite从group里面删除
    Sprite.kill - 把srpite从所有group里面删除
    Sprite.alive - 判断是否有个Group包含这个sprite
    Sprite.groups - 列出所有包含这个Sprite的Group

表示可见的游戏对象的简单基类。它的派生类需要覆盖Sprite.update方法,并给Sprite.image和Sprite.rect属性赋值。初始化函数可以带任意个Group对象作为它们的成员。

当从Sprite派生时,记得在把Sprite添加到组中之前一定要调用基类的初始化函数。

1.1. Sprite.update

控制sprite行为的方法

Sprite.update(*args):

这个函数的默认实现什么都不做,它只是作为一个"钩子"让你可以去覆盖的。这个方法被Group.update调用,参数可以是你给的任意参数。

如果不使用Group的update方法,那么就没有必要实现这个方法。

1.2. Sprite.add

把sprite添加到group里面

Sprite.add(*groups): return None

参数可以给定任意多个Group对象。Sprite会被添加到不包含它的Group里面去。

1.3. Sprite.remove

把sprite从groups里面删除

Sprite.remove(*groups): return None

可以指定任意多个Group作为参数。Sprite会从包含它的group里面删除。

1.4. Sprite.kill

把Sprite从所有的group里面删除

Sprite.kill(): return None

Sprite会从所有包含它的Group里面删除。这个函数不会改变Sprite本身的任何状态。这个函数用了以后还可以继续使用这个Sprite对象,包括把它添加到Group里面。

1.5. Sprite.alive

判断是否有某个Group包含这个Sprite

Sprite.alive(): return bool

如果这个Sprite属于某个组或者多个组,这个函数返回True。

1.6. Sprite.groups

列出包含这个Sprite的所有Group

Sprite.groups(): return group_list

返回所有包含这个Sprite的Group

2. pygame.sprite.Group

包含多个Sprite的容器类

pygame.sprite.Group(*sprites): return Group
    Group.sprites - 列出这个Group包含的所有Sprites
    Group.copy - 复制这个group
    Group.add - 把Sprite添加到这个group
    Group.remove - 把Sprite从group里面删除
    Group.has - 判断这个Group是否包含一些Sprites
    Group.update - 调用所有包含的Sprite的update方法
    Group.draw - 把Sprite图像画到Surface上
    Group.clear - 用背景覆盖掉Sprite
    Group.empty - 删除Group包含的所有Sprite

Sprite对象的简单容器。这个类可以派生出包含更多特殊功能的类。构造函数可以带任意多个Sprite作为添加到Group里面的对象。Group支持下列标准的Python操作:

          in      判断一个Sprite是否在里面
          len     获取包含的Sprite的个数
          bool    判断这个Group是否包含了Sprite(或者是空的)
          iter    迭代包含的所有的Sprite

Group包含的Sprite没有排序,所以画Sprites或者迭代它们是没有一个确定的顺序的。

2.1. Group.sprites

列出这个Group包含的Sprites

Group.sprites(): return sprite_list

返回这个Group包含的所有Sprites的列表。你可以从这个group获得一个迭代子,但是你不能够迭代一个Group的同时并修改它。

2.2. Group.copy

复制Group

Group.copy(): return Group

创建一个新的Group,包含和原来的group完全相同的Sprites。如果有一个派生的Group类,新对象也会和原来的对象一样有相同的子类。这只能在派生累得构造函数和基类想同时实现。

2.3. Group.add

把Sprites添加到这个Group里面

Group.add(*sprites): return None

添加任意多个Sprite到这个Group中。这个函数只会添加Group里面原来没有的Sprite进来。

每个Sprite参数也可以是一个迭代Sprite的迭代子。

2.4. Group.remove

从group中删除Sprites

Group.remove(*sprites): return None

从Group中删除任意多个Sprites。这个操作只对Group里面存在的Sprite进行。

每个Sprite参数也可以是一个迭代Sprite的迭代子。

2.5. Group.has

判断这个Group是否包含一些Sprites

Group.has(*sprites): return None

如果Group包含所有给定的Sprites,则函数返回True。这个操作和in运算符差不多,但in只是判断一个Sprite是否在Group中。

每个Sprite参数也可以是一个迭代Sprite的迭代子。

2.6. Group.update

在包含的Sprites上调用update

Group.update(*args): return None

在包含的所有Sprites上调用update。Sprite基类有一个可以带任何参数并不作任何事情的update函数。传给Group.update的参数会每一个Sprite对象。

没有办法获得Sprite.update的返回值。

2.7. Group.draw

把Sprite图像复制到Surface上

Group.draw(Surface): return None

把包含的Sprites画到Surface上去。这个函数用到Sprite.image作为源Surface,并且用到Sprite.rect作为位置。

Group不保存Sprite的顺序信息,所以Sprite会以任意的顺序画出来。

2.8. Group.clear

用背景来覆盖Sprites

Group.clear(Surface_dest, background): return None

把Group.draw所画的Sprites擦掉。目标Surface上Sprite的区域会被backgroup上的所填充。

background通常是一个Surface图像,具有和目标Surface同样的大小。它也可以是回调函数,带两个参数:目标Surface和清除的区域。background回调函数在一次clear的过程中会被调用多次。

这是一个回调函数的例子,把Sprites清除为红色:

   1 def clear_callback(surf, rect):
   2     color = 255, 0, 0
   3     surf.fill(color, rect)

2.9. Group.empty

去除所有的Sprite

Group.empty(): return None

去除这个Group包含的所有Sprites。

3. pygame.sprite.RenderUpdates

能够跟踪脏的区域(需要更新的区域)的Group类

pygame.sprite.RenderUpdates(*sprites): return RenderUpdates
    RenderUpdates.draw - 块复制Sprite图像,并跟踪改变的区域

这个类从pygame.sprite.Group继承。它包含一个扩展的draw函数,能够跟踪屏幕上改变的区域。

3.1. RenderUpdates.draw

块复制Sprite图像,并跟踪改变的区域

RenderUpdates.draw(surface): return Rect_list

把所有的Sprite画到surface上,和Group.draw一样。这个函数返回一组矩形,表示屏幕上被改变的区域。返回的改变区域也包括之前被Group.clear影响的区域。

返回的Rect列表应该传给pygame.display.update函数。这有助于提高软件显示模式下的游戏性能。这种更新的方法只在背景不会动的时候有效。

4. pygame.sprite.OrderedUpdates

可以按照叠加的顺序画图的RenderUpdates

pygame.sprite.OrderedUpdates(*spites): return OrderedUpdates

这个类从pygame.sprite.RenderUpdates类继承。它按照Sprite添加的顺序,维护一个有序的Sprites列表。这使得从Group里添加和删除Sprites操作比普通的Group慢一点。

5. pygame.sprite.GroupSingle

仅包含一个Sprite的Group类

pygame.sprite.GroupSingle(sprite=None): return GroupSingle

GroupSingle仅包含一个Sprite。当一个新的Sprite添加进去,老的就被删除了。

有一个特殊的属性GroupSingle.sprite,可以访问这个类包含的Sprite。如果Group是空的,那么它可能是None。也可以通过给这个属性被赋值而添加Sprite。

6. pygame.sprite.spritecollide

在一个Group里面找和另一个Sprite相交的Sprites

pygame.sprite.spritecollide(sprite, group, dokill): return Sprite_list

返回一个列表,包括Group里面所有和另一个Sprite相交的Sprites。是否相交通过比较Sprite.rect属性来确定。

dokill参数是一个布尔型的。如果设置成True,则所有相交的Sprite会从Group里面删除。

7. pygame.sprite.groupcollide

找到两个Group里面所有相交的Sprites

pygame.sprite.groupcollide(group1, group2, dokill1, dokill2): return Sprite_dict

这个函数会找到两个group里面所有相交的Sprites。是否相交通过比较Sprite.rect属性来确定。

group1里面的每一个Sprite会被添加到返回的字典里面,每一项的值是group2中相交的Sprites的列表。

两个dokill参数,哪一个是True,则对应的Group里面相交的Sprites会被删除。

8. pygame.sprite.spritecollideany

简单的测试一个Sprite是否和Group里面的任意一个Sprite相交

      pygame.sprite.spritecollideany(sprite, group): return bool

如果给定的Sprite和Group里面的某个Sprite相交,则返回True。是否相交通过比较Sprite.rect属性来确定。

这个碰撞检测比pygame.sprite.spritecollide更快,因为它要作的事情少一点。

The end

pygame.sprite (2008-02-23 15:35:53由localhost编辑)

ch3n2k.com | Copyright (c) 2004-2020 czk.