嗨喽~小伙伴们早上好,中午好,晚上好呀,

前面(点击跳转​​​​​​​)我们学习了第一个Pygame程序,接着,我们来了解Pygame中最为常用的几个对象。学完今天的内容,我们就可以开发一个稍微复杂一点的游戏了。

一. Surface 对象

        Surface对象表示的是一个矩形的2D图像,这个图像,实际上是由非常多的像素点组成的,比如一个(300px , 400px)的Surface对象,这个矩形2D图像由300*400个像素点组成。可以通过调用Pygame的绘制函数,来对一个Surface对象的某些区域进行填充,从而达到修改整个2D图像的效果。需要注意的是,窗口的边框,标题栏,按钮并不属于Surface对象的一部分。

我们把通过pygame.display.set_mode() 函数返回的Surface对象,称为显示Surface对象,绘制到显示Surface对象上的任何内容,在调用pygame.display.update()函数后,都会显示到窗口上。

游戏制作中,经常要将几个不同的内容绘制到一个Surface对象中,在游戏的某一次循环里,调用pygame.display.update()函数后,这个Surface对象包含的所有内容都会绘制到屏幕上,这个Surface对象(会频繁更新)被显示到屏幕上的次数,称为帧数。一般而言,计算机的运行速度很快,游戏中一般采用每秒30(60,90)帧,即30(60,90)FPS,这叫作帧速率,简称帧率。此处30 FPS的含义是,1s内,游戏界面会被更新30次。

二. Color对象

        颜色在游戏设计中是必不可少的一部分。在计算机显示器上,以光的颜色为基础,由于光有三原色-----绿,通过将这三种颜色按不同比例混合,可以形成任何其他的颜色。

在Pygame中,我们使用三个整数的元组 (a,b,c) 来表示任何一种颜色,第一个整数a表示颜色中有多少红色,取值为0~255,同理,第二个整数对应绿色,第三个整数对应蓝色。如(0,0,255)表示蓝色,(0,255,0)表示绿色,(128,128,128)三色混合后会得到灰色。

Pygame中创建颜色主要有两种方式。一是利用3个0~255的整数组成的元组,二是利用pygame.Color对象。

我们用代码来演示一下:


import sys,pygame
from pygame.locals import *#color      R    G    BBLACK = (   0,   0,   0)
WHITE = ( 255, 255, 255)
BLUE  = pygame.Color(   0,   0, 255)  # 与前面的颜色创建方式效果相同
GREEN = pygame.Color(   0, 255,   0)pygame.init()
DISPLAY_SURF = pygame.display.set_mode((400,300))
# 将整个显示Surface对象填充为白色
DISPLAY_SURF.fill(WHITE)
# 在Surface对象上,从左上角坐标(0,0)开始,绘制一个往右100px,往下100px的矩形2D区域并填充为黑色
pygame.draw.rect(DISPLAY_SURF, BLACK,(0,0,100,100))
# 在Surface对象上,从左上角坐标(100,0)开始,绘制一个往右100px,往下100px的矩形2D区域并填充为绿色
pygame.draw.rect(DISPLAY_SURF,GREEN,(100,0,100,100))pygame.display.set_caption("Hello World~")while True:for event in pygame.event.get():if event.type == QUIT:pygame.quit()sys.exit()# 将Surface对象更新到屏幕上显示pygame.display.update()

运行结果:

上面用到了一个绘制函数pygame.draw.rect(Surface,Color,(x,y,a,b)),它会在Surface对象上绘制一个矩形区域,第三个参数是一个四元元组,其前两个参数表明矩形区域左上角的坐标(pygame中的XOY坐标,以窗口左上角为原点(0,0),向右为x坐标,向下为y坐标),后两个参数表明矩形区域的大小,单位为像素px。

此外,颜色除了各种颜色的混合比例之外,还有一个特征,那就是颜色的透明度。Pygame允许在颜色的三元元组基础之上加入第四个整数(alpha value,范围0~255),用于表示颜色的透明度。0表示完全透明,255表示完全不透明。

为了能够使用透明颜色来进行绘制,Pygame要求必须使用convert_alpha()方法来创建一个Surface对象。也就是说,能够使用透明颜色来进行绘制的Surface对象,必须用convert_alpha()方法创建。比如上面的代码,我们加上一句:

Alpha_Surface = DISPLAY_SURF.convert_alpha()

上述代码表明可以在Alpha_Surface对象上可以使用透明颜色绘制,而DISPLAY_SURF上不行。

