术语“精灵”是旧计算机和游戏机的保留。这些较旧的盒子无法以足够快的速度绘制和擦除普通图形,使其无法用作游戏。这些机器有特殊的硬件来处理需要快速动画的游戏对象。这些对象被称为“精灵”并有特殊的限制,但可以非常快速地绘制和更新。它们通常存在于视频中的特殊覆盖缓冲区中。这些天来,计算机已经变得足够快,可以在没有专用硬件的情况下处理类似精灵的对象。sprite 一词仍然用于表示 2D 游戏中的任何动画。

这一篇学习笔记,我们来学习精灵,首先给出基础框架代码

import pygame
from pygame.locals import *
import sysclass Game:def __init__(self):pygame.init()self.W,self.H=800,800self.screen=pygame.display.set_mode((self.W,self.H))pygame.display.set_caption("【Pygame 学习笔记】")def listen(self):for event in pygame.event.get():if event.type==QUIT:sys.exit()def draw(self):self.screen.fill((255,255,255))def run(self):while True:self.listen()self.draw()pygame.display.update()if __name__ == '__main__':game=Game()game.run()

给出需要的资源文件:

balloon.png


我们来写一个源源不断有气球从屏幕顶端往下落的程序,首先,我们将balloon.png放置于python文件同目录下的resources文件夹,resources文件夹可以用来储存资源文件,然后定义一个类Balloon,继承自pygame.sprite.Sprite,初始化中进行超类初始化

class Balloon(pygame.sprite.Sprite):def __init__(self):super().__init__()

然后继续在初始化方法中创建self.image变量用于储存气球的图片,将图片导入并缩小到50x50的大小,self.rect变量储存该精灵的位置,self.speed表示下落的速度,在程序开头导入random,import random as rd,然后使用随机库的生成随机整数方法,随机生成x坐标,底部y坐标为窗口顶部

注意,这里的self.image和self.rect变量名不可以改成其它名字,因为这两个变量是在pygame的Sprite类中定义的,我们只是重写为自己想要的内容,并且在之后我们要讲到的将精灵绘制到窗口的操作都和这两个变量息息相关,所以这里的self.image和self.rect存储的必须是图像和它对应的rect对象

        self.image=pygame.transform.smoothscale(pygame.image.load("resources/balloon.png"),(50,50))self.rect=self.image.get_rect()self.rect.midbottom=rd.randint(50,game.W-50),0self.speed=1

然后,重写update方法,这里的update方法也是不能改名的哦,在update方法中,让y坐标递增,然后只要rect的顶部到达窗口最下方,就清除该精灵,清楚精灵用Sprite中自带的kill方法

    def update(self):self.rect.y+=self.speedif self.rect.top>=game.H:self.kill()

这样,一个简简单单的精灵类就写完啦,接下来,我们来学习如何将精灵绘制到屏幕中,还有如何添加精灵等操作

在Game类初始化中创建精灵组,用pygame.sprite.Group类

        self.balloons=pygame.sprite.Group()

然后在主程序中定义CREATEBALLOON,值为USEREVENT+1

CREATEBALLOON=USEREVENT+1

USEREVENT是pygame留给用户使用的事件常量,大于USEREVENT的值都是供用户使用的,所以我们这里把他定义为USEREVENT+1

然后再Game类中run程序的while循环前写入

pygame.time.set_timer(CREATEBALLOON,700)

上面这行代码用到了pygame.time.set_timer方法,传入两个参数,第一个是事件,第二个是毫秒数,表示从这行代码开始,每运行多少毫秒触发一次事件,我们这里设置为700,也就是每700毫秒触发一次创建气球的事件,接下来我们在listen中进行事件的监听,在for循环事件遍历中添加这段代码,当程序捕捉到这个事件时,就向self.balloons精灵组添加精灵,用到了add方法,传入的参数就是我们精灵类的一个实例化

            if event.type==CREATEBALLOON:self.balloons.add(Balloon())

然后,在draw方法中,对精灵组进行更新,然后绘制,更新用到了update方法,绘制用draw方法,draw传入窗口的Surface,也就是直接传入self.screen即可

        self.balloons.update()self.balloons.draw(self.screen)

最终代码如下:

import pygame
from pygame.locals import *
import sys
import random as rdCREATEBALLOON=USEREVENT+1class Game:def __init__(self):pygame.init()self.W,self.H=800,800self.screen=pygame.display.set_mode((self.W,self.H))pygame.display.set_caption("【Pygame 学习笔记】")self.balloons=pygame.sprite.Group()def listen(self):for event in pygame.event.get():if event.type==QUIT:sys.exit()if event.type==CREATEBALLOON:self.balloons.add(Balloon())def draw(self):self.screen.fill((255,255,255))self.balloons.update()self.balloons.draw(self.screen)def run(self):pygame.time.set_timer(CREATEBALLOON,700)while True:self.listen()self.draw()pygame.display.update()class Balloon(pygame.sprite.Sprite):def __init__(self):super().__init__()self.image=pygame.transform.smoothscale(pygame.image.load("resources/balloon.png"),(50,50))self.rect=self.image.get_rect()self.rect.midbottom=rd.randint(50,game.W-50),0self.speed=1def update(self):self.rect.y+=self.speedif self.rect.top>=game.H:self.kill()if __name__ == '__main__':game=Game()game.run()

