This module contains several simple classes to be used within games. There is
the main Sprite class and several Group classes that contain Sprites. The use
of these classes is entirely optional when using pygame. The classes are fairly
lightweight and only provide a starting place for the code that is common to
most games.

The Sprite class is intended to be used as a base class for the different types
of objects in the game. There is also a base Group class that simply stores
sprites. A game could create new types of Group classes that operate on
specially customized Sprite instances they contain.

The basic Sprite class can draw the Sprites it contains to a Surface. The
Group.draw() method requires that each Sprite have a Surface.image
attribute and a Surface.rect. The Group.clear() method requires these
same attributes, and can be used to erase all the Sprites with background.
There are also more advanced Groups: pygame.sprite.RenderUpdates() and
pygame.sprite.OrderedUpdates().

Lastly, this module contains several collision functions. These help find
sprites inside multiple groups that have intersecting bounding rectangles. To
find the collisions, the Sprites are required to have a Surface.rect
attribute assigned.

The groups are designed for high efficiency in removing and adding Sprites to
them. They also allow cheap testing to see if a Sprite already exists in a
Group. A given Sprite can exist in any number of groups. A game could use some
groups to control object rendering, and a completely separate set of groups to
control interaction or player movement. Instead of adding type attributes or
bools to a derived Sprite class, consider keeping the Sprites inside organized
Groups. This will allow for easier lookup later in the game.

Sprites and Groups manage their relationships with the add() and
remove() methods. These methods can accept a single or multiple targets for
membership. The default initializers for these classes also takes a single or
list of targets for initial membership. It is safe to repeatedly add and remove
the same Sprite from a Group.

While it is possible to design sprite and group classes that don't derive from
the Sprite and AbstractGroup classes below, it is strongly recommended that you
extend those when you add a Sprite or Group class.

The base class for visible game objects. Derived classes will want to
override the Sprite.update() and assign a Sprite.image and
Sprite.rect attributes. The initializer can accept any number of Group
instances to be added to.

When subclassing the Sprite, be sure to call the base initializer before
adding the Sprite to Groups. For example:

classBlock(pygame.sprite.Sprite):# Constructor. Pass in the color of the block,# and its x and y positiondef__init__(self,color,width,height):# Call the parent class (Sprite) constructorpygame.sprite.Sprite.__init__(self)# Create an image of the block, and fill it with a color.# This could also be an image loaded from the disk.self.image=pygame.Surface([width,height])self.image.fill(color)# Fetch the rectangle object that has the dimensions of the image# Update the position of this object by setting the values of rect.x and rect.yself.rect=self.image.get_rect()

The Sprite is removed from all the Groups that contain it. This won't
change anything about the state of the Sprite. It is possible to continue
to use the Sprite after this method has been called, including adding it
to Groups.

A simple container for Sprite objects. This class can be inherited to create
containers with more specific behaviors. The constructor takes any number of
Sprite arguments to add to the Group. The group supports the following
standard Python operations:

Creates a new Group with all the same Sprites as the original. If you
have subclassed Group, the new object will have the same (sub-)class as
the original. This only works if the derived class's constructor takes
the same arguments as the Group class's.

Calls the update() method on all Sprites in the Group. The base
Sprite class has an update method that takes any number of arguments and
does nothing. The arguments passed to Group.update() will be passed
to each Sprite.

There is no way to get the return value from the Sprite.update()
methods.

Erases the Sprites used in the last Group.draw() call. The
destination Surface is cleared by filling the drawn Sprite positions with
the background.

The background is usually a Surface image the same dimensions as the
destination Surface. However, it can also be a callback function that
takes two arguments; the destination Surface and an area to clear. The
background callback function will be called several times each clear.

Here is an example callback that will clear the Sprites with solid red:

Draws all the Sprites to the surface, the same as Group.draw(). This
method also returns a list of Rectangular areas on the screen that have
been changed. The returned changes include areas of the screen that have
been affected by previous Group.clear() calls.

The returned Rect list should be passed to pygame.display.update().
This will help performance on software driven display modes. This type of
updating is usually only helpful on destinations with non-animating
backgrounds.

This class derives from pygame.sprite.RenderUpdates(). It maintains the
order in which the Sprites were added to the Group for rendering. This makes
adding and removing Sprites from the Group a little slower than regular
Groups.