三. Rect对象

与颜色一样,Pygame提供两种方式创建一个矩形区域。

一是利用四元元组(x,y,a,b) 

  • x :矩形区域左上角的x坐标
  • y :矩形区域左上角的y坐标
  • a :矩形区域的宽度(以像素为单位)
  • b :矩形区域的高度(以像素为单位)

二是创建pygame.Rect对象,如:

rect = pygame.Rect(100,200,100,200) # 等同于 rect = (100,200,100,200)

与颜色类似,上述“等同”的含义是,如果有一个针对矩形区域的函数参数的话,那么既可以传入一个四元元组,也可以传入一个pygame.Rect对象(底层实现是重载) 。

pygame.Rect对象有许多属性,现将常用的列举如下:

Rect对象的属性
属性 含义(返回值)
Rect.left 矩形区域最左边的X坐标(int类型)
Rect.right 矩形区域最右边的X坐标(int类型)
Rect.top 矩形区域顶部的Y坐标(int类型)
Rect.bottom 矩形区域底部的Y坐标(int类型)
Rect.centerx 矩形区域中央的X坐标(int类型)
Rect.centery 矩形区域中央的Y坐标(int类型)
Rect.width 矩形区域的宽度(int类型)
Rect.height 矩形区域的高度(int类型)
Rect.size 矩形区域大小的元组:(width,height)
Rect.topleft 元组(int类型):(top,left)
Rect.topright 元组(int类型):(top,right)
Rect.bottomleft 元组(int类型):(bottom,left)
Rect.bottomright 元组(int类型):(bottom,right)
Rect.midleft 元组(int类型):(left,centery)
Rect.midright 元组(int类型):(right,centery)
Rect.midtop 元组(int类型):(centerx,top)
Rect.midbottom 元组(int类型):(centerx,bottom)

四. 绘制函数

        有了前面知识的铺垫,我们就可以用Pygame提供的绘制函数来绘制我们想要绘制的图形了。

先上代码,在代码中注释了每个绘制函数参数的具体含义:


import pygame, sys
from pygame.locals import *# 初始化pygame库
pygame.init()# 创建窗口
DISPLAY_SURF = pygame.display.set_mode((400, 300), 0, 32)
pygame.display.set_caption('Drawing')# 设置颜色
BLACK = (  0,   0,   0)
WHITE = (255, 255, 255)
RED   = (255,   0,   0)
GREEN = (  0, 255,   0)
BLUE  = (  0,   0, 255)# 绘制图形# 填充为白色
DISPLAY_SURF.fill(WHITE)'''pygame.draw.polygon(Surface,Color,pointlist,thickness)在DISPLAY_SURF上,画一个多边形,第三个参数为多边形顶点坐标顺次构成的元组,最后的1(px)为多边形的粗细,忽略此参数或设为0,Pygame会视为用颜色填充此多边形
'''
pygame.draw.polygon(DISPLAY_SURF, GREEN, ((146, 0), (291, 106), (236, 277), (56, 277), (0, 106)),1)'''pygame.draw.line(Surface,Color,start_point,end_point,thickness)在DISPLAY_SURF上,画一条线,(60,60),(120,60)分别为线的起始坐标,终点坐标,4(px)为线条粗细,单位为像素
'''
pygame.draw.line(DISPLAY_SURF, BLUE, (60, 60), (120, 60), 4)
pygame.draw.line(DISPLAY_SURF, BLUE, (120, 60), (60, 120), 1)
pygame.draw.line(DISPLAY_SURF, BLUE, (60, 120), (120, 120), 4)'''pygame.draw.circle(Surface,Color,center_point,radius,thickness)在DISPLAY_SURF上,画一个圆,(300,50)为圆心的坐标,20(px)为圆的半径,0(px)指明圆的粗细,忽略此参数或者设为0,则Pygame默认将圆用颜色填充'''
pygame.draw.circle(DISPLAY_SURF, BLUE, (300, 50), 20, 0)'''pygame.draw.ellipse(Surface,Color,bounding_rectangle,thickness)画一个椭圆,由于一个矩形可以唯一的确定一个椭圆,故将其绑定一个Rect对象的矩形区域,1(px)为椭圆的粗细,忽略此参数或者设为0,则Pygame默认将椭圆用颜色填充
'''
pygame.draw.ellipse(DISPLAY_SURF, RED, (300, 200, 40, 80), 1)'''pygame.draw.rect(Surface,Color,rectangle_tuple,thickness)画一个矩形,(200, 150, 100, 50)表示矩形左上角坐标为(200,150),宽度100px,高度50px
'''
pygame.draw.rect(DISPLAY_SURF, RED, (200, 150, 100, 50))# run the game loop
while True:for event in pygame.event.get():if event.type == QUIT:pygame.quit()sys.exit()pygame.display.update()

