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. 两个精灵之间的矩形检测

在只有两个精灵的时候可以使用 pygame.sprite.collide_rect() 函数进行一对一的冲突检测。这个函数需要传递两个精灵,并且两个精灵都需要继承自 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. 两个精灵之间的圆检测

矩形冲突检测并不适合所有形状的精灵,因此在 pygame 中还提供了圆形冲突检测。pygame.sprite.collide_circle() 函数是基于每个精灵的半径值来检测的,用户可以自己指定精灵半径,或者让函数计算精灵半径。

result = pygame.sprite.collide_circle(sprite1, sprite2)

if result:

print("精灵碰撞了!")

3. 两个精灵之间的像素遮罩检测

如果矩形检测和圆形检测都不能满足要求,pygame 还为用户提供了一个更加精确的检测——pygame.sprite.collide_mask() 。

这个函数接受精灵作为参数,返回值是一个 bool 变量。

if pygame.sprite.collide_mask(sprite1, sprite2):

print("精灵碰撞了!")

4. 精灵和精灵组之间的矩形冲突检测

在调用 pygame.sprite.spritecollide(sprite, sprite_group, bool) 函数的时候,一个组中所有的精灵都会逐个地对另外一个单个精灵进行冲突检测,发生冲突的精灵会作为一个列表返回。

这个函数的第1个参数是单个精灵,第2个参数是精灵组,第3个参数是一个 bool 值,最后这个参数起了很大的作用,当为 True 的时候会删除组中所有冲突的精灵,当为 False 的时候不会删除冲突的精灵。

list_collide = pygame.sprite.spritecollide(sprite, sprite_group, False)

另外,这个函数还有一个变体——pygame.sprite.spritecollideany() ,这个函数在判断精灵组和单个精灵冲突的时候会返回一个 bool 值。

5. 精灵组之间的矩形冲突检测

利用 pygame.sprite.groupcollide() 函数可以检测两个组之间的冲突,它返回一个字典(键值对)。

pygame精灵组有哪些方法_pygame 的精灵使用相关推荐

  1. pygame精灵组有哪些方法_pygame怎样实现精灵的行走及二段跳

    pygame制作游戏人物精灵的行走及二段跳实现方法 不得不承认<Python游戏编程入门>这本书翻译.排版非常之烂,但是里面的demo还是很好的,之前做了些改编放到这里. 先是素材: 背景 ...

  2. pygame精灵组有哪些方法_利用 pygame 开发一款游戏:「跳跳兔」(六)

    HackPython 改名为「懒编程」,纯粹是因为我有另外一个写杂文的号叫「懒写作」,此外,感觉「懒编程」比 HackPython 好记. 前言 在第 5 节内容中,实现了积分机制.玩家死亡逻辑以及游 ...

  3. pygame精灵组有哪些方法_小精灵科学室-如何在活动中提高幼儿的探究能力和科学探究活动?...

    小精灵幼儿科学发现室 幼儿科学教育的宗旨,幼儿科学活动的内容. 幼儿为什么要进行科学活动?科学活动的内容都有哪些?科学活动的理念是什么?如何开展科学活动的实施? 幼儿科学教育的宗旨:幼儿科学教育是指幼 ...

  4. Python_精灵和精灵组

    1. 基本概念 接下来介绍两个pygame中提供的高级类, 精灵和精灵组. 在介绍这两个类之前, 先来共同回顾一下到目前为止掌握的游戏开发套路. 在游戏初始化,需要加载一下游戏中所有的图像, 然后呢, ...

  5. Python 理解 精灵 和 精灵组

    1.1 精灵 和 精灵组 在刚刚完成的案例中,图像加载.位置编号.绘制图像 都需要程序员编写代码分别处理. 为了简化开发步骤: pygame 提供两个类. pygame.sprite.Sprite - ...

  6. Python pygame,精灵和精灵组

    plane_sprites.py(模块,定义派生精灵子类,继承pygame.sprite.Sprite): import pygame# 自定义的派生精灵子类,继承pygame.sprite.Spri ...

  7. python精灵和精灵组_Pygame精灵和精灵组

    Pygame精灵和精灵组 Pygame 提供了两个类 pygame.sprite.Sprite -- 存储 图像数据 image 和 位置 rect 的 对象 pygame.sprite.Group ...

  8. Python编程从入门到实践---pygame精灵组

    初学Python,跟着书上的外星人项目,写了一下,碰到一个这样的问题: AttributeError: 'Alien' object has no attribute 'add_internal' 找 ...

  9. pygame 精灵精灵组

    其实相当于用类封装数据和方法,组相当于用类将精灵再封装一次,这样修改组属性,整个组内的精灵均做相应的改变. 一条鱼不停在图中移动的例子. 用的图 源码: import pygame pygame.in ...

最新文章

  1. python中module_Python中的模块(Module)
  2. 提高PHP编程效率的20个要点(转)
  3. python(五)模块
  4. Go语言基础之4--流程控制
  5. 产生式是蕴含式_独栋别墅~下沉式庭院设计
  6. 一般向量空间的基变换_MIT—线性代数笔记30 线性变换及对应矩阵
  7. 如何用PPT来实现三维3D效果,附参数设置详解
  8. css入门自学笔记1
  9. 另菜单或工具栏按钮失效的mfc处理方法
  10. 社交网络营销之传统营销VS社交网络营销
  11. attilax.java 注解的本质and 使用最佳实践(3)O7
  12. 【学习感受】初入老男孩Linux运维班的心得分享
  13. 锐文网络安全网闸卡各种应用场景
  14. 相关性评估:皮尔逊相关系数,R2
  15. 怎么查看电脑是不是禁ping_电脑ping怎么打开怎么检测网络连接是否正常 ping网络教程...
  16. 警惕“不续签劳动合同”式裁员
  17. python游戏书籍推荐_有什么好的自学 Python 的书籍推荐?
  18. sb 讲解 (!(~+[])+{})[--[~+][+[]]*[~+[]] + ~~!+[]]+({}+[])[[~!+[]]*~+[]]
  19. 钢铁侠材质制作——2、线条轮廓部分的制作
  20. [Linux] 解决 CentOS 重启电脑后 ibus 拼音输入法无效的问题

热门文章

  1. 商业插画是什么?怎么学习商业插画?
  2. 《UNP》随笔——“实现一个简单的回射服务器”存在的不足(信号处理)
  3. 利用Python实现阴阳师自动抽卡
  4. WIN10 系统重新安装 WIN7 系统步骤
  5. php ubound,VBA UBound()函数
  6. asp数组函数LBound 、UBound和Split
  7. 完整的机器学习_加州房价预测
  8. 借用百度翻译,用pyqt5 搞定pdf和word文档翻译,排版基本不变,免费好用
  9. 《The Zen of Python, Explained》Posted by Al Sweigart in python - 中译版
  10. 数据源EPMSSqlDataSource的使用