十多天的python学习让我渐渐窥见python的编程之美(尽管游戏项目的代码也看不懂~~)。今天用pygame来实现一个简单的旋转动画,效果如下:
源码,图片,声音资源在百度网盘:链接:https://pan.baidu.com/s/1UmFZ8Bb-m_vfyq5TIsazbQ 密码:be6e。那么如何实现小女孩绕着地球旋转呢?首先要加载图片资源,其次实现小女孩绕地球旋转。
一、pygame中常用的数学函数:
首先来介绍两个角度和弧度转换的函数:
math.degress(),math.radians(),第一个是传入弧度转换为角度,第二个是传入角度转换为弧度。他们的用法很简单,只要将数值传进去然后接收返回值就可以了。math.cos(angle),math.sin(angle),这里的angle使用的是弧度表示的,因此需要先使用math.radians(),将角度转换为弧度然后再传参。
二、pygame中加载位图、绘制位图
通常,游戏中需要加载大量的位图,pygame中的一些类和函数可以帮助我们轻松的搞定位图的加载和绘制。
screen = pygame.display.set_mode #会返回一个Surface对象
1.加载位图
在pygame中可以使用pygame.image.load()函数来加载位图。(支持jpg,png,gif,bmp,pcx,tif,tga等多种图片格式)。
space = pygame.image.load("***.png").convert_alpha()
convert_alpha()方法会使用透明的方法绘制前景对象,因此在加载一个有alpha通道的素材时(比如PNG TGA),需要使用convert_alpha()方法,当然普通的图片也是可以使用这个方法的,用了也不会有什么副作用。
2.绘制位图
Surface对象有一个名为blit()的方法,它可以绘制位图
screen.blit(space, (0,0)) #第一个参数是加载完成的位图,第二个参数是绘制位图在屏幕中的起始坐标。
下面来看看一个旋转小动画是如何实现的,
(1)加载图片资源:
import sys, random, math, pygame,os
from pygame.locals import *
pygame.init()
#设置屏幕大小等于加载的背景图片的尺寸的大小(也就是宽的像素值,长的像素值)
screen = pygame.display.set_mode((558,475))
#设置屏幕的标题为“星空女孩”
pygame.display.set_caption("星空女孩")
#设置字体大小
font = pygame.font.Font(None, 18)
#加载图片
space = pygame.image.load("./girl/space.png").convert_alpha()
planet = pygame.image.load("./girl/earth.png").convert_alpha()
mylovegirl = pygame.image.load("./girl/mylovegirl2.png").convert_alpha()
#获得地球和女孩的尺寸大小
width,height = planet.get_size()
width2, height2 = mylovegirl.get_size()
#使女孩的大小和地球成一定比例,这个需要自己感觉着设置
mylovegirl = pygame.transform.smoothscale(mylovegirl, (width //5, height //3))
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]:#设置按键事件,如果程序运行中,按下Esc键就退出程序执行。
sys.exit()
#加载背景图片,并且设置从屏幕的左上角开始。
screen.blit(space, (0,0))
#将地球显示在屏幕的中心,所以是从坐标((558 -width)/2, (475 - height)/2)处加载地球图片
screen.blit(planet, ((558-width)/2, (475-height)/2))
#不断刷新屏幕,获得图片显示
pygame.display.update()
(2)实现小女孩绕地球旋转:
图片加载成功后,要实现小女孩动起就要不断刷新小女孩的位置坐标。如何让小女孩的身体和地平面保持垂直,每次刷新需要计算小女孩运动的前后纵横坐标的差值,然后通过求反正切函数值算出旋转角度,这时候pygame中的pygame.transform.rotate()就是使自身轴向旋转的,调用pygame.transform.rotate("旋转图片", 旋转角度)。这样图片就会根据环绕的速度计算自身角度的变化来保持与环绕对象的垂直。
完整代码如下:
import sys, random, math, pygame,os
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)
def wrap_angle(angle):
return angle % 360
radius = 150
angle = 0.0
pos = Point(0,0)
old_pos = Point(0,0)
pygame.init()
pygame.mixer.music.load("./girl/1.ogg")
pygame.mixer.music.play(1)
screen = pygame.display.set_mode((558,475))
pygame.display.set_caption("星空女孩")
font = pygame.font.Font(None, 18)
space = pygame.image.load("./girl/space.png").convert_alpha()
planet = pygame.image.load("./girl/earth.png").convert_alpha()
mylovegirl = pygame.image.load("./girl/mylovegirl2.png").convert_alpha()
width,height = planet.get_size()
width2, height2 = mylovegirl.get_size()
mylovegirl = pygame.transform.smoothscale(mylovegirl, (width //5, height //3))
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))
angle = wrap_angle(angle - 0.3)
pos.x = math.sin( math.radians(angle)) * radius
pos.y = math.cos( math.radians(angle)) * radius
screen.blit(planet, ((558-width)/2, (475-height)/2))
delta_x = ( pos.x - old_pos.x)
delta_y = ( pos.y - old_pos.y)
rangle = math.atan2(delta_y, delta_x)
rangled = wrap_angle( -math.degrees(rangle))
mylovegirl_rotate = pygame.transform.rotate(mylovegirl, rangled)
width1,height1 = mylovegirl_rotate.get_size()
screen.blit(mylovegirl_rotate, (279 + pos.x - width1//2, 237.5 + pos.y - height1//2))
pygame.display.update()
old_pos.x = pos.x
old_pos.y = pos.y