今天跟大家唠唠我最近搞的“银河铁道”项目,纯属个人瞎折腾,各位大佬轻喷。
事情是这样的,前段时间不是老想着给自己找点乐子嘛正好瞅见个星空主题的图片,一下子就来了灵感。心想,能不能自己也搞一个,那种在星空下穿梭的感觉,想想就带劲。
说干就干!我先是上网各种搜资料,看了不少大佬的教程,什么Processing、OpenGL之类的,看得我头都大了。后来琢磨着,咱也不是专业的,没必要搞那么复杂,能做出个大概意思就行。
我决定用Python!简单粗暴,上手快。
我得有个“银河”。这个简单,用pygame 搞个窗口,然后随机生成一堆白色的点,模拟星星。点越多越密集,银河味儿就越浓。一开始点太少,稀稀拉拉的,后来加到几千个,感觉才像那么回事儿。
python
import pygame
import random
# 初始化pygame
# 窗口大小
size = [640, 480]
screen = *_mode(size)
# 颜色
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
# 星星列表
stars = []
for i in range(1000):
x = *(0, size[0])
y = *(0, size[1])
*([x, y])
有了星星,还得有个“铁道”。这个稍微麻烦点,我打算用线条来模拟铁轨,让它在星空中延伸。为了做出那种透视的效果,远处的线条要细,近处的线条要粗。
这部分代码折腾了我好久,主要是数学不太透视关系有点懵。还是硬着头皮,一点点调参数,总算弄出来个大概。
python
# 绘制铁轨
for i in range(20):
width = 10 - i 0.5 # 铁轨宽度,远处变细
y = size[1] - i 20 # 铁轨高度,向上延伸
*(screen, WHITE, (size[0]/2 - 50 - i 5, y), (size[0]/2 + 50 + i 5, y), int(width))
就是让这个“铁道”动起来。就是让星星和铁轨的位置不断变化,造成一种向前移动的错觉。这个简单,在主循环里,每次都更新星星和铁轨的坐标就行。
python
# 主循环
done = False
while not done:
for event in *():
if * == *:
done = True
# 清屏
*(BLACK)
# 更新星星位置
for star in stars:
star[1] += 1
if star[1] > size[1]:
star[1] = 0
star[0] = *(0, size[0])
*(screen, WHITE, (star[0], star[1]), 2)
# 绘制铁轨 (代码同上)
# 刷新屏幕
到这里,一个简陋的“银河铁道”就基本完成了。虽然效果比较粗糙,但好歹也算是个雏形了。
不过看着光秃秃的铁道,总觉得少了点什么。对了,还缺个“火车头”!
于是我又找了个简单的火车头图片,用 *() 加载进来,然后把它放在铁道的末端。为了让火车头也有动感,我还加了个简单的左右摇摆效果。
为了增加点气氛,我还加了点背景音乐。找了个比较舒缓的电子音乐,循环播放,感觉一下子就上来了。
整个项目断断续续搞了好几天,遇到不少坑,但也学到不少东西。虽然最终效果和想象中的差距很大,但自己动手做出来的,还是挺有成就感的。
核心就是用pygame 绘制星星和铁轨,然后通过不断更新坐标,实现动画效果。
透视关系的处理比较麻烦,需要耐心调整参数。
加点图片和音乐,可以提升整体效果。
这个项目还有很多可以改进的地方,比如:
增加更多的细节,让星星和铁轨更加逼真。
加入更多的互动元素,比如可以控制火车头的速度。
优化代码结构,提高运行效率。
这回“银河铁道”之旅,虽然有点累,但也挺有趣的。以后有机会,再继续完善它。
希望我的分享对大家有所帮助,也欢迎各位大佬多多指教!