当前位置: 首页 > news >正文

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

2.2.3 确定运动方向

之后通过math.atan2()方法计算飞船的运动方向,如图6所示。

图6 计算飞船运动方向的代码

由于math.atan2()方法的到的是弧度,需要通过math.degrees()方法将弧度转换为角度。相关链接2 math.atan2()方法的详细用法请参考《Pygame中实现图像旋转效果-中级》。

2.2.4 根据运动方向旋转飞船图片

通过图7所示代码,根据运动方向旋转飞船图片。

图7 根据运动方向旋转飞船图片的代码

其中,spacecraft_rotate为旋转之后的飞船图片。

相关链接3 图7中pygame.transform.rotate()旋转的角度是-spacecraft_rangled的原因,请参考《Pygame中实现图像旋转效果-中级》。

2.2.5 飞船上一时刻位置的更新

在确定了飞船在当前位置的运动方向之后,需要把飞船上一时刻的位置更新为当前位置,以便确定下一时刻的运动方向,代码如图8所示。

图8 飞船上一时刻位置更新的代码

2.3 确定飞船位置的代码实现

从图3中可以看出,飞船当前位置是(spacecraft_pos_x, spacecraft_pos_y),这两个白能量已经在图4所示的代码中确定,此时只需要将其设置为飞船显示区域的中心位置即可,代码如图9所示。

图9 确定飞船位置的代码

其中,spacecraft_rotate_rect即为旋转后的图片要显示的矩形范围,将其center设置为(spacecraft_pos_x, spacecraft_pos_y),就可以确定飞船的当前位置了。

注意1 图1所示的星球旋转的实现,可参考《Pygame中实现图像旋转效果-初级》。

注意2 飞船与星球图片的导入及显示,与《Pygame中实现图像旋转效果-初级》中的原理相同。

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_radius = 250
spacecraft_pos_x, spacecraft_pos_y = 0, 0
spacecraft_prepos_x, spacecraft_prepos_y = 0, 0
spacecraft_speed = 0.02plane = pygame.image.load('planet2.png').convert_alpha()
plane_center_pos = (screen_width//2, screen_height//2)
plane_angle = 0.0
plane_speed = 0.1angle = 180.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))#星球旋转plane_angle = (plane_angle+plane_speed)%360plane_rotate = pygame.transform.rotate(plane, -plane_angle)plane_rect = plane_rotate.get_rect(center=plane_center_pos)screen.blit(plane_rotate, plane_rect)#飞船旋转angle = (angle+spacecraft_speed)%360spacecraft_pos_x = plane_center_pos[0] + spacecraft_radius*math.cos(angle)spacecraft_pos_y = plane_center_pos[1] + spacecraft_radius*math.sin(angle)spacecraft_pos_deltax = spacecraft_pos_x - spacecraft_prepos_xspacecraft_pos_deltay = spacecraft_pos_y - spacecraft_prepos_yspacecraft_rangle = math.atan2(spacecraft_pos_deltay, spacecraft_pos_deltax)spacecraft_rangled = math.degrees(spacecraft_rangle)spacecraft_rotate = pygame.transform.rotate(spacecraft, -spacecraft_rangled)spacecraft_rotate_rect = spacecraft_rotate.get_rect(center=(spacecraft_pos_x, spacecraft_pos_y))spacecraft_prepos_x = spacecraft_pos_xspacecraft_prepos_y = spacecraft_pos_yscreen.blit(spacecraft_rotate, spacecraft_rotate_rect)pygame.display.flip()clock.tick(60)

http://www.dtcms.com/a/405918.html

相关文章:

  • 高新苏州网站建设wordpress首页等待画面
  • 两学一做知识问答网站施工企业招标领导小组组长的职责
  • Spring AI:RAG函数调用
  • 基于Amazon S3设置AWS Transfer Family Web 应用程序
  • 稳石氢能出席AEM电解水学术与产业化论坛,大标方AEM制氢设备批量化生产荣获技术卓越奖。
  • 渲染 Python 中用 LaTeX 语法定义的数学公式 - 例子
  • 菊风金融智能双录:为金融业务合规与信任保驾护航
  • Debian安装PVE
  • 云计算实验2——CentOS中zookeeper的安装
  • 网络管理实验1:ASN.1软件应用
  • 前端开发用什么工具?前端开发工具推荐清单、实用对比与我的使用心得
  • 做亚马逊有什么网站可以借鉴大连城市建设档案馆官方网站
  • 协议不通,数据何通?耐达讯自动化Modbus TCP与Profibus网关技术破解建筑自动化最大瓶颈
  • 新零售模式下仓储变化与发展趋势
  • Stable Video Diffusion:将潜在视频扩散模型扩展到大规模数据集——论文阅读
  • [linux仓库]解剖ELF:从文件头到进程地址空间的完美映射
  • Lisp 与 C# 交互中,类型码(TypeCode)的映射关系
  • Java基础(十四):枚举类详解
  • python+springboot+uniapp基于微信小程序的任务打卡系统
  • 【多线程】计算机领域中的各种锁
  • python+uniapp基于微信小程序的医院陪诊预约系统
  • 免费html网页模板 html5网站模板 静态网页模板
  • 网站怎么做区域性优化公司网站建设会计上怎么处理
  • 专业商城网站建设价格定制家具网
  • ABCTorrents官网入口 – 磁力搜索引擎网站
  • python+django/flask+uniapp基于微信小程序的瑜伽体验课预约系统
  • 设计模式(C++)详解——解释器模式(1)
  • iOS 26 系统流畅度深度剖析,Liquid Glass 视效与界面滑动的实际测评
  • mysql asp网站2001国产卡一卡二新区
  • Docker容器化部署简要指南