1 图像旋转效果
图像的旋转效果如图1所示。

图1 图像旋转效果
2 代码实现
2.1 背景图片及飞船图片的导入
使用《从零开始学Python游戏编程22-Pygame库2》中提到的代码,创建Pygame编程的框架。之后,使用图2所示的的代码导入背景图片及飞船图片。

图2 导入背景图片及飞船图片的代码
其中,第18行代码通过pygame.image.load()方法导入背景图片“space.png”;第20行代码使用相同的方法导入飞船图片“freelance.png”。由于飞船图片比较大,第21行代码通过pygame.transform.smoothscale_by()方法将飞船图片spacecraft缩小到之前的0.5倍。
相关链接1 convert_alpha()方法的作用是将图片转换为支持透明度的更高效的格式,请参考《Pygame中Sprite类实现多帧动画3-1》。
相关链接2 pygame.transform.smoothscale_by()方法的第一个参数表示要放缩的图片,第二个参数是一个元组,第一个元素表示图片宽度放缩的比例,第二个元素表示图片高度放缩的比例。
2.2 确定飞船起始位置、转向及转速
2.2.1 飞船起始位置、转向及转速的初始值
通过图3所示的代码确定飞船起始位置、转向及转速的初始值
![]()
图3 确定飞船起始位置、转向及转速初始值的代码
其中,spacecraft_angle表示飞船起始位置,图4从左向右依次所示为当spacecraft_angle的值是0.0、90.0、180.0和270.0时飞船的位置。

图4 飞船不同的起始位置
spacecraft_speed表示飞船的转向和转速,当其值为正时,飞船逆时针旋转;值为负时,顺时针旋转。spacecraft_speed的值的大小表示转速的大小。
2.2.2 实时改变飞船的角度
在Pygame编程框架代码的while循环中,使用图5所示代码实时改变飞船的角度。
![]()
图5 实时改变飞船角度的代码
其中,spacecraft_angle+spacecraft_speed表示飞船当前旋转的角度,对其进行模360运算的目的是保证该值始终在0-360°之间。
2.2.3 旋转飞船图片
根据实时角度旋转飞船图片的代码如图6所示。
![]()
图6 旋转飞船图片的代码
其中,spacecraft是导入的飞船图片;spacecraft_angle是飞船旋转的角度。旋转后的飞船图片保存在spacecraft_rotate中。
2.2.4 显示旋转后的飞船图片
(1)确定飞船中心位置
从图1中可以看出,无论飞船怎么旋转,其中心位置始终在屏幕的中心。因此,首先定义飞船中心的变量,代码如图7所示。
![]()
图7 定义飞船中心的代码
其中,screen_width和screen_height分别表示屏幕的宽度和高度。
注意1 spacecraft_center_pos在while循环之前定义。
(2)确定飞船旋转后的位置
之后,确定旋转后图片的位置,代码如图8所示。
![]()
图8 确定旋转后图片位置的代码
图片每次旋转后,其位置大小(宽度、高度、左上角坐标等)会发生变化,如图9所示。
3 完整代码
完整代码如下所示。
import pygame
import math
from sys import exit
from pygame.locals import *
pygame.init()
screen_width, screen_height = 800, 600
screen = pygame.display.set_mode((screen_width, screen_height))
space = pygame.image.load('space.png').convert_alpha()
spacecraft = pygame.image.load('freelance.png').convert_alpha()
spacecraft = pygame.transform.smoothscale_by(spacecraft, (0.5, 0.5))
spacecraft_center_pos = (screen_width//2, screen_height//2)
spacecraft_angle = 270.0
spacecraft_speed = -1.0
clock = pygame.time.Clock()
while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
exit()
screen.blit(space, (0, 0))
spacecraft_angle = (spacecraft_angle+spacecraft_speed)%360
spacecraft_rotate = pygame.transform.rotate(spacecraft, spacecraft_angle)
spacecraft_rotate_rect = spacecraft_rotate.get_rect(center=spacecraft_center_pos)
screen.blit(spacecraft_rotate, spacecraft_rotate_rect)
pygame.display.update()
clock.tick(60)
324

被折叠的 条评论
为什么被折叠?



