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

相关推荐
xwill*19 小时前
分词器(Tokenizer)-sentencepiece(把训练语料中的字符自动组合成一个最优的子词(subword)集合。)
开发语言·pytorch·python
咖啡の猫19 小时前
Python列表的查询操作
开发语言·python
Chiandra_Leong19 小时前
Python-Pandas、Numpy
python·pandas
BoBoZz1919 小时前
ParametricObjectsDemo多种参数曲面展示及面上部分点法线展示
python·vtk·图形渲染·图形处理
quikai198120 小时前
python练习第三组
开发语言·python
ULTRA??21 小时前
初学protobuf,C++应用例子(AI辅助)
c++·python
CHANG_THE_WORLD21 小时前
Python 字符串全面解析
开发语言·python
甄心爱学习1 天前
CSP认证 备考(python)
数据结构·python·算法·动态规划
databook1 天前
数据会说谎?三大推断方法帮你“审问”数据真相
后端·python·数据分析
是Dream呀1 天前
Python圣诞特辑:打造一棵会唱歌、会下雪的魔法圣诞树
开发语言·python·pygame