【C语言写圣诞程序】别再画圣诞树了,看都看腻了

目录

嗨,这里是狐狸~~

 项目代码

 图片相关操作

结构体

资源加载

初始化 

绘制函数

数据更新 

主函数

总结

视频讲解


没有雪花即使不浪漫也可过圣诞,有了祝福即使是寒冬也感到温暖

嗨,这里是狐狸~~

今天是2021年12月20日星期一,又是美好的开始啊,距离2022年还有11天,距离2021年圣诞节还有5天,懂我什么意思了吧,圣诞节快到了,想好送啥礼物给女朋友了嘛,广大程序员uu们,嘿嘿,不知道的今天来教你们来做圣诞项目,让你们今年的圣诞节不孤单,起码还有圣诞老人陪你不是,好好看好好学!

OK,我们现在正式开始,先来看效果

 不知道大家看后感觉如何呢,好叭,有想学的感觉还挺有意思的就继续看下去,觉得博主写的垃圾,档次太低的,请出门左转不送

 

 项目代码

 图片相关操作

先把我们要用到的变量进行全局化处理

IMAGE imgLand;
IMAGE imgTree[10];	//圣诞树
IMAGE imgOldman;	//老人
IMAGE imgSnow[2];
bool Timer(clock_t ms, int id);

结构体

再来一个精灵结构体,控制速度 

typedef struct
{
	int x;
	int y;
	int w;
	int h;
	int frame;		//当前帧
	int maxFrame;	//总帧数
	int speed;		//速度
}Sprite;

资源加载

加载资源 ,找好图片的路径,选好图片的格式

void loadResource()
{
	//加载图片
	loadimage(&imgLand, "Resource/land.png", getwidth(), 290);

	for (int i = 0; i < 10; i++)
	{
		char imgFile[50] = { 0 };
		sprintf_s(imgFile, "Resource/mtree/0000%d.png", i);
		loadimage(imgTree + i, imgFile, 300, 300);
	}

	loadimage(&imgOldman, "Resource/oldman.png");

	loadimage(imgSnow + 0, "Resource/snow.png");
	loadimage(imgSnow + 1, "Resource/snow1.png", 23, 32);
}

初始化 

初始化函数,将界面里的元素进行初始化,确定他们的位置

void init()
{
	loadResource();
	//初始化圣诞树数据
	sprite_init(&tree, 530, 430, 10, imgTree->getwidth(), imgTree->getheight());
	//初始化老人数据
	sprite_init(&oldMan, 700, 600, 7, 220, 154);
	//初始化雪花
	for (int i = 0; i < 50; i++)
	{
		//随机生成雪花的坐标 rand() 
		sprite_init(snow + i, rand() % getwidth(), rand() % getheight(), 11, 23, 32);
		//让雪花的当前帧不一样
		if (snow[i].maxFrame)
			snow[i].frame = rand() % snow[i].maxFrame;
		snow[i].speed = rand() % 5 + 1;
	}
}

绘制函数

根据初始化的函数进行进一步的绘画

void draw()
{
	//输出底下的地面
	drawImg(0, 500, &imgLand);
	//圣诞树动画
	drawImg(tree.x, tree.y, imgTree + tree.frame);
	//圣诞老人滑雪动画
	drawImg(oldMan.x, oldMan.y, oldMan.w, oldMan.h, &imgOldman, oldMan.frame *220, 0);
	//绘制雪花
	for (int i = 0; i < 50; i++)
	{
		drawImg(snow[i].x, snow[i].y, snow[i].w, snow[i].h, imgSnow + 0, snow[i].frame* snow[i].w, 0);
	}

}

数据更新 

更新的函数,加了个定时器,让更新更加的稳定且丝滑

void update()
{
	sprite_runAnimation(&tree);
	sprite_runAnimation(&oldMan);
	if (Timer(100, 0))
	{
		for (int i = 0; i < 50; i++)
		{
			sprite_runAnimation(snow + i);
		}
	}
	if (Timer(20, 1))
	{
		for (int i = 0; i < 50; i++)
		{
			//雪花下落
			sprite_moveBy(snow + i, 0, snow[i].speed);
			//是否超出边界
			if (snow[i].y > getheight())
			{
				snow[i].y = snow[i].h;
			}
		}
	}
	//让圣诞老人溜达一下
	sprite_moveBy(&oldMan, -oldMan.speed, 0);
	if (oldMan.x+oldMan.w <= 0)
	{
		oldMan.x = getwidth();
	}

	
}
//让程序更丝滑:定时器
bool Timer(clock_t ms, int id)
{
	static clock_t beg[5] = { 0 };
	clock_t end = clock();
	if (end - beg[id] >= ms)
	{
		beg[id] = end;
		return true;
	}

主函数

 调用函数,再加上一个播放音乐函数,更有画面感,再加个双缓冲绘图,让程序运行更加丝滑。

int main()
{
	//界面,绘图,控制台
	//创建窗口
	initgraph(1024, 768, EW_SHOWCONSOLE);
	init();

	//播放音乐
	mciSendString("open Resource/song.mp3 alias bgm", NULL, 0, NULL);
	mciSendString("play bgm repeat", NULL, 0, NULL);

	BeginBatchDraw();	//开始双缓冲绘图
	while (true)
	{
		cleardevice();	//清屏
		draw();
		FlushBatchDraw();	//刷新
		update();
	}
	EndBatchDraw();

	getchar();
	return 0;
}

 

总结

好了,这个项目你们看完觉得怎么样,这是近期刚完成的,最近也是因为圣诞节快到了,热榜上也出现了很多圣诞树的代码,层出不穷,但好像都是Python的,没有看到C语言的,也没有除圣诞树之外的项目,说实话看的有点腻了,这才写了一个这样的程序,比较简单哈,希望大家也不要介意,看后续还能不能再弄个项目出来,希望大家多多关注啦。

想要这个项目素材和源码的可以加群【1083227756】领取,当然啦,你们也可以自己找些素材也是可以的,看你们自己,想要对程序员的未来发展有兴趣的可以关注微信公众号:【狐狸的编码时光】,希望和大家一起学习进步。

视频讲解

单独看源码看不懂的同学,也可以去看视频讲解,有不懂得问题可以回帖提问,我看到了会尽心的回答,OK,今天就这样啦。

https://www.bilibili.com/video/BV1DQ4y1a7XV/icon-default.png?t=LA92https://www.bilibili.com/video/BV1DQ4y1a7XV/

最后提前祝大家圣诞节快乐!!!

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>