【Visual C++】游戏开发笔记二十二 游戏基础物理建模(四) 粒子系统模拟(一)

2023-11-16

本系列文章由zhmxy555(毛星云)编写,转载请注明出处。

http://blog.csdn.net/zhmxy555/article/details/7585937

作者:毛星云    邮箱: happylifemxy@qq.com    期待着与志同道合的朋友们相互交流


 

本节内容主要讲解了在GDI中粒子的运用,为后续DirectX中粒子系统的讲解提供一个初步的认识。


 



一.基础知识讲解



1.基本概念


粒子是一种微小的物体,在数学上通常用点来表示其模型。我们可以把粒子想象成颗粒状的物体,如雪花,雨滴,沙尘,烟雾

等特殊的事物。又比如游戏中的怪物,晶体,材料,在需要的时候,也可以通过粒子来实现。俗话说“不积跬步,无以至千里,

不积小流,何以成江海”,单个的粒子是比较平凡的存在,但是如果将大量的粒子聚到一起,就可以实现很多神奇的效果了。

 

在C/C++中想要定义一个粒子是非常容易的。基本功扎实的朋友们肯定马上就可以想到,“结构体“是用来定义粒子类型的绝

佳武器。原则上用“类”也可以实现,但是在这里采用“结构体”将更加合适。



 

2.实现方法


如下面的这个结构体snow便是用来定义“雪花”粒子的:


 



可以看出,上述结构体中有3个成员,分别是代表X坐标的x,代表Y坐标的y,与表示雪花是否存在的布尔型变量exist。


定义完粒子的结构体后,便可以实例化一个粒子数组了。

 



如果我们需要一个大小为50的snowfly数组,则可用一下两种方法来进行:


<1>在结构体的尾部加上我们需要实例化的对象


  1. struct snow  
  2. {  
  3.        int x;        //雪花的 X坐标  
  4.        int y;        //雪花的 Y坐标  
  5.        BOOL exist; //雪花是否存在  
  6. }snowfly[50];  


 

<2>单独定义


  1. snow snowfly[50];  


 

定义完之后,就可以在这个粒子数组的基础上,用代码进行相关功能的实现了。

以上就是粒子系统概念的一个简明扼要的讲解。而下面我们依旧是通过一个实例来巩固本节所学。

 

 




二、详细注释的源代码欣赏


 

在贴出全部的源代码之前,我们先把最关键的部分提出来先剖析一下,下面是本节实例的核心代码:

 




MyPaint函数的书写思路是,先初始化每个粒子,这里是共50个粒子。然后贴上背景图到mdc中,再用循环将各个粒子也贴

到mdc中,循环完成之后,再统一将mdc中的内容直接贴到hdc中。这样做的优点是比较直观,提高了贴图的效率。

 

 




下面就贴出全部详细注释的源代码,供大家学习,需要在自己机器上运行并学习提高的朋友,请点击文章末尾处贴出的地址进

行下载。源代码依旧是分为VC6.0和VS2010两个版本。这里贴出的是VC6.0版的:


