Pygame中实现图像旋转效果-应用2-1

可以通过Pygame的图像旋转效果,实现模拟太阳系星球运行的效果,如图1所示。

图1 太阳系星球运行效果图

1 定义天体类CelestrialBody的代码

通过天体类CelestrialBody来实现太阳系中星球的移动和显示。

1.1 init()方法

从图1中可以看出,无论是恒星(太阳),行星(地球和土星)还是卫星(月球、土卫1和土卫2)包含的属性有名字、大小、图片、自转速度、公转速度等。在__init__()方法中定义这些属性,代码如图2所示。

图2 init()方法的代码

其中,init()方法的参数name表示天体的名字;image表示天体对应的图片;radius是天体的半径;distance是天体到其父天体的距离;parent是天体的父天体;rotation_speed是天体的自转速度;revolution_speed是天体的公转速度;ring表示天体是否有"环";ring_radius表示"环"的大小。在第27-36行定义CelestrialBody的相应属性来保存这些参数值。第30行代码根据指定的天体大小self.radius,通过pygame.transform.smoothscale()方法对天体的图片self.image进行放缩处理。第37-38行定义的属性rotation_angle和revolution_angle表示天体自转的角度和公转的角度,初始值为0。第39-40行代码定义的属性x和y分别表示天体的中心位置,默认情况下天体的位置位于窗口中间,SCREEN_WIDTH和SCREEN_HEIGHT是窗口宽度和高度,在定义CelestrialBody类之前对这两个变量赋值。第41行调用了类的update_postion()方法更新天体位置。

相关链接1 python类的相关知识,请参考《Python中类的使用1》

1.2 update_position()方法

对于恒星(太阳),行星(地球和土星)还是卫星(月球、土卫1和土卫2)这三种不同类型的天体,其确定位置的方法是不同的。恒星位置固定,而行星的位置是随着其公转角度的变化而变化的,卫星的位置不但与公转角度有关,而且还与其父天体(行星)的位置有关,如图3所示。

图3 确定行星和卫星位置的示意图

update_position()方法的代码如图4所示。

图4 update_position()方法的代码

其中,第43行的if语句通过self.parent判断该天体是否具有父天体,如果有父天体,则说明该天体是行星或者卫星,其位置需要实时更新,如果没有父天体,则说明该天体是恒星,其位置是__init__()方法中指定的窗口中心。如果天体有父天体,第44行代码首先计算其公转角度self.revolution_angle;之后第45-46行代码更新了该天体的位置,是其父天体的横纵坐标的基础上加上公转半径self.distance与公转角度self.revolution_angle正余弦的乘积,原理如图3所示。第47行代码更新天体的自转角度;第48行代码根据天体的自传角度旋转天体图像self.image,并将旋转之后的图像保存在属性self.image_rotate中。

注意1 在图1的效果图中可以看出,恒星(太阳)也有自转效果。

相关链接2 计算天体位置的数学方法,请参考《Pygame中实现图像旋转效果-高级2-1》

1.3 draw()方法

draw()方法的作用是显示天体,代码如图5所示。

图5 draw()方法代码

其中,draw()方法的screen参数表示绘制天体的窗口;第50-51行的if语句判断天体是否具有父天体,如果有,则通过pygame.draw.circle()绘制该天体公转的轨道。第52-57行代码中的if语句判断天体是否具有"环",如果有,则通过pygame.draw.ellipse()绘制该天体的环。第58-59行代码绘制天体图像。第60-62行代码显示天体名称。

相关链接3 pygame绘制圆形、椭圆,显示图像以及显示文字的相关知识,请参考《Pygame中画圆》《Pygame显示文字》

相关推荐
小二·6 小时前
Python Web 开发进阶实战:性能压测与调优 —— Locust + Prometheus + Grafana 构建高并发可观测系统
前端·python·prometheus
七牛云行业应用7 小时前
重构实录:我删了 5 家大模型 SDK,只留了 OpenAI 标准库
python·系统架构·大模型·aigc·deepseek
知乎的哥廷根数学学派7 小时前
基于多模态特征融合和可解释性深度学习的工业压缩机异常分类与预测性维护智能诊断(Python)
网络·人工智能·pytorch·python·深度学习·机器学习·分类
一人の梅雨7 小时前
亚马逊SP-API商品详情接口轻量化实战:合规与商业价值提取指南
python
袁气满满~_~9 小时前
Python数据分析学习
开发语言·笔记·python·学习
axinawang9 小时前
二、信息系统与安全--考点--浙江省高中信息技术学考(Python)
python·浙江省高中信息技术
寻星探路10 小时前
【算法专题】滑动窗口:从“无重复字符”到“字母异位词”的深度剖析
java·开发语言·c++·人工智能·python·算法·ai
Dxy123931021610 小时前
python连接minio报错:‘SSL routines‘, ‘ssl3_get_record‘, ‘wrong version number‘
开发语言·python·ssl
吨吨不打野10 小时前
CS336——2. PyTorch, resource accounting
人工智能·pytorch·python
___波子 Pro Max.10 小时前
Python文件读取代码中strip()的作用
python