C语言教你用C语言做个圣诞老人!给对象的惊喜准备好了吗?
Posted 一起学编程
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言教你用C语言做个圣诞老人!给对象的惊喜准备好了吗?相关的知识,希望对你有一定的参考价值。
马上快到圣诞节了,你有准备好小惊喜给你对象嘛?
传说呀,每到12月24日晚上,有个神秘人会乘驾由9只驯鹿拉的雪橇在天上飞翔,挨家挨户地从烟囱进入屋里,然后偷偷把礼物放在孩子床头的袜子里,或者堆在壁炉旁的圣诞树下。
这个神秘老人就被称之为圣诞老人,圣诞老人我们可能没有真正见到过,但是我相信大家都有自己的“圣诞老人”会给你送上小礼物吧!
那么话不多说,今天我们主要就是想给大家用C语言来给大家画出圣诞老人,搭配其他程序后,给对象的小惊喜这不就来了嘛~
效果展示:
这只是片段截图做的一个动图演示,实际效果还是很不错的哦!大家赶紧自己动手试试吧(这样也能显得更用心不是)
编译环境:VS2019/2022+easyX图形库插件
素材示例:(大家可以自己去弄一下这样的素材图,用PS即可,懒得动手的话可以在文章最后领取哦)
源码展示:
#include<stdio.h>
#include<time.h>
//#include<easyx.h>
#include"tool.h"
#include<mmsystem.h>
#pragma comment(lib,"winmm.lib")
/*
* 课程内容:圣诞节特效界面
* 开发环境:vs2019+easyx
*/
//图片相关操作
IMAGE imgLand;
IMAGE imgTree[10]; //圣诞树
IMAGE imgOldman; //老人
IMAGE imgSnow[2];
bool Timer(clock_t ms, int id);
//加载资源
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);
//来一个精灵结构体
typedef struct
int x;
int y;
int w;
int h;
int frame; //当前帧
int maxFrame; //总帧数
int speed; //速度
Sprite;
void sprite_init(Sprite* sprite, int x, int y, int maxFrame,int w,int h)
sprite->x = x;
sprite->y = y;
sprite->frame = 0;
sprite->maxFrame = maxFrame;
sprite->w = w;
sprite->h = h;
sprite->speed = 1;
void sprite_runAnimation(Sprite* sprite)
//没写一步都要考虑一下是否有隐藏的bug
if(sprite->maxFrame != 0)
sprite->frame = (sprite->frame + 1) % sprite->maxFrame;
void sprite_moveBy(Sprite* sprite, int dx, int dy)
sprite->x += dx;
sprite->y += dy;
Sprite tree;
Sprite oldMan;
Sprite snow[50]; //雪花
//初始化
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;
//Sleep(200);
//让圣诞老人溜达一下
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;
return false;
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;
希望对大家有帮助!
此外,我也给大家分享我收集的其他资源,从最零基础开始的教程到C语言C++项目案例,帮助大家在学习C语言的道路上披荆斩棘!
整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)最重要的是你可以在群里面交流提问编程问题哦!
欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!(↓↓↓↓↓↓)
以上是关于C语言教你用C语言做个圣诞老人!给对象的惊喜准备好了吗?的主要内容,如果未能解决你的问题,请参考以下文章