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显示文字》

相关推荐
qq_263_tohua10 分钟前
第113期 20260725 最近在阅读叶沅鑫老师的多模态配准书籍,发现有不少错误,让人读了头脑发大。
python
可触的未来,发芽的智生17 分钟前
发现-元认知技能,激起神经符号系统跃变
javascript·人工智能·python·程序人生·自然语言处理
第二个人18 分钟前
Python Web开发:从Flask到FastAPI,我经历了什么
前端·python·flask
蓝创工坊Blue Foundry1 小时前
扫描件批量转 Excel:先确认要整表还原还是字段汇总
python·pdf·ocr·excel
二十雨辰1 小时前
[爬虫]-解析
开发语言·python
天天爱吃肉82182 小时前
AI Agent时代你的经验值多少钱?
人工智能·python·功能测试·学习·汽车
鱼香鱼香rose2 小时前
java-2
java·开发语言·python
tkevinjd11 小时前
MiniCode 项目详解6:原项目控制系统的10个缺陷(已修复)
python·llm·agent
dNGUZ7UGj12 小时前
10分钟完成第一个Python小游戏
python·django
没有梦想的咸鱼185-1037-166312 小时前
AI-Python机器学习与深度学习技术:CNN/Transformer/扩散模型、SHAP可解释及Hermes智能体自动化
人工智能·python·深度学习·机器学习·chatgpt·cnn·transformer