当前位置:首页 » 《资源分享》 » 正文

C/C++流星雨

21 人参与  2024年12月14日 14:01  分类 : 《资源分享》  评论

点击全文阅读


流星雨

系列文章

序号直达链接
1C/C++爱心代码
2C/C++跳动的爱心
3C/C++李峋同款跳动的爱心代码
4C/C++满屏飘字表白代码
5C/C++大雪纷飞代码
6C/C++烟花代码
7C/C++黑客帝国同款字母雨
8C/C++樱花树代码
9C/C++奥特曼代码
10C/C++精美圣诞树
11C/C++俄罗斯方块
12C/C++贪吃蛇
13C/C++孤单又灿烂的神-鬼怪
14C/C++闪烁的爱心
15C/C++哆啦A梦
16C/C++简单圣诞树
17C/C++小宇宙
18C/C++冰墩墩
19C/C++七彩花朵
20C/C++玫瑰花
21C/C++小猪佩奇
22C/C++简易爱心

写在前面

C/C++语言实现流星雨动态效果的完整代码。

完整代码

#include <stdio.h>#include <graphics.h> #include <conio.h>#include <math.h>#include <Windows.h>#include <time.h>#include <mmsystem.h>#pragma comment(lib, "winmm.lib")#define PI 3.1415926535897932384624#define MAXSTAR 300  // 限制星星数量,减少性能消耗#define MAXMETEOR 199 // 流星数量// 定义图片变量IMAGE img1, img2, background;// 星星结构体struct Star{    int x, y;    int speed;    int color;} star[MAXSTAR];// 流星结构体struct Meteor{    int x, y;    int speed;    int style;} meteor[MAXMETEOR];// 初始化星星void initStar(int i){    star[i].x = rand() % 1500;    star[i].y = rand() % 1000;    star[i].speed = rand() % 8 + 1;    star[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);}// 绘制并移动星星void drawAndMoveStar(int i){    setfillcolor(star[i].color);    solidcircle(star[i].x, star[i].y, 2); // 绘制小圆作为星星    star[i].x += star[i].speed;    if (star[i].x > 1500)    {        initStar(i); // 重新初始化超出边界的星星    }}// 初始化流星void initMeteor(int i){    meteor[i].x = rand() % 2200 - 1200;     meteor[i].y = -400;    meteor[i].speed = rand() % 15 + 5;  // 速度范围 [5,19]    meteor[i].style = rand() % 2;       // [0,1]}// 更新并绘制流星void updateAndDrawMeteor(){    for (int i = 0; i < MAXMETEOR; i++)    {        // 移动流星        meteor[i].x = meteor[i].x + meteor[i].speed / 2;        meteor[i].y = meteor[i].y + meteor[i].speed / 2;        // 绘制流星        if (meteor[i].style == 0)        {            putimage(meteor[i].x, meteor[i].y, &img1, SRCPAINT);        }        else        {            putimage(meteor[i].x, meteor[i].y, &img2, SRCPAINT);        }        // 流星超出边界重新初始化        if (meteor[i].x > 1500 || meteor[i].y > 1000)        {            initMeteor(i);        }    }}// 主函数int main(){    // 加载图片    loadimage(&img1, "1.jpg", 50, 50);    loadimage(&img2, "2.jpg", 50, 50);    loadimage(&background, "background.jpg", 1500, 1000);    srand((unsigned int)time(NULL));    // 创建图形窗口    HWND hwnd = initgraph(1500, 1000);    ShowWindow(hwnd, 3);    // 播放背景音乐    mciSendString("open 小幸运.mp3 alias MM", 0, 0, 0);    mciSendString("play MM repeat", 0, 0, 0);    // 初始化星星和流星    for (int i = 0; i < MAXSTAR; i++)    {        initStar(i);    }    for (int i = 0; i < MAXMETEOR; i++)    {        initMeteor(i);    }    // 主绘图循环    while (1)    {        BeginBatchDraw();        // 绘制背景        putimage(0, 0, &background);        // 绘制并移动星星        for (int i = 0; i < MAXSTAR; i++)        {            drawAndMoveStar(i);        }        // 更新并绘制流星        updateAndDrawMeteor();        EndBatchDraw();        // 控制帧率        Sleep(10);    }    _getch();    closegraph();    return 0;}

代码分析

