一、pygame中常用的数学函数

首先介绍两个角度和弧度转换的函数

math.degress()和math.radians()用法很简单,只要将数值传进去然后接受返回值就可以

math.cos(angle),math.sin(angle),这里的angle使用的是弧度表示的,因此需要先使用math.radians(),将角度换成弧度然后在传参

如果要获取当前时间,我们需要使用datetime模块

首先从datetime导入date和time

  1. from datetime import datetime,date,time

使用datetime.body()函数可以获取当前的日期和事件

  1. today = datetime.today()
  2.  
  3. print(today)
  4. 2019-03-29 17:42:55.960923

需要当前时间而不包含当前日期

  1. time = datetime.today().time()
  2. print(time)
  3. 17:46:47.602774

Time有很多属性,Time.hour Time.minute Time.second Time.micresecond

二、pygame中加载位图,绘制位图

通常,游戏游戏中需要大量的位图,pygame中自带了一些类和函数可以帮组我们轻松的实现

1、加载位图

在pygame中可以使用pygame.image.load()函数来加载位图

  1. space= pygame.image.load("spqce.png").convert_alpha()
  2.  
  3. convert_alpha()方法会使用透明的方法绘制前景对象

2、绘制位图

surface对象有一个名为blit()的方法,它可以绘制位图

  1. screen.blit(space,(0,0))
  2.  
  3. 第一个参数;space 是加载完整的位图,第二个参数是绘制的起始坐

完整的程序如下:

  1. import sys,pygame,math,random
  2. from pygame.locals import *
  3.  
  4. pygame.init()
  5. screen = pygame.display.set_mode((800,600))
  6. title = pygame.display.set_caption("星空")
  7.  
  8. #创建字体
  9. font = pygame.font.Font(None,18)
  10.  
  11. #加载位图,convert_alpha:使前景对象透明
  12. space = pygame.image.load("space.png").convert_alpha()
  13.  
  14. while True:
  15. for event in pygame.event.get():
  16. if event.type == QUIT:
  17. pygame.quit()
  18. sys.exit()
  19. #获得键盘上所有按键的状态
  20. keys = pygame.key.get_pressed()
  21. if keys[K_ESCAPE]:
  22. sys.exit()
  23.  
  24. #绘制图位
  25. screen.blit(space,(0,0))
  26.  
  27. pygame.display.update()

以上代码已经实现了星空背景图,下面的代码加载并绘制一个地球

  1. #加载地球位图
  2. planet2 = pygame.image.load("planet2.png").convert_alpha()
  3. #获取地球位图的宽和高
  4. width,height = planet2.get_size()
  5. #在屏幕中间绘制地球
  6. screen.blit(planet2,(400-width/2,300-height/2))

地球已经绘制完成以后,最后需要加载超人

  1. #加载机器人
  2. superman = pygame.image.load("military.png").convert_alpha()
  3. #绘制机器人
  4. screen.blit(superman,(30,30))

机器人图像太大,需要缩小一些

此时需要用到的模块:pygame.transform 这个模块可以满足我们的需求,这个模块包含了比如缩放,翻转等一些非常有用的函数

pygame.transform.scale()这是一个快速缩放函数,可以快速缩放一个图像,但是如果你试过以后就会发现他并不是那么理想,像素看起来很密集,有点奇怪