运行结果:

代码中对每个绘制函数都有详细的注释,此处就不再赘述了。

四. 制作动画 && pygame.time.Clock 对象

         动画是一个游戏的灵魂,如何产生一幅动的画面呢?

前面聊过,while循环里如果设置帧率为30FPS,则屏幕上的画面会每秒更新30次,也就是说,Pygame会将Surface对象以每秒30次的速度不断重新绘制到屏幕上。

这样,如果在每次绘制到屏幕之前,对Surface对象上的内容做略微修改,这样不就产生“动的”画面了吗?

现在的问题是,我们如何控制Surface对象以每秒30次的速度绘制到屏幕上呢?

这个不用我们考虑,Pygame提供了一个专门用于控制帧率的类 pygame.time.Clock。由于计算机运行速度极快,容易导致游戏速度过快,玩家的体验不太好,因而这个对象可以确保游戏以某一个最大的帧率运行,但有时,如果是大型游戏,代码量过多,以至于无法正常运行,来频繁的绘制到屏幕上,会使得帧率下降。

Clock对象的用法:首先,创建Clock对象:

fpsClock = pygame.time.Clock()

Clock对象会在游戏的每一次循环上都设置一个小小的暂停,确保游戏不会运行得太快。

每次循坏的最后,调用pygame.display.update()方法将Surface对象绘制到屏幕上之后,应调用Clock对象的 tick() 方法:

# run the game loop
while True:for event in pygame.event.get():if event.type == QUIT:pygame.quit()sys.exit()pygame.display.update()# 调用tick(),传入30FPSfpsClock.tick(FPS)

这样会使得,游戏以最大帧率30FPS运行。

借invpy官网的一段代码,我们演示一个简单的“猫移动”的动画,我们需要一张“猫”的图片:

代码如下:


import pygame, sys
from pygame.locals import *pygame.init()# 帧率设置为30FPS
FPS = 30# 创建Clock对象
fpsClock = pygame.time.Clock()# 创建窗口
DISPLAY_SURF = pygame.display.set_mode((400, 300))
pygame.display.set_caption('Animation')WHITE = (255, 255, 255)
# 加载图片
catImg = pygame.image.load('cat.png')
CAT_X = 10
CAT_Y = 10# 设置猫初始往右移动
direction = 'right'while True:  # main game loopDISPLAY_SURF.fill(WHITE)# 简单地方向控制if direction == 'right':CAT_X += 5if CAT_X == 280:direction = 'down'elif direction == 'down':CAT_Y += 5if CAT_Y == 220:direction = 'left'elif direction == 'left':CAT_X -= 5if CAT_X == 10:direction = 'up'elif direction == 'up':CAT_Y -= 5if CAT_Y == 10:direction = 'right'# 利用blit()方法将图片复制到Surface对象中# 图片的左上角位于(CAT_X, CAT_Y)DISPLAY_SURF.blit(catImg, (CAT_X, CAT_Y))for event in pygame.event.get():if event.type == QUIT:pygame.quit()sys.exit()# 将Surface对象绘制到屏幕上pygame.display.update()# 设置帧率:30FPSfpsClock.tick(FPS)

运行结果:

到这,Pygame的基础知识就介绍完了,内容也许比较多,小伙伴们多多理解和实践。下一章,我们开始动手做一个稍微复杂一点的游戏:

Python不能做游戏?游戏实战之-----《ink spill》​​​​​​​

最后,喜欢的小伙伴们点个赞鼓励支持一下吧~

