pygame中最长使用的模块sprite精灵模块
在一个游戏程序中,精灵本质指的是一张张小尺寸的图片,比如游戏中的各种道具、人物、场景装饰等,它们都可以看做成一张张小的“精灵”图。除此之外,人物的移动也可以看做是一系列小精灵图构成的序列; 精灵有个特点就是允许精灵之间进行交互,也称之为碰撞,而碰撞检测,指的就是检测两个精灵之间是否发生了碰撞。
Pygame 专门提供了一个处理精灵的模块,也就是 sprite(pygame.sprite)模块。通常情况下,我们使用该模块的基类 Sprite 来创建一个子类,从而达到处理精灵的目的,该子类提供了操作精灵的常用属性和方法:
self.image 加载要显示的精灵图片,控制图片大小和填充色
self.rect 精灵图片显示在哪个位置
Sprite.update() 刷新精灵图,使其相应效果生效
Sprite.add() 添加精灵图到精灵组中(groups)
Sprite.remove() 从精灵组中删除选中的精灵图
Sprite.kill() 删除精灵组中全部的精灵
Sprite.alive() 判断某个精灵是否属于精灵组
当游戏中有大量的精灵时,通过构建精灵容器(group 类)也就是精灵组来统一管理这些精灵。构建方法如下:
创建精灵组
group = pygame.sprite.Group()
向组内添加一个精灵
group.add(sprite_one)
于此同时pygame.sprite模块也提供了多种检测精灵是否碰撞的方法:
pygame.sprite.collide_rect() 两个精灵之间的矩形检测,即矩形区域是否有交汇,返回一个布尔值。
pygame.sprite.collide_circle() 两个精灵之间的圆形检测,即圆形区域是否有交汇,返回一个布尔值。
pygame.sprite.collide_mask() 两个精灵之间的像素蒙版检测,更为精准的一种检测方式。
实现一个向下移动的精灵组:
from random import randint
import sys
import pygame
'''
Pygame 是一个专门用来开发游戏的 Python 模块,主要为开发、设计 2D 电子游戏而生,
它是一个免费、开源的第三方软件包,支持多种操作系统,具有良好的跨平台性(比如 Windows、Linux、Mac 等)。
Pygame 是 Pete Shinners 在 SDL(Simple DirectMedia Layer,一套开源的跨平台多媒体开发库)
基础上开发而来,其目的是取代 PySDL
安装
pip install pygame
'''
pygame.init()
width,height = 1000,500
screen = pygame.display.set_mode([width,height])
pygame.display.set_caption('学习小游戏')
#创建精灵
class Gold(pygame.sprite.Sprite):
def __init__(self,image,pos):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load(image).convert() #加载精灵图片
self.rect = self.image.get_rect() #获取图片矩形
self.rect.topleft = pos #设置图片位置
def update(self,speed): #update为继承的方法
self.speed = speed #移动速度
self.rect.top += self.speed #向下移动 top一直增加
if self.rect.top >= height:
self.kill() # 超过了屏幕 删除
gold_img = 'D:\\temp\\gold.png'
#创建精灵组
group = pygame.sprite.Group()
#创建时钟
clock = pygame.time.Clock()
while True:
clock.tick(30) #每秒刷新60帧
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
#填充屏幕为白色
screen.fill((255,255,255))
#添加精灵到精灵组
group.add(Gold(gold_img,(randint(0,width),0)))
group.update(5) #更新位置
group.draw(screen) #放到屏幕上
pygame.display.update()
控制精灵组出现的频率,然后新加一个其他精灵并能移动:
from random import randint
import sys
import pygame
pygame.init()
width,height = 1000,500
screen = pygame.display.set_mode([width,height])
pygame.display.set_caption('学习小游戏')
#创建精灵
class Gold(pygame.sprite.Sprite):
def __init__(self,image,pos):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load(image) #加载精灵图片
self.image = pygame.transform.scale(self.image,(20,20)).convert() #改变图片大小
self.rect = self.image.get_rect() #获取图片矩形
self.rect.topleft = pos #设置图片位置
def update(self,speed):
self.speed = speed
self.rect.top += self.speed #向下移动 top一直增加
if self.rect.top >= height:
self.kill() # 超过了屏幕 删除
#gold_img = 'D:\\temp\\gold.png'
gold_img = r'H:\temp\sz.jpg'
#创建一个精灵 放到底部
class Hero(pygame.sprite.Sprite):
def __init__(self,image,pos):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load(image) #加载精灵图片
self.image = pygame.transform.scale(self.image,(40,40)).convert() #改变图片大小
self.rect = self.image.get_rect() #获取图片矩形
self.rect.center = pos #设置图片位置
def move(self,speed,where):
self.speed = speed
if where == 'right' and self.rect.left <= (width - 40):
self.rect.left += self.speed #向右移动 left一直增加
elif self.rect.left >= 0 and where == 'left':
self.rect.left -= self.speed #向左移动 left一直减少
def draw(self,screen):
screen.blit(self.image,self.rect)
#hero_img = 'D:\\temp\\hero.jpg'
hero_img = r'H:\temp\dw.jpg'
#初始位置居中显示
hero = Hero(hero_img,(width/2,height-22))
#创建精灵组
group = pygame.sprite.Group()
#控制一下精灵出现的数量和频率
gold_count = 0
gold_frep = randint(10,20) #10到20帧出现一个
#创建时钟
clock = pygame.time.Clock()
while True:
#填充屏幕为白色
screen.fill((255,255,255))
clock.tick(40) #每秒刷新60帧
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
key_pressed = pygame.key.get_pressed()
if key_pressed[pygame.K_a] or key_pressed[pygame.K_LEFT]:
hero.move(5,'left')
if key_pressed[pygame.K_d] or key_pressed[pygame.K_RIGHT]:
hero.move(5,'right')
gold_count += 1
if gold_count > gold_frep:
gold_frep = randint(10,20) #10到20帧出现一个
#添加精灵到精灵组
gold = Gold(gold_img,(randint(0,width),0))
group.add(gold)
gold_count = 0 #恢复0
hero.draw(screen)
group.update(5) #更新位置
group.draw(screen) #放到屏幕上
pygame.display.update()