我们现在运行代码,发现气球下落的速度过快,在Balloon中修改speed为0.1,我们发现,精灵创建出来后,只会一直停留在窗口顶部,这是因为,精灵的rect和普通的rect稍有不同,精灵的rect对象参数值一般都为整数,我们将其增减小数都是无效的,也就是说精灵的下落每次都要下落1个像素,我们来讲解一下解决方案

解决方法1:修改运行速度

因为我们的运行速度过快,每秒run中while循环了很多次,我们要适当减少次数,并不难,在run的while前创建clock

        clock=pygame.time.Clock()

用下面方法看看帧率

            clock.tick()print(clock.get_fps())

因为我的这台电脑配置比较好,比较流畅,所以控制台输出的帧率一直在5000和3333.333之间跳动

我们在tick中添加一个参数,将帧率改为120

            clock.tick(120)print(clock.get_fps())

再运行程序,可看到,气球就正常地缓缓下落了,控制台输出的帧率,也是非常的接近120

调试完毕,再把print语句删掉即可,最终代码如下

import pygame
from pygame.locals import *
import sys
import random as rdCREATEBALLOON=USEREVENT+1class Game:def __init__(self):pygame.init()self.W,self.H=800,800self.screen=pygame.display.set_mode((self.W,self.H))pygame.display.set_caption("【Pygame 学习笔记】")self.balloons=pygame.sprite.Group()def listen(self):for event in pygame.event.get():if event.type==QUIT:sys.exit()if event.type==CREATEBALLOON:self.balloons.add(Balloon())def draw(self):self.screen.fill((255,255,255))self.balloons.update()self.balloons.draw(self.screen)def run(self):pygame.time.set_timer(CREATEBALLOON,700)clock=pygame.time.Clock()while True:clock.tick(120)self.listen()self.draw()pygame.display.update()class Balloon(pygame.sprite.Sprite):def __init__(self):super().__init__()self.image=pygame.transform.smoothscale(pygame.image.load("resources/balloon.png"),(50,50))self.rect=self.image.get_rect()self.rect.midbottom=rd.randint(50,game.W-50),0self.speed=1def update(self):self.rect.y+=self.speedif self.rect.top>=game.H:self.kill()if __name__ == '__main__':game=Game()game.run()

解决方法2

我们可以自己在精灵类中添加一个变量和一个计数器,每次运行update就将计数器+1,到达变量设置的值的时候,计数器归零,然后精灵才进行下落操作。将精灵类改成这样

class Balloon(pygame.sprite.Sprite):def __init__(self):super().__init__()self.image=pygame.transform.smoothscale(pygame.image.load("resources/balloon.png"),(50,50))self.rect=self.image.get_rect()self.rect.midbottom=rd.randint(50,game.W-50),0self.speed=1self.toUpdate=20self.counter=0def update(self):self.counter+=1if self.counter>=self.toUpdate:self.counter=0self.rect.y+=self.speedif self.rect.top>=game.H:self.kill()

我们再运行程序,气球也成功地减缓下落速度了

解决方法3:每次主循环运行一次过后进行手动延迟操作

这种方法也不难,一行代码就能搞定,用pygame.time.delay方法,传入一个数字,表示延迟毫秒数,直接将下面这行代码添加到while循环的最后面即可(我们这里设置为自己感觉适合的大小就可以,我这里设置为10毫秒)

            pygame.time.delay(10)

最终代码如下:

import pygame
from pygame.locals import *
import sys
import random as rdCREATEBALLOON=USEREVENT+1class Game:def __init__(self):pygame.init()self.W,self.H=800,800self.screen=pygame.display.set_mode((self.W,self.H))pygame.display.set_caption("【Pygame 学习笔记】")self.balloons=pygame.sprite.Group()def listen(self):for event in pygame.event.get():if event.type==QUIT:sys.exit()if event.type==CREATEBALLOON:self.balloons.add(Balloon())def draw(self):self.screen.fill((255,255,255))self.balloons.update()self.balloons.draw(self.screen)def run(self):pygame.time.set_timer(CREATEBALLOON,700)while True:self.listen()self.draw()pygame.display.update()pygame.time.delay(10)class Balloon(pygame.sprite.Sprite):def __init__(self):super().__init__()self.image=pygame.transform.smoothscale(pygame.image.load("resources/balloon.png"),(50,50))self.rect=self.image.get_rect()self.rect.midbottom=rd.randint(50,game.W-50),0self.speed=1def update(self):self.rect.y+=self.speedif self.rect.top>=game.H:self.kill()if __name__ == '__main__':game=Game()game.run()

