0.96寸OLED流星算法思路分享—代码开源—简单易懂超详细

前几天在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没法上传视频,所以就不进行测试了

上传一张图意思意思吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值