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

相关推荐
孟健8 小时前
Karpathy 用 200 行纯 Python 从零实现 GPT:代码逐行解析
python
码路飞10 小时前
写了个 AI 聊天页面,被 5 种流式格式折腾了一整天 😭
javascript·python
曲幽12 小时前
FastAPI压力测试实战:Locust模拟真实用户并发及优化建议
python·fastapi·web·locust·asyncio·test·uvicorn·workers
敏编程17 小时前
一天一个Python库:jsonschema - JSON 数据验证利器
python
前端付豪17 小时前
LangChain记忆:通过Memory记住上次的对话细节
人工智能·python·langchain
databook17 小时前
ManimCE v0.20.1 发布:LaTeX 渲染修复与动画稳定性提升
python·动效
花酒锄作田1 天前
使用 pkgutil 实现动态插件系统
python
前端付豪1 天前
LangChain链 写一篇完美推文?用SequencialChain链接不同的组件
人工智能·python·langchain
曲幽1 天前
FastAPI实战:打造本地文生图接口,ollama+diffusers让AI绘画更听话
python·fastapi·web·cors·diffusers·lcm·ollama·dreamshaper8·txt2img
老赵全栈实战1 天前
Pydantic配置管理最佳实践(一)
python