前几天在b站上面看到一个流星一样的星空过场,感觉非常好看,于是就想着能不能给复刻出来
于是就复刻出来了
先看源码
/*========================================================
*功能描述: 在0.96Oled中播放流星雨动画
*参数说明: Meteor_Front_Seep -> 前面一层星星的速度
* Meteor_Middle_Seep -> 中间一层星星的速度
* Meteor_Back_Seep -> 后面一层星星的速度
*附加说明: 无
*========================================================*/
#include "stdlib.h" //用到了里面的随机数函数
#define Meteor_MAX 70
unsigned char OLED_Meteor_X[Meteor_MAX];
unsigned char OLED_Meteor_Y[Meteor_MAX];
void OLED_Meteor(char Meteor_Front_Seep,char Meteor_Middle_Seep,char Meteor_Back_Seep)
{
unsigned char i=0;
for(i=0;i<=Meteor_MAX;i++)
{
OLED_Meteor_X[i] = rand();
OLED_Meteor_Y[i] = rand();
if(OLED_Meteor_X[i]>127||OLED_Meteor_Y[i]>63)
{
i--;
}
}
while(1)
{
for(i=0;i<=Meteor_MAX/3*1-1;i++)
{
OLED_DrawDot(OLED_Meteor_X[i],OLED_Meteor_Y[i],0); //擦除上Meteor_MAX/3个星星
OLED_Meteor_X[i] = OLED_Meteor_X[i] + Meteor_Front_Seep;
if(OLED_Meteor_X[i] > 127)OLED_Meteor_X[i] = OLED_Meteor_X[i] - 127;
if(OLED_Meteor_X[i] < 0)OLED_Meteor_X[i] = OLED_Meteor_X[i] + 127;
OLED_DrawDot(OLED_Meteor_X[i],OLED_Meteor_Y[i],1); //生成新的上Meteor_MAX/3个星星
}
OLED_DrawDot(OLED_Meteor_X[Meteor_MAX/3*1-1],OLED_Meteor_Y[Meteor_MAX/3*1-1],0); //擦除上Meteor_MAX/3*1最后溢出的星星
for(i=Meteor_MAX/3*1;i<=Meteor_MAX/3*2-1;i++)
{
OLED_DrawDot(OLED_Meteor_X[i],OLED_Meteor_Y[i],0); //擦除中Meteor_MAX/3个星星
OLED_Meteor_X[i] = OLED_Meteor_X[i] + Meteor_Middle_Seep;
if(OLED_Meteor_X[i] > 127)OLED_Meteor_X[i] = OLED_Meteor_X[i] - 127;
if(OLED_Meteor_X[i] < 0)OLED_Meteor_X[i] = OLED_Meteor_X[i] + 127;
OLED_DrawDot(OLED_Meteor_X[i],OLED_Meteor_Y[i],1); //生成新的中Meteor_MAX/3个星星
}
OLED_DrawDot(OLED_Meteor_X[Meteor_MAX/3*2-1],OLED_Meteor_Y[Meteor_MAX/3*2-1],0); //擦除上Meteor_MAX/3*2最后溢出的星星
for(i=Meteor_MAX/3*2;i<=Meteor_MAX/3*3;i++)
{
OLED_DrawDot(OLED_Meteor_X[i],OLED_Meteor_Y[i],0); //擦除下Meteor_MAX/3个星星
OLED_Meteor_X[i] = OLED_Meteor_X[i] + Meteor_Back_Seep;
if(OLED_Meteor_X[i] > 127)OLED_Meteor_X[i] = OLED_Meteor_X[i] - 127;
if(OLED_Meteor_X[i] < 0)OLED_Meteor_X[i] = OLED_Meteor_X[i] + 127;
OLED_DrawDot(OLED_Meteor_X[i],OLED_Meteor_Y[i],1); //生成新的下Meteor_MAX/3个星星
}
OLED_DrawDot(OLED_Meteor_X[Meteor_MAX/3*3],OLED_Meteor_Y[Meteor_MAX/3*3],0); //擦除上Meteor_MAX/3*3最后溢出的星星
}
}
其实也没什么说的,就把流程说一下吧
首先用unsigned char类型创建两个以Meteor_MAX 为上限的数组,用来存放每个星星的坐标
(这里Meteor_MAX 是宏定义出来的,现在宏定义为70)
然后随之而来的是三个for,分别对应三层的星星
因为是先擦除后生成,所以每个for循环完成后会额外擦除一次,否则就会有一个星星一直不动
挺简单的一个小程序,因为CSDN没法上传视频,所以就不进行测试了
上传一张图意思意思吧