本系列博客介绍以python+pygame库进行小游戏的开发。有写的不对之处还望各位海涵。

直到现在我们已经学了很多pygame基础知识了,从这篇博客开始我们将会学习pygame中高级部分,更多和精灵模块,冲突检测相关的知识。

一、Sprite模块、sprite对象

在pygame.sprite模块里面包含了一个名为Sprite类,他是pygame本身自带的一个精灵。但是这个类的功能比较少,因此我们新建一个类对其继承,在sprite类的基础上丰富,以方便我们的使用。

首先来了解一下如何使用sprite类来加载动画吧。

1、精灵序列图

将要加载的动画帧放在一个精灵序列图里面,然后在程序里面调用它。pygame会自动更新动画帧,这样一个动态的图像就会展现在我们面前了。

下面是一个典型的精灵序列图:行和列的索引都是从0开始的。

2、加载精灵图序列:

在加载一个精灵图序列的时候,我们需要告知程序一帧的大小,(传入帧的宽度和高度,文件名)。

除此之外,还需要告诉精灵类,精灵序列图里面有多少列。load函数可以加载一个精灵序列图。def load(self, filename, width, height, columns):

self.master_image = pygame.image.load(filename).convert_alpha()

self.frame_width = width

self.frame_height = height

self.rect = 0,0,width,height

self.columns = columns

3.更新帧

一个循环动画通常是这样工作的:从第一帧不断的加载直到最后一帧,然后在折返回第一帧,并不断重复这个操作。self.frame += 1

if self.frame > self.last_frame:

self.frame = self.first_frame

self.last_time = current_time

但是如果只是这样做的话,程序会一股脑地将动画播放完了,我们想让它根据时间间隔一张一张的播放,因此加入定时的代码。

pygame中的time模块有一个get_ticks()方法可以满足定时的需要。ticks = pygame.time.get_ticks()

然后将ticks变量传递给sprite的update函数,这样就可以轻松让动画按照帧速率来播放了。哦,帧速率还没有设置,咱们现在设置一下帧速率。

启动一个定时器,然后调用tick(num)函数就可以让游戏以num帧来运行了。framerate = pygame.time.Clock()

framerate.tick(60)

4、绘制帧

sprite.draw()方法是用来绘制帧的,但是这个函数是由精灵来自动调用的,我们没有办法重写它,因此需要在update函数里面做一些工作。

首先需要计算单个帧左上角的x,y位置值(x表示列编号,y表示行编号):frame_x = (self.frame % self.columns) * self.frame_width

#用帧数目除以行数,然后在乘上帧的高度

