【python游戏编程04--加载位图与常用的数学函数】
一、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--加载位图与常用的数学函数】的更多相关文章
- 【python游戏编程之旅】第四篇---pygame中加载位图与常用的数学函数。
本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 在上一篇博客中,我们学习了pygame事件与设备轮询.http://www.cnblogs.com/msxh ...
- Python游戏编程入门 中文pdf扫描版|网盘下载内附地址提取码|
Python是一种解释型.面向对象.动态数据类型的程序设计语言,在游戏开发领域,Python也得到越来越广泛的应用,并由此受到重视. 本书教授用Python开发精彩游戏所需的[]为重要的该你那.本书不 ...
- 【python游戏编程之旅】第五篇---嗷大喵爱吃鱼小游戏开发实例
本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 我们一同在前几期的博客中已经学到了很多pygame的基本知识了,现在该做个小游戏实战一下了. 前几期博客链接 ...
- 【python游戏编程之旅】第三篇---pygame事件与设备轮询
本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 在上一篇博客中,我们学习了pygame中的IO.数据http://www.cnblogs.com/msxh/ ...
- Direct2D开发:MFC下从资源文件中加载位图
转载请注明出处:http://www.cnblogs.com/ye-ming 0X01 概述: 相对于GDI处理界面,Direct2D有得天独厚的优势,下图就是Direct2D与GDI的效果对比,wi ...
- Android中加载位图的方法
Android中加载位图的关键的代码: AssetManager assets =context.getAssets(); //用一个AssetManager 对象来从应用程序包的已编译资源中为工程加 ...
- Direct2D开发:从资源加载位图
转载请注明出处:http://www.cnblogs.com/Ray1024 一.概述 Direct2D使用Windows图像处理组件 (WIC) 来加载位图.从文件加载位图的方法很简单,而且网上的教 ...
- SharpDX之Direct2D教程II——加载位图文件和保存位图文件
本系列文章目录: SharpDX之Direct2D教程I——简单示例和Color(颜色) 绘制位图是绘制操作的不可缺少的一部分.在Direct2D中绘制位图,必须先利用WIC组件将位图加载到内存中,再 ...
- Direct2D 加载位图
说明: 通过WIC从文件加载位图. 可缩放后加载到内存. 源码: HRESULT LoadImageFormFile( IWICImagingFactory *pWicFactory, ID2D1Re ...
随机推荐
- 命令行部署SharePoint2016离线前提条件和添加服务器的Feature
前言 Sp2016的软件环境要求如下: 服务器场中的数据库服务器的最低要求: 以下各项之一: Microsoft SQL Server 2014 Service Pack 1 (SP1) 的 64 位 ...
- 主机配置nginx后如何获取访问者IP
he你早的时候写了一个根据访问者ip查询天气的小接口,那时候还没得买域名,没有搞nginx,测试自然没有问题,然后随着一个小工具一块上线了,今天突然发现我的小工具有好几个人在使用了,就想写一个记录访问 ...
- 微信小程序开发笔记04
今天将小程序的页面进行优化 消除昨天遇到的bug问题. 完成了微信小程序的开发.
- 剑指offer——python【第31题】整数1出现的次数
题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了. ...
- linux--- python3环境部署篇
环境部署 我们在pycharm上都是自己设置的python3解释器的环境变量,使得代码能够正常执行!可是怎么能让我们的python代码在LINUX上跑起来呢? linux是内置python,可是内置的 ...
- plsvo
1 图像对齐 std::for_each(ref_frame->seg_fts_.begin(), ref_frame->seg_fts_.end(), [&](plsvo::Fe ...
- Node项目的Restful化
提倡Restful风格的目的或者作用主要是,结构清晰.符合标准.易于理解.扩展方便. 个人把Restful简单粗暴地理解为:路由不包含动词. 怎么做到路由不包含动词呢?答案是,启用常用的GET和POS ...
- SVProgressHUD提示框IOS
SVProgressHUD--比MBProgressHUD更好用的 iOS进度提示组件 项目里用到SVProgressHud,感觉背景颜色太丑,因为很久很久以前改过,就想在这个项目里也改下,但是时间过 ...
- 20190422 DW/BI系统
其实很多人都不能理解操作型应用系统和分析型系统的意义,主要问题在于这两个系统所面对的用户和需求是不相同的. 建模重点“凡事应该简单,简单到不能再简单”
- Spring中IOC和AOP的详细解释(转)
原文链接:Spring中IOC和AOP的详细解释 我们是在使用Spring框架的过程中,其实就是为了使用IOC,依赖注入,和AOP,面向切面编程,这两个是Spring的灵魂. 主要用到的设计模式有工厂 ...