天天看点

C++多小球非对心弹性碰撞(HGE引擎)

程序是一个月前完成的,之前一直没正儿八经的来整理下这个程序,感觉比较简单,不过即使简单的东西也要跟大家分享下。

源码下载:

C++多小球非对心弹性碰撞(HGE引擎)

开篇

    开始上代码之前我先说下我为啥写的这个程序,大三的时候学习c#接触过gdi+而发现原来做图形界面的程序也可以这么简单。之后便开始用gdi+做起动画、游戏等,其中便有一个模拟多小球碰撞的,在csdn上有分享过(),不过现在回头想想那个程序还是存在很多问题的,比如:没考虑非对心碰撞问题,或者说是球体斜碰问题,帧率低问题,碰撞检测精度不够导致小球粘连问题(使用的是球体像素整型)。说到这里想必使用过gdi+的同学都会有一个想法就是gdi+用来做游戏效率确实不行。于是呢转战c++,正好自己的毕设要写一个c++

2d游戏,所以在写游戏项目之余,便花费一天时间写了这个模拟球体“弹性斜碰”程序。至于为什么要花这么长时间,是因为大多数时间我都花在了这个“斜碰”问题上,这也是我要写这篇博客的主要原因,网上关于小球弹性斜碰的程序确实很少。不信可以百度下。

上代码

模拟小球碰撞嘛,所以小球的实体类是必须的(ball.h)

从ball的类成员定义中可以看出来,球体的大概属性基本包括全面了,不过多了个color这个属性是用来设置球体颜色的,因为图片素材是纯白实心圆,在使用color颜色进行顶点着色时候可直接设置获得该颜色的圆。

下面依次说下各个成员方法的作用,部分有代码。

构造方法cball(float _x,float _y,float ... ,float _density = 1.0f);对成员变量初始化,需要注意,密度默认是1.0f,而质量通过体积和密度的计算求得。【球体质量

m=ρ*v , v = 4/3*π*r^3】。

碰撞检测,返回当前对象时候与参数ball发生碰撞,dt是一帧的时间。

弹性正碰 void cball::collisionwith(cball *ball)根据动能定理和动量守恒定律得出公式

    //弹性正碰撞公式

    //v1‘ = [ (m1-m2)*v1 + 2*m2*v2 ] / (m1+m2)

    //v2‘ = [ (m2-m1)*v2 + 2*m1*v1 ] / (m1+m2)

碰撞后,两小球的速度,方向,会发生改变。

弹性斜碰,文章的主角,由于计算比较复杂所以需要用到向量(vector)。

交换颜色,发生碰撞后的两个小球进行颜色交换,纯属娱乐。

<code></code>

void cball::swapcolor(cball *ball)

小球移动,参数 _width,_height分别是窗口的宽高,因为这个方法内包含边界碰撞的检测和反弹。

主函数,使用hge引擎,看注释吧这里不详细说了。

(hge是一个小型的2d游戏引擎,基于directx8,相关学习资料下载:)

结束语

大四快毕业了,现在才发现大学期间学的确实太少,玩的太多(dotaer哈哈),好多感慨,都化成两个字“时间”。回想起当初刚上大一的时候,拿着书本照着上面一字不差的敲着c程序代码,直到程序运行出来还不能理解程序是怎么个原理,怎么实现的,不过还好“时间”告诉了我。从大一学的枯燥的只能用来acm的c/c++到大二终于见到图形界面却又笨拙而不适合图形界面开发的java再到大三时让图形界面开发简单至极却又低效无法满足游戏开发的c#到最后又回到了最初那个高效而复杂的让人抓狂的c++,就这样走完了大学四年。同学现在有不少出去工作了的,不过给我的感觉就是大家好像都是一知半解,拿着刚好养活自己的工资,在不断地学习着,不过期待同学们都能找到自己满意的工作,也希望自己找工作能顺利。写这篇文章是还在考虑要不要参加蓝桥杯的决赛,毕竟我都大四了,而且最近的事情会好多。不好意思思路有点断篇。言归正传,毕设在做一个“仿《保卫萝卜》塔防游戏”,框架基本上搭建差不多了,还有部分需要完善的地方,在此先发个不完整版,,框架仅供参考。毕竟我是菜鸟级的,很多东西都一知半解,所以程序有什么不妥的地方还望不吝提出。先谢谢了!

程序源码下载:

继续阅读