如果用过Scratch,那么就会知道有一个叫朝向鼠标指针的命令。它能让角色朝着鼠标指针的方向。如果在Pygame中要让一个角色朝向鼠标指针,那么就必需“手动”地去旋转图形了。旋转的角度应该是它和x轴的夹角,我们把它叫angle。 这个夹角可以通过数学函数中的反正角函数求出。在Python对应了math.atan2这个函数。它要求有两个参数,一个是dy,一个是dx。dy就是两点之间的垂直距离,dx就是两点之间的水平距离。以下是求angle的示意图,虽然在接下来的例子中是以箭头的中心点为旋转中心的,但并不影响它示意原理,学过三角函数的都应该知道。
不过在Pygame中,y坐标轴是向下,所以计算dy的时候要取反。实时地把angle求出来了,那么就能旋转image了。以下是Arrow类的代码,读者可以把它应用到游戏中的很多地方。比如坦克发射炮弹 ,射箭游戏,甚至自制作一个海龟画图像块等等。代码如下所示:
""" 朝向鼠标指针的Arrow类 """ import math import pygame from pygame.locals import * class Arrow(pygame.sprite.Sprite): def __init__(self,image,pos): """ image:图形,pos:坐标 """ pygame.sprite.Sprite.__init__(self) self.rotate_center = pos # 旋转中心 self.rawimage = image # 保留原始图形 self.angle = 0 # 和x轴的夹角 self.rotate() # 旋转图形 def rotate(self): """根据和x轴的角度旋转图形""" self.image = pygame.transform.rotate(self.rawimage,self.angle) self.rect = self.image.get_rect(center=self.rotate_center) def update(self): """计算和鼠标指针的方向,更新image和rect""" p = pygame.mouse.get_pos() # 获取鼠标指针坐标 dy = self.rotate_center[1] -p[1] # 和箭头的垂直距离 dx = p[0] - self.rotate_center[0] # 和箭头的水平距离 degree = math.atan2(dy,dx) # 计算夹角,代表方向 self.angle = math.degrees(degree) # 转换为角度 self.rotate() # 生成旋转后的image
以下内容需要会员才能查看,包含源代码和素材:
需要浏览更多吗?
成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)