一、pygame中常用的数学函数

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

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

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

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

首先从datetime导入date和time

from datetime import datetime,date,time

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

today = datetime.today()

print(today)
2019-03-29 17:42:55.960923

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

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

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

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

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

1、加载位图

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

space= pygame.image.load("spqce.png").convert_alpha()

convert_alpha()方法会使用透明的方法绘制前景对象

2、绘制位图

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

screen.blit(space,(0,0))

第一个参数;space 是加载完整的位图,第二个参数是绘制的起始坐

完整的程序如下:

import sys,pygame,math,random
from pygame.locals import * pygame.init()
screen = pygame.display.set_mode((800,600))
title = pygame.display.set_caption("星空") #创建字体
font = pygame.font.Font(None,18) #加载位图,convert_alpha:使前景对象透明
space = pygame.image.load("space.png").convert_alpha() while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
#获得键盘上所有按键的状态
keys = pygame.key.get_pressed()
if keys[K_ESCAPE]:
sys.exit() #绘制图位
screen.blit(space,(0,0)) pygame.display.update()

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

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

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

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

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

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

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

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

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

考虑让超人绕着地球旋转

import sys,pygame,math,random
from pygame.locals import * #定义一个类,方便实现图像的坐标
class Point(object):
def __init__(self,x,y):
self.__x = x
self.__y = y def getx(self):
return self.__x
def setx(self,x):
self.__x = x
x = property(getx,setx) def gety(self):
return self.__y
def sety(self,y):
self.__y = y
y = property(gety,sety) #定义一个warp_angle(angle)函数,返回0~360之间的角度
def warp_angle(angle):
return angle % 360 '''
radius是半径
angle是角度默认值
pos代表图像坐标
'''
radius = 250
angle = 0.0
pos = Point(0,0)
old_pos = Point(0,0) pygame.init()
screen = pygame.display.set_mode((800,600))
title = pygame.display.set_caption("星空") #创建字体
font = pygame.font.Font(None,18) #加载位图,convert_alpha:使前景对象透明
space = pygame.image.load("space.png").convert_alpha()
#加载地球位图
planet = pygame.image.load("planet2.png").convert_alpha()
#加载超人位图
superman = pygame.image.load("military.png").convert_alpha() #获取超人位图的宽和高
width,height = superman.get_size()
#缩放机器人
superman = pygame.transform.smoothscale(superman,(width//2,height//2)) while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
#获得键盘上所有按键的状态
keys = pygame.key.get_pressed()
if keys[K_ESCAPE]:
sys.exit() # 绘制背景图位
screen.blit(space, (0, 0))
# 获取地球位图的宽和高
width, height = planet.get_size()
# 在屏幕中间绘制地球
screen.blit(planet, (400 - width / 2, 300 - height / 2)) '''
|-- warp_angle是返回0~360的角度,而此代码是360度逐次减0.5度,来控制机器人移动的速度
|-- pos.x,pos.y:图像移动的正反坐标
|-- math.sin:返回弧度的正弦值,数值在-1,1之间
|-- math.cos:返回弧度的余弦值,数值在-1,1之间
|-- math.radians:角度转换成弧度,返回的是一个数值
'''
angle = warp_angle(angle - 0.5)
#print("====",angle)
pos.x = math.sin(math.radians(angle))*radius
pos.y = math.cos(math.radians(angle))*radius
#获取机器人的宽和高
width,height = superman.get_size()
#绘制机器人,通过第二个参数的x,y轴移动来控制移动的正向还是反向
screen.blit(superman,(350+pos.x-width//2,250+pos.y-height//2)) pygame.display.update()

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

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

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

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

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

import sys,pygame,math,random
from pygame.locals import * #定义一个类,方便实现图像的坐标
class Point(object):
def __init__(self,x,y):
self.__x = x
self.__y = y def getx(self):
return self.__x
def setx(self,x):
self.__x = x
x = property(getx,setx) def gety(self):
return self.__y
def sety(self,y):
self.__y = y
y = property(gety,sety) #定义一个warp_angle(angle)函数,返回0~360之间的角度
def warp_angle(angle):
return angle % 360 '''
radius是半径
angle是角度默认值
pos代表图像坐标
'''
radius = 250
angle = 0.0
pos = Point(0,0)
old_pos = Point(0,0) pygame.init()
screen = pygame.display.set_mode((800,600))
title = pygame.display.set_caption("星空") #创建字体
font = pygame.font.Font(None,18) #加载位图,convert_alpha:使前景对象透明
space = pygame.image.load("space.png").convert_alpha()
#加载地球位图
planet = pygame.image.load("planet2.png").convert_alpha()
#加载超人位图
superman = pygame.image.load("military.png").convert_alpha() #获取超人位图的宽和高
width,height = superman.get_size()
#缩放机器人
superman = pygame.transform.smoothscale(superman,(width//2,height//2)) while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
#获得键盘上所有按键的状态
keys = pygame.key.get_pressed()
if keys[K_ESCAPE]:
sys.exit() # 绘制背景图位
screen.blit(space, (0, 0))
# 获取地球位图的宽和高
width, height = planet.get_size()
# 在屏幕中间绘制地球
screen.blit(planet, (400 - width / 2, 300 - height / 2)) '''
|-- warp_angle是返回0~360的角度,而此代码是360度逐次减0.5度,来控制机器人移动的速度
|-- pos.x,pos.y:图像移动的正反坐标
|-- math.sin:返回弧度的正弦值,数值在-1,1之间
|-- math.cos:返回弧度的余弦值,数值在-1,1之间
|-- math.radians:角度转换成弧度,返回的是一个数值
'''
angle = warp_angle(angle - 0.5)
#print("====",angle)
pos.x = math.sin(math.radians(angle))*radius
pos.y = math.cos(math.radians(angle))*radius '''
|-- 旋转飞船
|-- delta_x,delta_y表示x,y轴之间的距离
|-- math.atan2()表示返回给定的 X 及 Y 坐标值的反正切值
|-- rangled表示图像旋转角度
|-- math.degrees():将弧度转换成角度
|-- pygame.transform.rotate():用来旋转位图,需要传入的两个参数:图像,角度
'''
delta_x = (pos.x - old_pos.x)
delta_y = (pos.y - old_pos.y)
rangle = math.atan2(delta_y,delta_x)
rangled = warp_angle(-math.degrees(rangle))
superman_rotate = pygame.transform.rotate(superman,rangled) #获取飞船的宽和高
width,height = superman_rotate.get_size()
#绘制飞船,通过第二个参数的x,y轴移动来控制移动的正向还是反向
screen.blit(superman_rotate,(300+pos.x-width//2,250+pos.y-height//2)) 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. Struts2与spingmvc区别

    1.Struts2是类级别的拦截, 一个类对应一个request上下文,SpringMVC是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,所以说从架构本身上Spr ...

  2. 用dx生成dex时遇到class name does not match path

    前言 用dx生成dex时遇到class name (Hello) does not match path这个问题还弄了挺久,这里就简单的记录一下. 步骤 首先是dx工具是在Android的SDK里面的 ...

  3. common lisp的几个基本概念

    S-表达式 quote nil 与 () cons car cdr 真假 predicate 谓词与 t 与 nil null 函数 与 not 函数 if then else and 与 or de ...

  4. jquery的设计亮点

    jquery的亮点我目前学习到一下几点: 1.封装库利用window的挂载实现闭包. 库一定要封装来防止变量污染全局,方式要么对象,要么立即执行函数.jquery用了立即执行函数.因为立即执行函数里的 ...

  5. lucene学习教程

    1Lucene的介绍 ①Lucene是什么: 是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎 ②Lu ...

  6. 主席树 || 可持久化线段树 || BZOJ 3653: 谈笑风生 || Luogu P3899 [湖南集训]谈笑风生

    题面:P3899 [湖南集训]谈笑风生 题解: 我很喜欢这道题. 因为A是给定的,所以实质是求二元组的个数.我们以A(即给定的P)作为基点寻找答案,那么情况分两类.一种是B为A的父亲,另一种是A为B的 ...

  7. Codeforces 1114 - A/B/C/D/E/F - (Undone)

    链接:http://codeforces.com/contest/1114 A - Got Any Grapes? 题意:甲乙丙三个人吃葡萄,总共有三种葡萄:绿葡萄.紫葡萄和黑葡萄,甲乙丙三个人至少要 ...

  8. BrowserRoute服务器配置

    BrowserRoute服务器配置 在React项目中我们经常需要采用React-Router来配置我们的页面路由,React-Router 是建立在 history 之上的,常见的history路由 ...

  9. servlet转发重定向

    1.request.getRequestDispacther("/test.jsp").forword(request,response);     转发   浏览器URL是一个地 ...

  10. MySQL慢查询日志总结 日志分析工具mysqldumpslow

    MySQL慢查询日志总结 - 潇湘隐者 - 博客园 https://www.cnblogs.com/kerrycode/p/5593204.html 2016-06-17 10:32 by 潇湘隐者, ...