[




下面是运行后的截图效果:



 



 

可以看到窗口中有漫天飞舞的雪花,我们可以调节数组大小,及几处设定的数值的大小,来使雪花来得更猛烈些。


这张背景图是否有些熟悉呢?哈哈,喜欢打Dota的朋友们应该可以发现,这张图就是Dota的游戏原画(或者说是魔兽争霸Ⅲ

冰封王座的原画,因为Dota其实就是基于这款游戏的一张自定义多人对战地图罢了),左边的显然就是恐怖利刃TerroBlade

(咦,他的双刀呢?),中间远远在背后摆造型的是召唤师卡尔,而最右边的当然就是目前Dota中的“一姐”蛇发女妖美杜莎

了。

 

 



在文章末尾说点题外话吧。

由于这段时间事务繁杂,有接近一个多星期没更新博文了,在这里必须给一直期待着更新的朋友们说声抱歉,也需要给自己说

声抱歉,因为写博文不仅能分享知识和经验,也是整理自己思维的一个很好的途径。

浅墨以后会尽量做到一星期一更新,每周的新文章大概会在周一发表出来。为了保证文章的质量,浅墨觉得更新的节奏需要好

好把握,而且毕竟【Visual C++游戏开发】系列专栏的每一篇文章都基本上都是配有源码的(况且现在浅墨每次提供的都是

VC6.0和VS2010两个版本的源码-o-),每篇文章的配套源码也需要时间来写呢,可不能像小说一样每星期发表那么多章节,

况且浅墨平常事情很多,也没这精力呢~

关于大家提到的浅墨总是熬夜的问题,其实浅墨从来都不熬夜的- -。因为浅墨目前是在欧洲,经常是在当地时间晚上10点左右

把最新的文章发表出来,所以大家在中国看到的都是半夜3点4点左右发表的文章,所以不要以为浅墨是熬夜码字啦,那是因为

时差问题~~ -o-

 

 


还有那些需要学习资料的朋友,留下邮箱后(最好在最近更新的或者【Visual C++】游戏开发笔记系列的第一篇文章【Visual C++】游戏开发笔记之一——API函数、DirectX的关键系统 留下邮箱,方便浅墨及时看到你的留言),浅墨会在该周的周末做统一发送(不出特殊情况就是周末晚上发送,算上欧洲和国内5小时的时差,大家大概周一早

上既可以收到),由于附件的保质期是30天,希望收到邮件的朋友们及时下载。

 



好了,本篇就写到这里吧,谢谢大家的观赏,下面依旧是放出两个版本的源代码供大家下载学习)(当然,必须是零资源分下载^^):

 

本篇文章VS2010版的配套源码请点击这里下载:【VS2010版】【Visual C++】

Code_Note_22

 

 

本篇文章VC6.0版的配套源码请点击这里下载: 【VC6.0版】【Visual C++】

Code_Note_22

 

 

 

 

 

感谢一直支持【Visual C++】游戏开发笔记系列专栏的朋友们,也恳请大家继续关注我的专栏。

目前在讲的GDI只是前奏。DirectX 11会在GDI梳理完后进行深入讲解,敬请期待~~

【Visual C++】游戏开发 系列文章才刚刚展开一点而已,因为游戏世界实在是太博大精深了~

但我们不能着急,得慢慢打好基础。做学问最忌好高骛远,不是吗?

 

浅墨希望看到大家的留言,希望与大家共同交流,希望得到睿智的评论(即使是批评)。

你们的支持是我写下去的动力~

 

精通游戏开发的路还很长很长,非常希望能和大家一起交流,共同学习,共同进步。

大家看过后觉得值得一看的话,可以顶一下这篇文章,你们的支持是我继续写下去的动力~

如果文章中有什么疏漏的地方,也请大家指正。也希望大家可以多留言来和我探讨相关的问题。

