服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C语言实现流星雨效果流程

C语言实现流星雨效果流程

2022-03-01 14:39MAX在码字 C/C++

C本篇文章带你用C语言去实现漫天流星雨的效果,代码写的很清晰,效果非常棒,另有视频详解整个过程,相信你一定能看懂,感兴趣的童鞋快来看看吧

再亮眼的流星,也会一闪而过。

嗨!这里是狐狸~~

没错,我又来了,上次的“烟花”表白程序你学废了吗,这次我次我又来给大家支招啦,学会了“烟花”,我们一起来看“流星雨”吧!!! 直接上界面

C语言实现流星雨效果流程

上次忘记说了,因为我们是用C语言写的所以是控制台程序,创造不出来界面,那怎么办呢,我们就要用Windows的远房表亲EasyX图形库来建界面了,上次忘记说了,望谅解!!!

我们今天就和往常一样一步一步的教大家如何去完成这个“流星雨”表白程序吧!

一、头文件

最近总是被吐槽为什么没有头文件,原因是呢,我觉得我分享项目最主要的目的是让大家学知识,头文件这些没营养的,开始就没有考虑,但鉴于需要的小伙伴太多了,我就发出来吧!!!

?
1
2
3
4
5
6
7
#include<stdio.h>
#include<easyx.h> //第三方图形库,需要安装
#include<time.h>
#include<conio.h>
 
#include<mmsystem.h>
#pragma comment(lib,"winmm.lib")

二、结构体

老朋友结构体他又来了,不用多说,直接看

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct Star     //小星星
{
    int x;
    int y;
    int r;
    int speed;          //速度
    COLORREF color;     //颜色
};
struct Meteor
{
    int x;
    int y;
    int speed;
};

三、初始化

初始化星星以及流星,要用到随机函数哦,让星星和流星看起来更自然。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//初始化星星
void initStar(int i)
{
    star[i].x = rand() % getwidth();
    star[i].y = rand() % getheight();
    star[i].r = rand() % 3 + 1;
    star[i].speed = rand() % 5; //0 1 2 3 4
    star[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);
}
//初始化流星
void initMeteor(int i)
{
    //[0,2400)
    //[-1200,1200)
    meteor[i].x = rand() % (2 * getwidth()) - getwidth();   //[-1200,1200)
    meteor[i].y = 20 - 200;
    meteor[i].speed = rand()%15+1;
}

四、绘制函数

绘制星星以及流星,简单的贴图就行啦

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
绘制星星
void drawStar()
{
    for (size_t i = 0; i < STAR_NUM; i++)
    {
        //putpixel(star[i].x, star[i].y, star[i].color);
        setfillcolor(star[i].color);
        solidcircle(star[i].x, star[i].y, star[i].r);
    }
}
//绘制流星
void drawMeteor()
{
    for (size_t i = 0; i < METEOR_NUM; i++)
    {
        putimage(meteor[i].x, meteor[i].y, img + rand() % 2,SRCPAINT);
    }
}

五、移动函数

不仅流星要动,星星也要跟着动,怎么动才能更自然,自己也可以优化一下。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//星星的移动
void moveStar()
{
    for (size_t i = 0; i < STAR_NUM; i++)
    {
        star[i].x+=star[i].speed;
        if (star[i].x > getwidth())
        {
            star[i].x = 0;
        }
    }
}
 
//流星的移动
void moveMeteor()
{
    for (size_t i = 0; i < METEOR_NUM; i++)
    {
        meteor[i].x += meteor[i].speed;
        meteor[i].y += meteor[i].speed;
        if (meteor[i].x >= getwidth() || meteor[i].y >= getheight())
        {
            initMeteor(i);
        }
    }
}

六、界面设计