frame_y = (self.frame // self.columns) * self.frame_height

然后将计算好的x,y值传递给位置rect属性。frame_x = (self.frame % self.columns) * self.frame_width

frame_y = (self.frame // self.columns) * self.frame_height

rect = ( frame_x, frame_y, self.frame_width, self.frame_height )

self.image = self.master_image.subsurface(rect)

5、精灵组

当程序中有大量的实体的时候,操作这些实体将会是一件相当麻烦的事,那么有没有什么容器可以将这些精灵放在一起统一管理呢?答案就是精灵组。

pygame使用精灵组来管理精灵的绘制和更新,精灵组是一个简单的容器。

使用pygame.sprite.Group()函数可以创建一个精灵组:group = pygame.sprite.Group()

group.add(sprite_one)

精灵组也有update和draw函数:group.update()

group.draw()

二、自定义的精灵类

好了,通过前面的学习,我们已经了解了一些精灵的知识了,现在我们将前面说到的方法封装成一个自定义的类,以方便我们的调用,这个类继承自pygame.sprite.Sprite:1 class MySprite(pygame.sprite.Sprite):

2 def __init__(self, target):

3 pygame.sprite.Sprite.__init__(self) #基类的init方法

4 self.target_surface = target

5 self.image = None

6 self.master_image = None

7 self.rect = None

8 self.topleft = 0,0

9 self.frame = 0

10 self.old_frame = -1

11 self.frame_width = 1

12 self.frame_height = 1

13 self.first_frame = 0

14 self.last_frame = 0

15 self.columns = 1

16 self.last_time = 0

17

18 def load(self, filename, width, height, columns):

19 self.master_image = pygame.image.load(filename).convert_alpha()

20 self.frame_width = width

21 self.frame_height = height

22 self.rect = 0,0,width,height

23 self.columns = columns

25 rect = self.master_image.get_rect()

26 self.last_frame = (rect.width // width) * (rect.height // height) - 1

27

28 def update(self, current_time, rate=60):

29 #更新动画帧

30 if current_time > self.last_time + rate:

31 self.frame += 1

32 if self.frame > self.last_frame:

33 self.frame = self.first_frame

34 self.last_time = current_time

35

37 if self.frame != self.old_frame:

38 frame_x = (self.frame % self.columns) * self.frame_width

39 frame_y = (self.frame // self.columns) * self.frame_height

40 rect = ( frame_x, frame_y, self.frame_width, self.frame_height )

41 self.image = self.master_image.subsurface(rect)

42 self.old_frame = self.frame

好了现在我们写一个小程序来测试一下这个类的性能怎么样。

这里我用ps制作了一个简单的精灵序列图,咱们就用这个萌萌的嗷大喵好了:

代码:import pygame

from pygame.locals import *

class MySprite(pygame.sprite.Sprite):

def __init__(self, target):

pygame.sprite.Sprite.__init__(self)

self.target_surface = target

self.image = None

self.master_image = None

self.rect = None

self.topleft = 0,0

self.frame = 0

self.old_frame = -1

self.frame_width = 1

self.frame_height = 1

self.first_frame = 0

self.last_frame = 0

self.columns = 1

self.last_time = 0

def load(self, filename, width, height, columns):

self.master_image = pygame.image.load(filename).convert_alpha()

self.frame_width = width

self.frame_height = height

self.rect = 0,0,width,height

self.columns = columns

rect = self.master_image.get_rect()

self.last_frame = (rect.width // width) * (rect.height // height) - 1

def update(self, current_time, rate=60):

if current_time > self.last_time + rate:

self.frame += 1

if self.frame > self.last_frame:

self.frame = self.first_frame

self.last_time = current_time

if self.frame != self.old_frame:

frame_x = (self.frame % self.columns) * self.frame_width

frame_y = (self.frame // self.columns) * self.frame_height

rect = ( frame_x, frame_y, self.frame_width, self.frame_height )

self.image = self.master_image.subsurface(rect)

self.old_frame = self.frame

pygame.init()

screen = pygame.display.set_mode((800,600),0,32)

pygame.display.set_caption("精灵类测试")

font = pygame.font.Font(None, 18)

framerate = pygame.time.Clock()

cat = MySprite(screen)

cat.load("sprite.png", 100, 100, 4)

group = pygame.sprite.Group()

group.add(cat)

while True:

framerate.tick(30)

ticks = pygame.time.get_ticks()

for event in pygame.event.get():

if event.type == pygame.QUIT:

pygame.quit()

exit()

key = pygame.key.get_pressed()

if key[pygame.K_ESCAPE]:

exit()

screen.fill((0,0,100))

group.update(ticks)

group.draw(screen)

pygame.display.update()

效果图:萌萌的嗷大喵跃然于屏幕上。看起来功能还不错的说。

大家也可以制作一些自己喜欢的精灵序列图,然后加载并查看他们的效果。

关于精灵与精灵之间的冲突检测,精灵与组之间的碰撞检测,我们将会放在下个博客一起学习。

python动画精灵_【python游戏编程之旅】第六篇---pygame中的Sprite(精灵)模块和加载动画...相关推荐

  1. python动画精灵_Python游戏开发:pygame中的Sprite(精灵)模块和加载动画

    一.Sprite模块.sprite对象 在pygame.sprite模块里面包含了一个名为Sprite类,他是pygame本身自带的一个精灵.但是这个类的功能比较少,因此我们新建一个类对其继承,在sp ...

  2. 《游戏编程》第一部 基础篇

    <游戏编程>第一部 基础篇 目录: 零.基础篇的目的 一.游戏的动画原理 二.基于动画原理的提高 三.游戏的基石: 窗口 的建立 四.游戏制作利器: 引擎 的选择 文章内容: 零.基础篇的 ...

  3. 有奖征集活动系列—— iOS游戏编程之旅 已结束

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 为了帮助 ...

  4. 有奖征集活动系列——《iOS游戏编程之旅》已结束

    为了帮助广大iOS开发者更好地了解和学习开发技术,为CSDN博主们搭建技术交流分享的平台,为活跃社区气氛,CSDN博客频道特携手CSDN博客专家.<iOS游戏编程之从零开始-Cocos2dx与c ...

  5. objective-c 编程总结(第六篇)运行时操作 - 方法交换

    objective-c 编程总结(第六篇)运行时操作 - 方法交换 后面主要介绍oc类的运行时行为.这里面包括运行时方法的更换,消息的转发,以及动态属性.这些对于面向方面编程AOP的热爱者还是很有用的 ...

  6. 使用python开发网页游戏_四大游戏编程网站,边玩游戏,边学Python,拒绝枯燥快乐编程...

    原标题:四大游戏编程网站,边玩游戏,边学Python,拒绝枯燥快乐编程 前言 学习编程虽然对有些人来说是件乐事,但是对大多数人来说仍然是一件比较枯燥困难的事情.当然,面临这样困惑的人,并不是只有你一个 ...

  7. python语言 行业_如何入门编程开发行业 选择Python语言怎么样

    如何入门编程开发行业?选择Python语言怎么样?Python是一种面向对象的解释型计算机程序设计语言,它是纯粹的自由软件,语法简洁清晰,它具有丰富和强大的库.它常被称为胶水语言,能够把用其他语言制作 ...

  8. python游戏背景音乐循环_Python:pygame游戏编程之旅六(游戏中的声音处理)

    一款人性化的游戏中缺少不了声音,比如角色挂时惨叫一声,或PK时武器交锋的声音,还有就是英雄出场时的背景音乐,无不涉及到声音,本节我们就来看一下pygame中如何控制声音,下面是一个例子,但博客上传不了 ...

  9. python的对象模型_[ Python 源码剖析] 对象模型概述

    Python 是一门 面向对象 语言,实现了一个完整的面向对象体系,简洁而优雅. 与其他面向对象编程语言相比, Python 有自己独特的一面. 这让很多开发人员在学习 Python 时,多少有些无所 ...

最新文章

  1. .net卸载程序制作
  2. centos 安装 erlang
  3. Android开发之Gradle多渠道打包总结
  4. scrapy 伪装代理和fake_userAgent的使用
  5. [转载] 05 Numpy排序搜索计数及集合操作
  6. python循环遍历文件夹_如何用Python实现目录遍历
  7. iBase4J部署总结
  8. roberts算子实现
  9. 剖析拒绝服务攻击-SYN拒绝服务(转)
  10. Java 从多线程到并发编程(五)—— 线程调度 优先级倒置(反转) 阻塞 死锁 suspend
  11. java的声音处理方法
  12. matlab 解函数方程,MATLAB程序设计教程(7)—MATLAB解方程与函数极值
  13. 什么是CT 技术。。。你懂了么?
  14. 怎么调用onenet平台的API从而读取我们的设备数据和下发命令,做到控制开关
  15. 考研英语真题-四六级真题-计算机二级真题分享
  16. 程序分析过程中遇到疑难问题解决办法
  17. Android USB RNDIS
  18. 模拟美萍加密狗--Rockey2虚拟狗(二)
  19. 220kV降压变电所电气部分初步设计33号
  20. 过滤英文双引号替换为中文引号

热门文章

  1. javascript中的cookie问题
  2. Centos6.x X64 飞信安装
  3. MFC实现最小化到托盘
  4. python插入排序算法总结
  5. Java Socket分发服务负载均衡
  6. java生成Excel文件,下载
  7. Oracle使用小结
  8. javascript优化--01高质量编码
  9. MFC获取文件夹路径并得到该字符串
  10. 类的垂直关系中,如何把握纯虚函数