Pygame中实现图像旋转效果-初级

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)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值