Python不能做游戏?Pygame中的对象你了解吗?相关推荐

  1. Python不能做游戏?游戏实战之-----《ink spill》(附游戏完整源码)

    嗨喽-小伙伴们,大家早上好,中午好,晚上好呀, 通过前两章对Pygame的学习,我们了解了它的基本使用,附上链接: 1. Python不能做游戏?一小时做出一个游戏! 2. Python不能做游戏?P ...

  2. Python不能做游戏?一小时做出一个游戏!

    嗨喽-小伙伴们,我又来了, 写在前面的话: [ 一直都听他们说,python做不出好的游戏,个人是不赞同的,我只能说,python可以用来写游戏,但不适合. 举个最简单的例子,弹弓可以用来拔牙吗?当然 ...

  3. python能做游戏吗-python能做游戏吗

    能,但不适合. 用锤子能造汽车吗? 谁也没法说不能吧?地球上也有很多汽车,是用锤子造出来的..但一般来说,还是用工业机器人更合适对吗? 比较大型的,使用Python的游戏有两个,一个是<EVE& ...

  4. python能做游戏吗-python能开发游戏吗

    python可以写游戏,但不适合.下面我们来分析一下具体原因. 用锤子能造汽车吗? 谁也没法说不能吧?历史上也确实曾经有些汽车,是用锤子造出来的.但一般来说,还是用工业机器人更合适对吗? 比较大型的, ...

  5. python库tkinter、pygame中几点需要注意的问题

    恍然之间已经16年快四月份了,已经好久都没有写过东西了.. 最近在用python做一些小的游戏,在网上找了一些Python库,Python中游戏编程最常用的还是pygame了,其次是Tkinter p ...

  6. python能做游戏吗-没有Python不能做的游戏,这些游戏都可以做

    简介:Python编程语言的强大,几乎是众所周知的!那么,下面我给大家介绍一下几个用Python实现的各种游戏吧.不仅能用来做web.爬虫.数据分析等,没想到还能用做这么多的游戏,实在令人惊讶不已.注 ...

  7. python扫雷代码_谁说Python不能做游戏的?能做这些游戏,附赠所有游戏源码文件...

    Python编程语言的强大,几乎是众所周知的! 不仅能用来做web.爬虫.数据分析等,没想到还能用做这么多的游戏,实在令人惊讶不已. 那么,下面我给大家介绍一下几个用Python实现的各种游戏吧. 注 ...

  8. 游戏开发- Python语言在游戏开发中的潜力

    PYTHON 是一种面向对象的通用高级编程语言,由 GUIDO VAN ROSSUM 于 1991 年开发.自发展以来,PYTHON 已成为世界上最流行的编程语言之一.它经常在流行度调查中排名靠前-- ...

  9. 用python自己做游戏_练习项目20:使用python制作游戏(中)

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 上一篇教程,我们通过实现一个敌机由上至下的循环过程,初步了解了pygame这个模块的使用. 接下来,我们进行第二阶段,真正的实现一个通过鼠标控制的小游戏. ...

最新文章

  1. Android RadioButton 修改选择框
  2. 【ACM】树 小结
  3. tp5,thinkphp5,隐藏index.php,隐藏入口文件
  4. C# 利用.NET 升级助手将.NET Framework项目升级为.NET 6
  5. BeetleX.WebFamily针对Web SPA应用的改进
  6. Qt文档阅读笔记-QGraphicsBlurEffect官方解析与实例
  7. java中mydoc_实验二/MyDoc.java · 20175326李一潇/20175326java - Gitee.com
  8. Android study week1
  9. 网站小尾巴 流量统计 网站流量统计 解决方案
  10. 使用sudo apt-get出现无法解析域名的问题:“cn.archive.ubuntu.com”
  11. 史密斯圆图串并联口诀_史密斯圆图的详解
  12. 关于内存地址和内存空间的理解
  13. 洛谷P1129: [ZJOI2007]矩阵游戏(二分图最大匹配)
  14. 算法学习系列(贪心算法)—多处最优服务次序问题
  15. 用HMM(隐马)图解三国杀的于吉“质疑”
  16. 神都夜行录无法显示服务器,神都夜行录提示无响应怎么办
  17. 总结利用秩为1的矩阵相关矩阵的秩的计算问题
  18. 超好用的八款办公软件,你的电脑都装了吗?
  19. 瞬间几千次的重复提交,我用 SpringBoot+Redis 扛住了
  20. 一个竞赛蒟蒻,开个Blog玩玩

热门文章

  1. 微软SQLServer官方示例项目部署-数据引擎和分析服务部分
  2. linux 下配置mysql主从同步的步骤
  3. .net中调用windows performance记录性能信息
  4. Shiro安全框架案例
  5. 权限组件之录入获取登入用户的所有权限
  6. [bzoj2588] Count on a tree
  7. form图片上传遇到错误
  8. python:类5——Python 的类的下划线命名有什么不同?
  9. Linux之iostat命令
  10. Python3常用字符串操作