需要图形库graphics.h
到eaxyx官网上下载安装即可

#include <graphics.h>
#include <math.h>
#include <time.h>#define WIDTH  1024  // 屏幕宽
#define HEIGHT  576   // 屏幕高
#define NUM_MOVERS 600   // 小球数量
#define FRICTION 0.96f  // 摩擦力// 定义小球结构
struct Mover
{COLORREF color;   // 颜色float  x, y;   // 坐标float  vX, vY;   // 速度
};// 定义全局变量
Mover movers[NUM_MOVERS];   // 小球数组
int  mouseX, mouseY;   // 当前鼠标坐标
int  mouseVX, mouseVY;  // 鼠标速度
int  prevMouseX, prevMouseY;  // 上次鼠标坐标
bool isMouseDown;    // 鼠标左键是否按下
DWORD* pBuffer;     // 显存指针// 初始化
void init()
{// 初始化小球数组for (int i = 0; i < NUM_MOVERS; i++){movers[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);movers[i].x = WIDTH * 0.5;movers[i].y = HEIGHT * 0.5;movers[i].vX = float(cos(float(i))) * (rand() % 34);movers[i].vY = float(sin(float(i))) * (rand() % 34);}// 初始化鼠标变量mouseX = prevMouseX = WIDTH / 2;mouseY = prevMouseY = HEIGHT / 2;// 设置随机种子srand((unsigned int)time(NULL));// 获取显存指针pBuffer = GetImageBuffer(NULL);
}// 全屏变暗50%
void darken()
{for (int i = WIDTH * HEIGHT - 1; i >= 0; i--)if (pBuffer[i] != 0)pBuffer[i] = RGB(GetRValue(pBuffer[i]) >> 1, GetGValue(pBuffer[i]) >> 1, GetBValue(pBuffer[i]) >> 1);
}// 绝对延时
void delay(DWORD ms)
{static DWORD oldtime = GetTickCount();while (GetTickCount() - oldtime < ms)Sleep(1);oldtime = GetTickCount();
}// 绘制动画(一帧)
void run()
{darken(); // 全屏变暗mouseVX = mouseX - prevMouseX;mouseVY = mouseY - prevMouseY;prevMouseX = mouseX;prevMouseY = mouseY;float toDist = WIDTH * 0.86f;float stirDist = WIDTH * 0.125f;float blowDist = WIDTH * 0.5f;for (int i = 0; i < NUM_MOVERS; i++){float x = movers[i].x;float y = movers[i].y;float vX = movers[i].vX;float vY = movers[i].vY;float dX = x - mouseX;float dY = y - mouseY;float d = (float)sqrt(dX * dX + dY * dY);dX = d ? dX / d : 0;dY = d ? dY / d : 0;if (isMouseDown && d < blowDist){float blowAcc = (1 - (d / blowDist)) * 14;vX += dX * blowAcc + 0.5f - float(rand()) / RAND_MAX;vY += dY * blowAcc + 0.5f - float(rand()) / RAND_MAX;}if (d < toDist){float toAcc = (1 - (d / toDist)) * WIDTH * 0.0014f;vX -= dX * toAcc;vY -= dY * toAcc;}if (d < stirDist){float mAcc = (1 - (d / stirDist)) * WIDTH * 0.00026f;vX += mouseVX * mAcc;vY += mouseVY * mAcc;}vX *= FRICTION;vY *= FRICTION;float avgVX = (float)fabs(vX);float avgVY = (float)fabs(vY);float avgV = (avgVX + avgVY) * 0.5f;if (avgVX < 0.1) vX *= float(rand()) / RAND_MAX * 3;if (avgVY < 0.1) vY *= float(rand()) / RAND_MAX * 3;float sc = avgV * 0.45f;sc = max(min(sc, 3.5f), 0.4f);float nextX = x + vX;float nextY = y + vY;if (nextX > WIDTH) { nextX = WIDTH; vX *= -1; }else if (nextX < 0) { nextX = 0;  vX *= -1; }if (nextY > HEIGHT) { nextY = HEIGHT; vY *= -1; }else if (nextY < 0) { nextY = 0;  vY *= -1; }movers[i].vX = vX;movers[i].vY = vY;movers[i].x = nextX;movers[i].y = nextY;// 画小球setcolor(movers[i].color);setfillstyle(movers[i].color);fillcircle(int(nextX + 0.5), int(nextY + 0.5), int(sc + 0.5));}
}// 主函数
void main()
{// 创建绘图窗口initgraph(WIDTH, HEIGHT);// 启用批绘图模式BeginBatchDraw();// 初始化init();// 鼠标消息变量MOUSEMSG m;while (true){// 处理鼠标消息while (MouseHit()){m = GetMouseMsg();switch (m.uMsg){case WM_MOUSEMOVE:  mouseX = m.x; mouseY = m.y; break;case WM_LBUTTONDOWN: isMouseDown = true;    break;case WM_LBUTTONUP:  isMouseDown = false;   break;}}// 绘制动画run();// 显示缓存的绘制内容FlushBatchDraw();// 延时20 毫秒delay(20);}// 关闭EndBatchDraw();closegraph();
}

