pygame 的精灵应用
pygame.sprite.Sprite 是 pygame 中用于完成精灵的一个类 ,在应用时并不一定对它实例化,只必须承继它,随后按需写成自身的类 ,因而比较简单 、应用。
1. 精灵
精灵能够被觉得是一个个小图(帧)编码序列(比如角色走动),它能够在显示屏上挪动,而且能够与别的图型目标互动 。精灵图象能够是用 pygame 绘图样子函数绘图的样子 ,还可以是位图文件。
2. Sprite 类的组员
pygame.sprite.Sprite 用于完成精灵类 ,Sprite 的数据信息组员和函数方式关键以下。
-
self.image
其承担显示信息哪些图型 。比如
self.image = pygame.Surface([x, y])
表明该精灵是一个 x * y 尺寸的矩形,self.image = pygame.image.load(filename)
表明该精灵显示信息 filename 这一图片文件。self.image.fill([color])
承担对 self.image 开展上色,比如:self.image = pygame.Surface([x, y]) self.image.fill((255, 0, 0)) # 对 x * y 尺寸的矩形添充红
-
self.rect
其承担在哪儿显示信息。一般来说 ,先用
self.rect = self.image.get_rect()
来获得 image 的矩形地区,随后给 self.rect 设置显示信息的部位,一般用 self.rect.topleft 来明确左上方的部位 ,自然还可以 self.rect.topright、 self.rect.bottomleft 和 self.rect.bottomright 来明确其他好多个角的部位 。此外,self.rect.top 、self.rect.bottom 、self.rect.left 、self.rect.right 各自表明上、下 、左 、右 。
-
self.update()
其承担使精灵个人行为起效。
-
Sprite.add()
加上精灵到 groups 中。
-
Sprite.remove()
从精灵组 groups 中删掉 。
-
Sprite.kill()
从精灵组 groups 中删掉所有精灵。
-
Sprite.alive()
分辨某一精灵是不是归属于精灵组 groups 。
3. 创建精灵
全部精灵在创建时都是以 pygame.sprite.Sprite 中承继的,创建精灵要设计方案自身的精灵类 。
例——创建 Tank 精灵 ,编码以下:
import pygame
class Tank(pygame.sprite.Sprite):
def __init__(self, image, initial_position):
self.image = pygame.image.load(image)
self.rect = self.image.get_rect()
self.rect.topleft = initial_position
if __name__ = '__main__':
pygame.init()
screen = pygame.display.set_mode((640, 480))
screen.fill((255, 255, 255))
filename = "../images/tank.png"
init_pos = (150, 100)
tank = Tank(filename, init_pos)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
exit()
screen.blit(tank.image, tank.rect)
pygame.display.update()
运作結果以下:
4. 创建精灵组
当程序流程中有很多实体线的情况下,控制这种实体线可能是一件非常不便的事,而精灵组能够做为一个实体线精灵器皿将这种精灵放到一起统一管理方法。
pygame 应用精灵组来管理方法精灵的绘图和升级 ,精灵组是一个简易的器皿。
应用 pygame.sprite.Group()
能够建立一个精灵组:
group = pygame.sprite.Group()
group.add(sprite_one)
精灵组也是有 update() 和 draw() 函数:
group.update()
group.draw()
pygame 还出示了精灵与精灵中间的冲突检测、精灵和组中间的冲突检测 。
5. 精灵与精灵中间的撞击检测
1. 2个精灵中间的矩形检测
在仅有2个精灵的情况下能够应用 pygame.sprite.collide_rect()
函数开展一对一的冲突检测。这一函数必须传送2个精灵,而且2个精灵都必须承继自 pygame.sprite.Sprite 。
这儿举个事例:
sprite1 = Tank("sprite1.png", (150, 100)) # Tank 是上边3中事例建立的类 。
sprite2 = Tank("sprite2.png", (120, 80))
result = pygame.sprite.collide_rect(sprite1, sprite2)
if result:
print("精灵撞击了!")
2. 2个精灵中间的圆检测
矩形冲突检测并不宜全部样子的精灵,因而在 pygame 中还出示了环形冲突检测。pygame.sprite.collide_circle()
函数是根据每一个精灵的半经值来检测的 ,客户能够自身特定精灵半经 ,或是让函数测算精灵半经。
result = pygame.sprite.collide_circle(sprite1, sprite2)
if result:
print("精灵撞击了!")
3. 2个精灵中间的清晰度蒙版检测
假如矩形检测和环形检测都不可以符合要求,pygame 还为客户出示了一个更为精准的检测——pygame.sprite.collide_mask()
。
这一函数接纳精灵做为主要参数,返回值是一个 bool 自变量 。
if pygame.sprite.collide_mask(sprite1, sprite2):
print("精灵撞击了!")
4. 精灵和精灵组中间的矩形冲突检测
在启用 pygame.sprite.spritecollide(sprite, sprite_group, bool)
函数的情况下 ,一个组中全部的精灵都是逐一地对此外一个单独精灵开展冲突检测,发生争执的精灵会做为一个目录回到。
这一函数的第一个主要参数是单独精灵,第2个主要参数是精灵组 ,第三个主要参数是一个 bool 值,最终这一主要参数起了非常大的功效,当以 True 的情况下会删掉组里全部矛盾的精灵 ,当以 False 的情况下不容易删掉矛盾的精灵。
list_collide = pygame.sprite.spritecollide(sprite, sprite_group, False)
此外,这一函数还有一个组合——pygame.sprite.spritecollideany()
,这一函数在分辨精灵组和单独精灵矛盾的情况下会回到一个 bool 值 。
5. 精灵组中间的矩形冲突检测
运用 pygame.sprite.groupcollide()
函数能够检测2个组中间的矛盾 ,它回到一个词典(键值对)。