最后,谢谢你们一直的支持~~~

                                               

 

                                                ——————————浅墨于2012年5月20日


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Visual C++】游戏开发笔记二十二 游戏基础物理建模(四) 粒子系统模拟(一) 的相关文章

  • “构建”构建我的项目,“构建解决方案”则不构建

    我刚刚开始使用VS2010 我有一个较大的解决方案 已从 VS2008 成功迁移 我已将一个名为 Test 的控制台应用程序项目添加到解决方案中 选择构建 gt 构建解决方案不编译新项目 选择构建 gt 构建测试确实构建了项目 在失败的情况
  • 查找c中结构元素的偏移量

    struct a struct b int i float j x struct c int k float l y z 谁能解释一下如何找到偏移量int k这样我们就可以找到地址int i Use offsetof 找到从开始处的偏移量z
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • 堆栈溢出:堆栈空间中重复的临时分配?

    struct MemBlock char mem 1024 MemBlock operator const MemBlock b const return MemBlock global void foo int step 0 if ste
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • 在 ASP.NET 5 中使用 DI 调用构造函数时解决依赖关系

    Web 上似乎充斥着如何在 ASP NET 5 中使用 DI 的示例 但没有一个示例显示如何调用构造函数并解决依赖关系 以下只是众多案例之一 http social technet microsoft com wiki contents a
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • 将多个表映射到实体框架中的单个实体类

    我正在开发一个旧数据库 该数据库有 2 个具有 1 1 关系的表 目前 我为每个定义的表定义了一种类型 1Test 1Result 我想将这些特定的表合并到一个类中 当前的类型如下所示 public class Result public
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 垃圾收集器是否在单独的进程中运行?

    垃圾收集器是否在单独的进程中启动 例如 如果我们尝试测量某段代码所花费的进程时间 并且在此期间垃圾收集器开始收集 它会在新进程上启动还是在同一进程中启动 它的工作原理如下吗 Code Process 1 gt Garbage Collect
  • 使用 x509 证书签署 json 文档或字符串

    如何使用 x509 证书签署 json 文档或字符串 public static void fund string filePath C Users VIKAS Desktop Data xml Read the file XmlDocum
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • IEnumreable 动态和 lambda

    我想在 a 上使用 lambda 表达式IEnumerable
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定