You can set the default layer through kwargs using 'default_layer' and an
integer for the layer. The default layer is 0.

If the sprite you add has an attribute layer then that layer will be used.
If the **kwarg contains 'layer' then the sprites passed will be added to
that layer (overriding the sprite.layer attribute). If neither sprite
has attribute layer nor **kwarg then the default layer is used to add the
sprites.

If the sprite(s) have an attribute layer then that is used for the
layer. If **kwargs contains 'layer' then the sprite(s) will be added
to that argument (overriding the sprite layer attribute). If neither is
passed then the sprite(s) will be added to the default layer.

The GroupSingle container only holds a single Sprite. When a new Sprite is
added, the old one is removed.

There is a special property, GroupSingle.sprite, that accesses the
Sprite that this Group contains. It can be None when the Group is empty. The
property can also be assigned to add a Sprite into the GroupSingle
container.

Return a list containing all Sprites in a Group that intersect with another
Sprite. Intersection is determined by comparing the Sprite.rect
attribute of each Sprite.

The dokill argument is a bool. If set to True, all Sprites that collide will
be removed from the Group.

The collided argument is a callback function used to calculate if two
sprites are colliding. it should take two sprites as values, and return a
bool value indicating if they are colliding. If collided is not passed, all
sprites must have a "rect" value, which is a rectangle of the sprite area,
which will be used to calculate the collision.

# See if the Sprite block has collided with anything in the Group block_list# The True flag will remove the sprite in block_listblocks_hit_list=pygame.sprite.spritecollide(player,block_list,True)# Check the list of colliding sprites, and add one to the score for each oneforblockinblocks_hit_list:score+=1

Tests for collision between two sprites. Uses the pygame rect colliderect
function to calculate the collision. Intended to be passed as a collided
callback function to the *collide functions. Sprites must have a "rect"
attributes.

Tests for collision between two sprites, by testing to see if two circles
centered on the sprites overlap. If the sprites have a "radius" attribute,
that is used to create the circle, otherwise a circle is created that is big
enough to completely enclose the sprites rect as given by the "rect"
attribute. Intended to be passed as a collided callback function to the
*collide functions. Sprites must have a "rect" and an optional "radius"
attribute.

Collision detection between two sprites, using circles scaled to a ratio.

collide_circle_ratio(ratio) -> collided_callable

A callable class that checks for collisions between two sprites, using a
scaled version of the sprites radius.

Is created with a floating point ratio, the instance is then intended to be
passed as a collided callback function to the *collide functions.

A ratio is a floating point number - 1.0 is the same size, 2.0 is twice as
big, and 0.5 is half the size.

The created callable tests for collision between two sprites, by testing to
see if two circles centered on the sprites overlap, after scaling the
circles radius by the stored ratio. If the sprites have a "radius"
attribute, that is used to create the circle, otherwise a circle is created
that is big enough to completely enclose the sprites rect as given by the
"rect" attribute. Intended to be passed as a collided callback function to
the *collide functions. Sprites must have a "rect" and an optional "radius"
attribute.

The first point of collision between the masks is returned. The collision
point is offset from sprite1's mask's topleft corner (which is always
(0, 0)). The collision point is a position within the mask and is not
related to the actual screen position of sprite1.

This will find collisions between all the Sprites in two groups.
Collision is determined by comparing the Sprite.rect attribute of
each Sprite or by using the collided function if it is not None.

Every Sprite inside group1 is added to the return dictionary. The value for
each item is the list of Sprites in group2 that intersect.

If either dokill argument is True, the colliding Sprites will be removed
from their respective Group.

The collided argument is a callback function used to calculate if two sprites are
colliding. It should take two sprites as values and return a bool value
indicating if they are colliding. If collided is not passed, then all
sprites must have a "rect" value, which is a rectangle of the sprite area,
which will be used to calculate the collision.

If the sprite collides with any single sprite in the group, a single
sprite from the group is returned. On no collision None is returned.

If you don't need all the features of the pygame.sprite.spritecollide() function, this
function will be a bit quicker.

The collided argument is a callback function used to calculate if two sprites are
colliding. It should take two sprites as values and return a bool value
indicating if they are colliding. If collided is not passed, then all
sprites must have a "rect" value, which is a rectangle of the sprite area,
which will be used to calculate the collision.