这段代码是一个使用 EasyX 图形库编写的 C++ 程序,它创建了一个模拟星空效果的图形窗口。程序中包含了星星和流星的动画效果,并且背景音乐在循环播放。下面是对这段代码的详细分析。

包含的头文件

graphics.h:EasyX 库的图形函数。conio.h:提供控制台输入输出功能,如 _getch() 用于等待按键输入。math.h:数学运算函数。Windows.hmmsystem.h:Windows API 头文件,以及多媒体支持。

宏定义

PI:圆周率的值。MAXSTAR:设定最大星星数量为300个,以限制性能消耗。MAXMETEOR:设定最大流星数量为199个。

结构体定义

Star:表示一个星星,包含位置(x, y)、速度(speed)和颜色(color)。Meteor:表示一个流星,包含位置(x, y)、速度(speed)和样式(style),其中样式决定了使用哪个图片作为流星图像。

函数定义

initStar(int i):初始化第i颗星星的位置、速度和颜色。drawAndMoveStar(int i):绘制第i颗星星并更新其位置;如果星星移出了屏幕,则重新初始化。initMeteor(int i):初始化第i颗流星的位置、速度和样式。updateAndDrawMeteor():更新所有流星的位置,并根据它们的样式绘制相应的图片;如果流星移出了屏幕,则重新初始化。

主函数 main()

加载了三张图片资源,分别用作两种不同样式的流星图像 (img1, img2) 和背景图像 (background)。使用当前时间来播种随机数生成器 (srand((unsigned int)time(NULL))),确保每次运行时星星和流星的初始状态都是不同的。创建了一个1500x1000像素的图形窗口,并显示出来。打开并循环播放名为“小幸运.mp3”的背景音乐。初始化所有星星和流星的状态。进入主绘图循环,持续不断地绘制背景、移动和绘制星星及流星,直到用户关闭程序。在主循环内使用 BeginBatchDraw()EndBatchDraw() 来批量处理绘图命令,提高效率。控制帧率为大约每秒100帧(通过 Sleep(10) 实现)。最后,在用户按键之前保持图形窗口打开,并在结束时清理图形环境。

请注意,为了正确运行这段代码,你需要有 EasyX 图形库的开发环境配置好,并且需要准备对应的图片文件和音频文件。此外,由于这个程序是无限循环的,通常应该有一个退出条件或事件监听机制,例如检测用户的关闭窗口操作或者特定键的按下,以便能够优雅地退出程序。

写在后面

我是一只有趣的兔子,感谢你的喜欢!


点击全文阅读


本文链接:http://zhangshiyu.com/post/201139.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • 京圈佛子破戒后,我改嫁京圈纨绔(沈墨渊,白晶晶)
  • 前世被闺蜜害死,重生后我让她从太子妃变疯女苏婉儿,清歌完本_前世被闺蜜害死,重生后我让她从太子妃变疯女(苏婉儿,清歌)
  • 全书浏览七零军嫂太彪悍,带三宝上军区离婚(沈清落,陈桂花,陆有为)_七零军嫂太彪悍,带三宝上军区离婚(沈清落,陈桂花,陆有为)全书结局
  • 今天也没变成昨天(周扬陈默)全书免费_(周扬陈默)今天也没变成昨天后续(周扬陈默)
  • 重生后,秦总非要父以子贵(许沐晴,秦越泽)全书浏览_重生后,秦总非要父以子贵全书浏览
  • 他嫌弃我喝两块钱豆浆上不了台面,我结婚后他又哭又闹全书万照,白青青在线
  • 昭然若梦前尘烬列表_昭然若梦前尘烬(温昭然方池雲)
  • 导师借我股票账号,我倒欠五十万(孟潇潇,宁薇)_导师借我股票账号,我倒欠五十万孟潇潇,宁薇
  • 拒绝把外卖券给舍友,竹马送我到迪拜捡垃圾(周钰泽,蒋清清,思源)全书浏览_拒绝把外卖券给舍友,竹马送我到迪拜捡垃圾全书浏览
  • 我的人生,你已出局(程森凌古楚文)_我的人生,你已出局程森凌古楚文
  • 穿书成病娇女配,睁眼就签下离婚协议书(朱楼)_穿书成病娇女配,睁眼就签下离婚协议书
  • 老婆逼我给白月光捐肾,我死后她悔疯了(宋逸晨沈墨白)全书浏览_老婆逼我给白月光捐肾,我死后她悔疯了全书浏览

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1