C++ 流体效果的实现相关推荐

  1. 如何知道当前像素的顶点坐标_GT 大神 | 如何高效渲染流体效果(绝对干货)

    流体效果 相信大家都不陌生,实现方式中的一种是将粒子渲染成 metaball . 什么是metaball metaball 就是粒子加上其周围的 密度场 (density field).两个 meta ...

  2. ps怎么制作流体_PS教程:制作渐变流体效果海报

    相信大家都看到过一些很酷的使用渐变流体的海报,此类海报一般都充满活力,而且色彩的饱和度都很高,因为这样更能让作品脱颖而出. 看到这些非常有立体感的渐变色彩,大家可能以为只有用很复杂的三维软件才能够做出 ...

  3. After Effect水墨流体效果

    1.下载水墨流体插件turbulence.2d 下载地址http://www.52inwet.com/?p=3816 2.安装插件 (1)解压压缩包,将Crack目录下的Turbulence2D.ae ...

  4. AE怎么制作流体文字效果?这波教程我真学会了

    如何让自己的片头或者PPT.海报有逼格?这波咱就是一个不得不学的大动作给到!怎么说呢?今天咱给到的教程就是制作路径文字流动效果,不管是给老板展示年报还是要弄一段有逼格的视频,这波路径文字流动效果必须拥 ...

  5. 如何用3D流体实现逼真水流效果?

    华为应用市场在2022年HDC大会期间发布了一款3D水流主题,基于华为HMS Core Scene Kit服务能力,展现立体灵动的水流岛屿,可跟随用户指尖实现实时流体波动效果,既趣味又解压. 让变幻莫 ...

  6. 基于SPH的流体仿真过程

    转载自:https://blog.csdn.net/changbaolong/article/details/13172079 http://blog.sina.com.cn/s/blog_6f638 ...

  7. unity水流效果插件Obi Fluidv4.1

    Obi Fluid插件是一款为unity3D用户提供的水流效果插件,很多游戏中都会有河流湖泊之类的存在,大家自己去建模非常麻烦,可以直接使用这款Obi Fluid插件制作出水流效果,非常方便. 使用说 ...

  8. 【游戏开发进阶】Unity流体模拟,支持粒子系统,支持流体碰撞交互(Obi Fluid插件使用教程)

    文章目录 一.前言 二.效果演示 三.使用方法 1.流体发射器 2.流体碰撞器 3.流体渲染器 4.修改流体颜色 5.盆子模型 6.流体颗粒大小 7.流体材质 8.喷射口调节 9.喷射速度调节 10. ...

  9. 欢乐水杯(happy glass)的流体实现! Cocos Creator!

    用 shader + camera 实现流体效果 !文章底部附完整代码! 效果预览 实现原理 整体思路是参考论坛中的一个帖子.(链接:https://forum.cocos.org/t/happy-g ...

最新文章

  1. linux系统进入管理员命令行,Linux的15个命令行别名,帮系统管理员提升工作效率!...
  2. [python数据分析] 简述幂率定律及绘制Power-law函数
  3. IntelliJ IDEA的光芒会盖过Eclipse吗
  4. LinkedList 模拟栈和队列
  5. 利用PHP执行SQL文件,将SQL文件导入到数据库
  6. C#多线程之Thread
  7. 帆软扩展后排序(超链排序)
  8. 数据结构与算法JavaScript描述——队列
  9. 电脑搜索不到打印机应该怎么办?
  10. rust 案例_深入浅出rust.pdf 高清版
  11. 第六章(1.8)自然语言处理实战——Jieba中文分词,WordEmbedding的概念和实现
  12. Java中使用isAlphabetic()办法无法解决判断一个char是英文字母,该用别的方法解决
  13. linux alarm函数clock,linux c之alarm函数的使用,定时器的实现
  14. linux桌面鼠标可动 但点其他,电脑鼠标能动但点不了的两种解决方法
  15. 开源学校管理系统php,SchoolCMS学校管理系统 v2.3
  16. 猴子吃桃问题(记录自己的学习)
  17. java的JVM虚拟机相关知识,简单易懂。
  18. Java中Native的作用
  19. pip安装pytorch清华_通过 pip 安装 pytorch
  20. 线下+线上双管齐下,订单管理系统助力餐饮业提升销量

热门文章

  1. Keras-数据准备
  2. php curl 发送https请求失败,php的curl扩展无法发起https请求
  3. java instanceof 动态_Java关键字instanceof用法及实现策略
  4. AJAX DELETE
  5. POJ2236(并查集)
  6. HDU4302(map的用法)
  7. cocos2d-x初探学习笔记(14)--菜单项
  8. SQLLite (四):sqlite3_prepare_v2,sqlite3_step
  9. MySQL 备份与主从复制
  10. python实现 HmacSHA256加密算法