pygame入门基础知识(三)

简介: > pygame中最长使用的模块sprite精灵模块在一个游戏程序中,精灵本质指的是一张张小尺寸的图片,比如游戏中的各种道具、人物、场景装饰等,它们都可以看做成一张张小的“精灵”图。除此之外,人物的移动也可以看做是一系列小精灵图构成的序列; 精灵有个特点就是允许精灵之间进行交互,也称之为碰撞,而碰撞检测,指的就是检测两个精灵之间是否发生了碰撞。
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()

相关文章
|
5月前
|
Python 容器
Pygame入门 2022 (4) 使用精灵类重构
Pygame入门 2022 (4) 使用精灵类重构
|
5月前
|
Python
Pygame入门 2022 (2)
Pygame入门 2022 (2)
Pygame入门 2022 (2)
|
5月前
|
Python
Pygame入门 2022 (3)
Pygame入门 2022 (3)
|
5月前
|
开发工具 图形学 Python
Pygame入门 2022 (1)
Pygame入门 2022 (1)
|
程序员 Python
Pygame第1-1课:入门
Pygame第1-1课:入门
122 0
|
编解码 Python
14天学习训练营之 入门Pygame
14天学习训练营之 入门Pygame
113 0
14天学习训练营之 入门Pygame
|
开发框架 Python
Python游戏开发入门:pygame实例运动的小球-5
Python游戏开发入门:pygame实例运动的小球-5
150 0
Python游戏开发入门:pygame实例运动的小球-5
|
Python
Python游戏开发入门:pygame色彩与绘图机制-4
Python游戏开发入门:pygame色彩与绘图机制-4
268 0
Python游戏开发入门:pygame色彩与绘图机制-4
|
Python
Python游戏开发入门:pygame事件处理机制-3
Python游戏开发入门:pygame事件处理机制-3
361 0
Python游戏开发入门:pygame事件处理机制-3
|
Python
Python游戏开发入门:pygame屏幕绘制机制-2
Python游戏开发入门:pygame屏幕绘制机制-2
266 0