接下来是我们的界面设计函数了,这个也是大家自由发挥的地方,可以自己去查一些界面的设置函数,自己设计自己的界面,里面的情话就可以自己去发挥了!!!

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
void welcome()
{
    //播放音乐 mci media device interface
    mciSendString(_T("open ./images/浪漫空气.mp3 alias bgm"), NULL, 0, NULL);
    mciSendString(_T("play bgm"), NULL, 0, NULL);
 
    //设置随机数种子
    srand((unsigned)time(NULL));
    /*@思考:表白的话语*/
 
    //设置背景模式
    setbkmode(TRANSPARENT);
 
    //设置文字样式
    settextstyle(40, 0, _T("华文行楷"));
 
    //如果没有按键按下,就一直循环
    while (!_kbhit())
    {
        //清屏
        cleardevice();
        putimage(0, 0, &bk);
 
        //设置文字颜色
        settextcolor(RGB(rand()%256, rand() % 256, rand() % 256));
 
        //输出文字
        int tx = (getwidth() - textwidth(_T("XXX我喜欢你"))) / 2;
        outtextxy(tx, 20, _T("XXX我喜欢你"));
 
        outtextxy(200, 100, _T("血包我不要,我只要你"));
        outtextxy(200, 150, _T("老师我在床上更爱你"));
        outtextxy(200, 200, _T("宝 你就想cf里的源武器 便宜但没人要"));
        outtextxy(200, 250, _T("春风十里 ,我只爱你"));
        outtextxy(200, 300, _T("我的程序只有你一个主函数"));
        outtextxy(200, 350, _T("孤单不是与生俱来,而是由你爱上一个人的那一刻开始。"));
        outtextxy(200, 400, _T("如果奇迹有颜色,那一定是彩虹的颜色"));
        outtextxy(200, 450, _T("山有木兮木有枝,心悦君兮君不知"));
        outtextxy(200, 500, _T("我从不畅享未来,遇到了你以后我每天都在想"));
        outtextxy(200, 550, _T("------------ 爱你XXX"));
        
        for (size_t i = 0; i < 10; i++)
        {
            settextcolor(RGB(rand() % 256, rand() % 256, rand() % 256));
            outtextxy(rand()%getwidth(), rand()%getheight(), _T("♥"));
        }
        
        
        Sleep(1000);
    }
}

七、主函数

最后是我们的主函数,把之前的函数一起调用起来吧

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
int main()
{
    //1,创建图形窗口
    initgraph(1200, 800);
    //设置背景颜色
    //setbkcolor(RGB(99, 99, 99));
    //cleardevice();
 
    
    loadimage(&bk, _T("./images/bk.png"),getwidth(),getheight());
 
 
    for (size_t i = 0; i < STAR_NUM; i++)
    {
        initStar(i);
    }
    for (size_t i = 0; i < METEOR_NUM; i++)
    {
        initMeteor(i);
    }
    loadImg();
    welcome();
 
    //双缓冲绘图
    BeginBatchDraw();
    while (true)
    {
        cleardevice();
        putimage(0, 0, &bk);
 
        drawStar();
        moveStar();
 
        drawMeteor();
        moveMeteor();
 
        FlushBatchDraw();
    }
    EndBatchDraw();
getchar();
    return 0;
}

总结

好了,这样一来,“流星雨”表白程序你也已经拿到手了,这还不够吗,以后别说咱们程序员不浪漫,那是不想动手,浪漫起来谁也抵挡不住,代码不难,用心去做谁都可以,加油吧!!!

视频讲解

想要看视频讲解的看这里,讲得很详细,可以认真的听一下

听说向流星许愿就会有好运气

https://www.bilibili.com/video/BV1Tv411g7xL/

感谢

在这里向大家说声感谢,我的“烟花”表白程序上了热榜第一,我很感动,我也很感谢大家的支持,让我觉得自己的努力并不是竹篮打水一场空,我也希望大家可以真实的学到东西,而不是说单纯的只是看一下程序运行的结果,或者说简单的给那个人看罢了,我也不知道这篇发完的结果怎么样,但不管怎么样,我也是希望大家可以在未来不管遇到什么,看到什么都不要放弃学习的机会,再次感谢大家!

到此这篇关于C语言实现流星雨效果流程的文章就介绍到这了,更多相关C语言 流星雨内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/weixin_45713725/article/details/121422011

延伸 · 阅读

精彩推荐