幸好它有一个名为pygame,transform,smoothscale()的变体,这个函数通过复杂的计算产生比较平滑的图像,当然他的运行好使大于快速缩放函数

  1. superman = pygame.transform.smoothscale(superman,(width//2,height//2))

考虑让超人绕着地球旋转

  1. import sys,pygame,math,random
  2. from pygame.locals import *
  3.  
  4. #定义一个类,方便实现图像的坐标
  5. class Point(object):
  6. def __init__(self,x,y):
  7. self.__x = x
  8. self.__y = y
  9.  
  10. def getx(self):
  11. return self.__x
  12. def setx(self,x):
  13. self.__x = x
  14. x = property(getx,setx)
  15.  
  16. def gety(self):
  17. return self.__y
  18. def sety(self,y):
  19. self.__y = y
  20. y = property(gety,sety)
  21.  
  22. #定义一个warp_angle(angle)函数,返回0~360之间的角度
  23. def warp_angle(angle):
  24. return angle % 360
  25.  
  26. '''
  27. radius是半径
  28. angle是角度默认值
  29. pos代表图像坐标
  30. '''
  31. radius = 250
  32. angle = 0.0
  33. pos = Point(0,0)
  34. old_pos = Point(0,0)
  35.  
  36. pygame.init()
  37. screen = pygame.display.set_mode((800,600))
  38. title = pygame.display.set_caption("星空")
  39.  
  40. #创建字体
  41. font = pygame.font.Font(None,18)
  42.  
  43. #加载位图,convert_alpha:使前景对象透明
  44. space = pygame.image.load("space.png").convert_alpha()
  45. #加载地球位图
  46. planet = pygame.image.load("planet2.png").convert_alpha()
  47. #加载超人位图
  48. superman = pygame.image.load("military.png").convert_alpha()
  49.  
  50. #获取超人位图的宽和高
  51. width,height = superman.get_size()
  52. #缩放机器人
  53. superman = pygame.transform.smoothscale(superman,(width//2,height//2))
  54.  
  55. while True:
  56. for event in pygame.event.get():
  57. if event.type == QUIT:
  58. pygame.quit()
  59. sys.exit()
  60. #获得键盘上所有按键的状态
  61. keys = pygame.key.get_pressed()
  62. if keys[K_ESCAPE]:
  63. sys.exit()
  64.  
  65. # 绘制背景图位
  66. screen.blit(space, (0, 0))
  67. # 获取地球位图的宽和高
  68. width, height = planet.get_size()
  69. # 在屏幕中间绘制地球
  70. screen.blit(planet, (400 - width / 2, 300 - height / 2))
  71.  
  72. '''
  73. |-- warp_angle是返回0~360的角度,而此代码是360度逐次减0.5度,来控制机器人移动的速度
  74. |-- pos.x,pos.y:图像移动的正反坐标
  75. |-- math.sin:返回弧度的正弦值,数值在-1,1之间
  76. |-- math.cos:返回弧度的余弦值,数值在-1,1之间
  77. |-- math.radians:角度转换成弧度,返回的是一个数值
  78. '''
  79. angle = warp_angle(angle - 0.5)
  80. #print("====",angle)
  81. pos.x = math.sin(math.radians(angle))*radius
  82. pos.y = math.cos(math.radians(angle))*radius
  83. #获取机器人的宽和高
  84. width,height = superman.get_size()
  85. #绘制机器人,通过第二个参数的x,y轴移动来控制移动的正向还是反向
  86. screen.blit(superman,(350+pos.x-width//2,250+pos.y-height//2))
  87.  
  88. pygame.display.update()

运行发现,超人可以绕着地球旋转,但是运动的比较僵硬,最好让自己也旋转起来,指向他移动的方向,以便让画面柔和一些

这里我们需要math.atan2()这个函数,它用于计算反正切函数,需要传递两个参数:delta_x,delta_y,

delta_x,delta_y表示两个坐标x,y之间的距离

工作流是这样的:先记录飞船的最近位置,然后使用当前位置和最近位置调用atan2函数,然后在给atan2函数的返回值加上180

我们还需要一个函数是pygame.trsnsform.rotate(),没错,它可以用来旋转位图,需要传两个参数:图像,图像旋转角度

  1. import sys,pygame,math,random
  2. from pygame.locals import *
  3.  
  4. #定义一个类,方便实现图像的坐标
  5. class Point(object):
  6. def __init__(self,x,y):
  7. self.__x = x
  8. self.__y = y
  9.  
  10. def getx(self):
  11. return self.__x
  12. def setx(self,x):
  13. self.__x = x
  14. x = property(getx,setx)
  15.  
  16. def gety(self):
  17. return self.__y
  18. def sety(self,y):
  19. self.__y = y
  20. y = property(gety,sety)
  21.  
  22. #定义一个warp_angle(angle)函数,返回0~360之间的角度
  23. def warp_angle(angle):
  24. return angle % 360
  25.  
  26. '''
  27. radius是半径
  28. angle是角度默认值
  29. pos代表图像坐标
  30. '''
  31. radius = 250
  32. angle = 0.0
  33. pos = Point(0,0)
  34. old_pos = Point(0,0)
  35.  
  36. pygame.init()
  37. screen = pygame.display.set_mode((800,600))
  38. title = pygame.display.set_caption("星空")
  39.  
  40. #创建字体
  41. font = pygame.font.Font(None,18)
  42.  
  43. #加载位图,convert_alpha:使前景对象透明
  44. space = pygame.image.load("space.png").convert_alpha()
  45. #加载地球位图
  46. planet = pygame.image.load("planet2.png").convert_alpha()
  47. #加载超人位图
  48. superman = pygame.image.load("military.png").convert_alpha()
  49.  
  50. #获取超人位图的宽和高
  51. width,height = superman.get_size()
  52. #缩放机器人
  53. superman = pygame.transform.smoothscale(superman,(width//2,height//2))
  54.  
  55. while True:
  56. for event in pygame.event.get():
  57. if event.type == QUIT:
  58. pygame.quit()
  59. sys.exit()
  60. #获得键盘上所有按键的状态
  61. keys = pygame.key.get_pressed()
  62. if keys[K_ESCAPE]:
  63. sys.exit()
  64.  
  65. # 绘制背景图位
  66. screen.blit(space, (0, 0))
  67. # 获取地球位图的宽和高
  68. width, height = planet.get_size()
  69. # 在屏幕中间绘制地球
  70. screen.blit(planet, (400 - width / 2, 300 - height / 2))
  71.  
  72. '''
  73. |-- warp_angle是返回0~360的角度,而此代码是360度逐次减0.5度,来控制机器人移动的速度
  74. |-- pos.x,pos.y:图像移动的正反坐标
  75. |-- math.sin:返回弧度的正弦值,数值在-1,1之间
  76. |-- math.cos:返回弧度的余弦值,数值在-1,1之间
  77. |-- math.radians:角度转换成弧度,返回的是一个数值
  78. '''
  79. angle = warp_angle(angle - 0.5)
  80. #print("====",angle)
  81. pos.x = math.sin(math.radians(angle))*radius
  82. pos.y = math.cos(math.radians(angle))*radius
  83.  
  84. '''
  85. |-- 旋转飞船
  86. |-- delta_x,delta_y表示x,y轴之间的距离
  87. |-- math.atan2()表示返回给定的 X 及 Y 坐标值的反正切值
  88. |-- rangled表示图像旋转角度
  89. |-- math.degrees():将弧度转换成角度
  90. |-- pygame.transform.rotate():用来旋转位图,需要传入的两个参数:图像,角度
  91. '''
  92. delta_x = (pos.x - old_pos.x)
  93. delta_y = (pos.y - old_pos.y)
  94. rangle = math.atan2(delta_y,delta_x)
  95. rangled = warp_angle(-math.degrees(rangle))
  96. superman_rotate = pygame.transform.rotate(superman,rangled)
  97.  
  98. #获取飞船的宽和高
  99. width,height = superman_rotate.get_size()
  100. #绘制飞船,通过第二个参数的x,y轴移动来控制移动的正向还是反向
  101. screen.blit(superman_rotate,(300+pos.x-width//2,250+pos.y-height//2))
  102.  
  103. pygame.display.update()

【python游戏编程04--加载位图与常用的数学函数】的更多相关文章

  1. 【python游戏编程之旅】第四篇---pygame中加载位图与常用的数学函数。

    本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 在上一篇博客中,我们学习了pygame事件与设备轮询.http://www.cnblogs.com/msxh ...

  2. Python游戏编程入门 中文pdf扫描版|网盘下载内附地址提取码|

    Python是一种解释型.面向对象.动态数据类型的程序设计语言,在游戏开发领域,Python也得到越来越广泛的应用,并由此受到重视. 本书教授用Python开发精彩游戏所需的[]为重要的该你那.本书不 ...

  3. 【python游戏编程之旅】第五篇---嗷大喵爱吃鱼小游戏开发实例

    本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 我们一同在前几期的博客中已经学到了很多pygame的基本知识了,现在该做个小游戏实战一下了. 前几期博客链接 ...

  4. 【python游戏编程之旅】第三篇---pygame事件与设备轮询

    本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 在上一篇博客中,我们学习了pygame中的IO.数据http://www.cnblogs.com/msxh/ ...

  5. Direct2D开发:MFC下从资源文件中加载位图

    转载请注明出处:http://www.cnblogs.com/ye-ming 0X01 概述: 相对于GDI处理界面,Direct2D有得天独厚的优势,下图就是Direct2D与GDI的效果对比,wi ...

  6. Android中加载位图的方法

    Android中加载位图的关键的代码: AssetManager assets =context.getAssets(); //用一个AssetManager 对象来从应用程序包的已编译资源中为工程加 ...

  7. Direct2D开发:从资源加载位图

    转载请注明出处:http://www.cnblogs.com/Ray1024 一.概述 Direct2D使用Windows图像处理组件 (WIC) 来加载位图.从文件加载位图的方法很简单,而且网上的教 ...

  8. SharpDX之Direct2D教程II——加载位图文件和保存位图文件

    本系列文章目录: SharpDX之Direct2D教程I——简单示例和Color(颜色) 绘制位图是绘制操作的不可缺少的一部分.在Direct2D中绘制位图,必须先利用WIC组件将位图加载到内存中,再 ...

  9. Direct2D 加载位图

    说明: 通过WIC从文件加载位图. 可缩放后加载到内存. 源码: HRESULT LoadImageFormFile( IWICImagingFactory *pWicFactory, ID2D1Re ...

随机推荐

  1. centos7邮件服务器SSL配置

    在上篇文章centos7搭建postfix邮件服务器的搭建中我们没有配置SSL,接下来我们在这篇文章中讲讲centos7邮件服务器SSL配置. 1. 创建SSL证书 [root@www ~]# cd ...

  2. xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun

    原文地址 xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcru ...

  3. Java 递归获取一个路径下的所有文件,文件夹名称

    package com.readfile; import java.io.File; public class GetAllFiles { public static void main(String ...

  4. LCA(Lowest Common Ancesor)

    LCA(Lowest Common Ancesor) 1.基于二分搜索算法 预处理father[v][k]表示v的2的k次方层祖先,时间复杂度是O(nlogn),每次查询的时间复杂度是O(logn), ...

  5. android studio/Intellij IDEA(MAC OSX)中android模拟器无法启动的一种原因

    翻了stackoverflow上好多方式,各种重装重启清理缓存,都没有效果. 后来发现,用IDEA创建的模拟器的路径是 /Users/xirtam/.android/avd 而IDE使用的路径是 AN ...

  6. RoR-Scaffolding

    Scaffolding能快速让rails跑起来 同时也生成JSON response rails g scaffolding "xxx" xxy:integer 生成scaffol ...

  7. 【Python全栈-JavaScript】JavaScript的window.onload()与jQuery 的ready()的区别

    JavaScript的window.onload()与jQuery 的ready()的区别 做web开发时常用Jquery中$(document).ready()和JavaScript中的window ...

  8. Mybatis tinyint(1)自动转boolean

    使用Mybatis查询tinyint(1)字段数据,返回值为Map类型,那么tinyint(1)的数据默认会转化为boolean类型数据.解决方案:  1.使用ifnull(column, 0)处理该 ...

  9. docker+httpd的安装

    docker pull docker.io/httpd //直接这么运行会报“没有conf/httpd.cong这个文件” docker run -d --name httpd2. -p : -p : ...

  10. Centos7下安装Docker(详细的新手装逼教程)

    早就听说过Docker,一直不清楚是个啥,今天捣鼓了一下,这里做个记录. --------------------------------------------------------------- ...