Sprite类是用于在游戏设计中,作为各个对象的基类的。一个继承自Sprite的类一定要有
image和rect属性,rect由image.get_rect命令来获取,用来代表image的坐标和宽高。
另外,如果要实现像素级的更加完美的碰撞检测,那么要加一个mask属性,它通常能过pygame.mask.from_surface 来创建。
一个角色应该在一个组当中,这样便于高效的集体操作角色。
当子类化Sprite时,不要忘了对父类进行初始化。
在官方文档中有一个继承自Sprite的DirtySprite类,字面意思为脏角色类,今天来测试下。
官方文档为:
http://www.pygame.org/docs/ref/sprite.html#pygame.sprite.DirtySprite
"""
Pygame的脏角色类可见性测试.
在官方的Pygame说明了,有一个pygame.sprite.DirtySprite类,
它是继承自Sprite的一个子类,只是多加了一些属性,
其中有dirty属性,默认值为1,表示被渲染后又会被设置为0
值为2时,表示每帧都渲染,值为0时不是dirty的,并且不会被渲染.
还有一个可见性属性叫visible,值为1时,表示会渲染,值为0时表示
不会渲染,下面的程序设置了相关属性,可是好像并没有什么用.
难道还是要自己写if来判断要不要渲染,那定义DirtySprite类有什么用?
"""
import pygame
from pygame.locals import *
class Block(pygame.sprite.DirtySprite):
# 方块类,继承自DirtySprite
def __init__(self, color, pos,width, height):
# 调用父类的构造方法
pygame.sprite.Sprite.__init__(self)
# 创建图形,填充颜色
# 也可以从磁盘中加载一幅图像
self.image = pygame.Surface([width, height])
self.image.fill(color)
# 获取它的矩形对象,以后就能通过修改rect的属生从而移动方块
self.rect = self.image.get_rect(topleft=pos)
self.dirty = 0 # 每帧渲染
self.visible = 0 # 可见
screen = pygame.display.set_mode((480,360))
pygame.display.set_caption("Pygame的脏角色类可见性测试")
g = pygame.sprite.Group() # 新建组
red = Block((255,0,0),(50,50),100,100)
green = Block((0,255,0),(150,150),50,50)
g.add(red) # 在组中添加red方块
green.add(g) # 把green方块添加到组
running = True
while running:
for event in pygame.event.get():
if event.type == QUIT:running=False
screen.fill((128,23,133))
g.draw(screen) # 渲染组中的方块
pygame.display.update()
pygame.quit()