今天的【Pygame 学习笔记】就讲到这里,喜欢我的文章别忘了多多点赞收藏+关注支持一下博主哦!

谢谢大家的支持~

【Pygame 学习笔记】8.精灵相关推荐

  1. Pygame学习笔记 4 —— 时间与运动

        还记得我们在之前的程序中如何让兔子动起来的吗,没错,使用event模块检测键盘事件,改变绘图的坐标,画面刷新后兔子就移动了.接下来我们细说如何精确控制时间和运动. 主要内容: pygame的时 ...

  2. Pygame学习笔记 6 —— 3D游戏

        pygame是是上世纪的产品,虽然不适合最3D游戏,但我可以使用pygame来绘制简单的3D图形,就像在白纸上画立体图形一样. 主要内容: 视觉上的远近.3D空间.绘制一个空间图形 一.视觉上 ...

  3. Python第三方库pygame学习笔记(一)

    Pygame Python最经典的2D游戏开发第三方库,也支持3D游戏开发 Pygame适合用于游戏逻辑验证.游戏入门及系统演示验证 Pygame是一种游戏开发引擎,基本逻辑具有参考价值 pygame ...

  4. Python可视化物理随机过程---pygame学习笔记2

    Python可视化物理随机过程-pygame学习笔记2 文章目录 Python可视化物理随机过程---pygame学习笔记2 一.扩散现象的简单的介绍 二.代码实现 三.运行代码的效果展示 四.总结 ...

  5. pygame 学习笔记(8)精灵动画的实现:子弹的爆炸效果

    本文内容 subsurface() 子 surface的学习 实现一个精灵动画 Note:本文代码基于上一小节,可以直接在上文文末下载工程文件. 在上一节中,我们只是让坦克移动起来,但不是真正的动画, ...

  6. pygame学习笔记(5)——精灵

    转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 据说在任天堂FC时代,精灵的作用相当巨大,可是那时候只知道怎么玩超级玛丽.魂斗罗,却对精灵一点也不知.pygame ...

  7. pygame 学习笔记(7)添加一个精灵:坦克的移动和旋转

    本文内容 精灵 类的使用 Rect 类的使用 实现一个坦克的移动和旋转 效果演示 添加一个静态坦克 我们已经知道如何创建一个游戏窗口,并设置背景图片,还让游戏程序可以对键盘和鼠标进行响应,接着我们需要 ...

  8. Pygame学习笔记6:使用Pygame精灵以及Escape the Dragon

    上一章介绍了位图编程的相关内容,这一章就开始实现动画操作,那么主要就是要来了解pygame.sprite模块. 在pygame.sprite模块中,有一个名为Sprite的类,我们需要对其进行扩展使其 ...

  9. pygame学习笔记——检测鼠标碰到、点击图片

    一.碰到效果实现思路 1.坐标检测 时刻检测鼠标的坐标,有没有移到目标图片的坐标范围内,此方法无法准确描述不规则图像的坐标范围. 2.精灵碰撞检测 创建一个鼠标精灵类,创建鼠标对象,一直跟着鼠标移动, ...

最新文章

  1. 从小乡村走出的985高校博导坦言:读书这条路最简单!
  2. c语言调用tuxedo步骤,tuxedo 入门
  3. IDEA中启动SpringBoot项目时提示:“Error java:程序包xxx不存在”,但实际上是存在的
  4. Java基础day18
  5. SQLite Insert 语句(http://www.w3cschool.cc/sqlite/sqlite-insert.html)
  6. PHP常用方法很有意义的博客网址
  7. 前端笔记-thymeleaf获取及回显select数据(combox)
  8. 源代码管理器添加步骤
  9. WebStrom开发微信小程序
  10. 大数据扫黄如此精准,你中招了没
  11. 同为前端工程师,待遇差别居然这么大!
  12. [渝粤教育] 九江学院 计量经济学 参考 资料
  13. Resizable BAR support(MSDN翻译)
  14. 2022年6月青少年软件编程(Python)等级考试试卷(一级)
  15. android 辅助服务默认开启,Android 检测辅助功能是否开启,并调整设置页面
  16. STAF/STAX 安装配置
  17. 省钱兄游戏陪玩小程序APP源码uniapp前端源码适配支持(APP+小程序+H5)
  18. vscode去掉markdown转pdf时的页眉和页脚
  19. ADS1.2软件的详细安装步骤,手把手。
  20. Airflow Python工作流引擎的重要概念介绍

热门文章

  1. 金山毒霸出现漏洞 多款著名软件被误杀
  2. OpenStack组件部署之Glance
  3. [TensorFlow系列-4]:Tensorflow基础 - 张量的创建方法
  4. ArcGIS 构建3D动画方法
  5. 常见TCP/IP面试题(边学边补充)
  6. UnityWebRequest通信
  7. 干货讲解,财务报表结构分析
  8. 牛皮席为什么和床垫不贴合呢?
  9. js获取系统当前时间并格式化
  10. js原生获取当前年月日