随机推荐

  • Java的8种基本数据类型

    博主前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住也分享一下给大家 点击跳转到网站 前言 Java数据类型分为两大类 基本数据类型 引用类型 如图所示 下面讲解的是Java的八种基本数据类型 一 按照数据类型来分 1 整
  • 西门子变频器SINAMICS S120电源模块分享

    西门子变频器SINAMICS S120系列 在工业领域中能胜任各种要求严格的驱动控制任务 为用户提供简单有效的驱动控制过程 西门子变频器SINAMICS S120系列可以配置电源模块 来为西门子变频器驱动控制系统提供稳定的电源保障 本文下面
  • 设计模式-模板方法

    文章目录 前言 模板方法模式简介 Java代码示例 模板方法使用场景 模板方法使用场景 前言 当我们需要在一个算法的框架中定义算法的骨架 并将一些步骤的具体实现留给子类来完成时 模板方法模式是一种非常有用的设计模式 这篇博客将介绍模板方法模
  • install.packages(“hgu133a.db“)报错——解决办法

    问题描述 install packages hgu133a db WARNING Rtools is required to build R packages but is not currently installed Please do
  • Sqli-Labs Less1-16关详细讲解

    Sqli Labs Less1 16关详细讲解 一 首先介绍一下这个重要的数据库 information schema数据库 二 Sqli Labs靶场 Get传输方式 Less 1 Union Select注入 闭合符 Less 5 报错
  • freertos中空闲任务函数prvIdleTask()详解

    The Idle task 空闲任务函数 The portTASK FUNCTION macro is used to allow port compiler specific language extensions The equival
  • Verilog开源项目——百兆以太网交换机(一)架构设计与Feature定义

    Verilog开源项目 百兆以太网交换机 一 架构设计与Feature定义 声明 未经作者允许 禁止转载 博主主页 王 嘻嘻的CSDN主页 全新原创以太网交换机项目 Blog内容将聚焦整体架构 模块设计方面 更新周期可能会略慢 希望朋友们多
  • 树状数组详解

    Markdown版本 请点击这个链接 树状数组 Markdown版本 xiji333的博客 CSDN博客 什么是树状数组 树状数组 Binary Indexed Tree B I T Fenwick Tree 是一个查询和修改复杂度都为lo
  • Android中当数据库需要更新时我们该怎么办?

    问题 Android数据库更新并保留原来的数据如何实现 Andoird的SQLiteOpenHelper类中有一个onUpgrade方法 帮助文档中只是说当数据库升级时该方法被触发 经过实践 解决了我一连串的 疑问 1 帮助文档里说的 数据
  • Linux系统shell脚本之批量修改服务器密码

    Linux系统shell脚本之批量修改服务器密码 一 脚本要求 二 脚本内容 三 编辑原始旧密码 四 执行脚本 五 验证密码更改 1 查看更改后的密码文件 2 在远端服务器验证密码 一 脚本要求 可以批量修改服务器的密码 二 脚本内容 bi
  • 【机器学习】机器学习回归模型的最全总结!

    导读 大家好 我是泳鱼 一个乐于探索和分享AI知识的码农 回归分析为许多机器学习算法提供了坚实的基础 在这篇文章中 我们将介绍回归分析概念 7种重要的回归模型 10 个重要的回归问题和5个评价指标 什么是回归分析 回归分析是一种预测性的建模
  • Linux系统与管理 - (六)用户与组❤

    自说 学习路径 用户管理 用户管理命令 组管理 组管理命令 目录和文件的权限 自说 在Windos系统中 用户的概念我们并不陌生 它是一种身份也是一种权限 不同的用户也相应有着不同的使用 下面细说下Linux中的用户与组 学习路径 Linu
  • windows上nacos自启动的三种方法

    前提 windows上先安装nacos 备注 方法一 二都是以 windows服务 形式进行自启动 效果类似于mysql的windows服务 但这种方法nacos服务可能会启动失败 不想浪费时间的博主建议直接跳转方法三 跟nacos自启动死
  • 初级java工程师笔试题

    最近面试很头疼 因为满以为自己工作了1年多了 实际coding经验却压缩到不到1年 每每被面试官 痛扁 心里特别不痛快 总以为我能给你交活不就完了吗有必要在基础上为难我吗 相信大多数不会总结 在面试中屡屡受挫的小伙伴你也是差不多的吧 因为没
  • 邮AI——AI陪你“邮”笑邮语!

    亲爱的小伙伴们 你是否有过写邮件的时候 脑袋一片空白 就像忘记刷牙一样让人尴尬 别担心 因为有一个 邮 到了幽默智能的解决方案 邮AI 它不仅能帮你写邮件 还能陪你 邮 笑邮语 邮AI 顶级AI大脑 不只是靠模板搞笑 它是真正的幽默高手 从
  • Altium Designer借助嘉立创添加PCB封装和3D模型

    目录 引言 打开立创专业版EDA 建立项目 从立创商城找到器件编码 添加PCB封装 导出和修改3D封装 引言 由于使用Altium Designer的频率并不是特别高 所以每一次使用总是得东跌西撞的才回忆起一些使用步骤 因此 想在这里记录一
  • 【PyTorch】语言模型/Language model

    1 模型描述 1 语言模型的定义 来自于维基百科 统计式的语言模型是一个几率分布 语言模型提供上下文来区分听起来相似的单词和短语 例如 短语 再给我两份葱 让我把记忆煎成饼 和 再给我两分钟 让我把记忆结成冰 听起来相似 但意思不同 语言模
  • 移动端浏览器兼容性问题

    在开发移动端商城项目的时候 在实现功能和处理bug的过程中出现了一些之前没有见过的问题 在这里记录一下 1 IOS移动端click事件300ms的延迟响应 移动设备上的web网页是有300ms延迟的 玩玩会形成按钮点击延迟甚至是点击失效 这
  • linux查看mysql表空间使用率_查看表空间使用率sql

    10G进asm 直接su oracle 然后asmcmd 11G进asm 需要su grid 然后asmcmd 1 切换到相关oracle数据库实例下 echo ORACLE SID 查看当前数据库实例 或者进入sql下执行 select
  • 【Visual C++】游戏开发笔记二十二 游戏基础物理建模(四) 粒子系统模拟(一)

    本系列文章由zhmxy555 毛星云 编写 转载请注明出处 http blog csdn net zhmxy555 article details 7585937 作者 毛星云 邮箱 happylifemxy qq com 期待着与志同道合