程序是一个月前完成的,之前一直没正儿八经的来整理下这个程序,感觉比较简单,不过即使简单的东西也要跟大家分享下。
开篇
开始上代码之前我先说下我为啥写的这个程序,大三的时候学习C#接触过GDI+而发现原来做图形界面的程序也可以这么简单。之后便开始用GDI+做起动画、游戏等,其中便有一个模拟多小球碰撞的,在CSDN上有分享过(
http://pan.baidu.com/s/1qWjTkmS),不过现在回头想想那个程序还是存在很多问题的,比如:没考虑非对心碰撞问题,或者说是球体斜碰问题,帧率低问题,碰撞检测精度不够导致小球粘连问题(使用的是球体像素整型)。说到这里想必使用过GDI+的同学都会有一个想法就是GDI+用来做游戏效率确实不行。于是呢转战C++,正好自己的毕设要写一个C++ 2D游戏,所以在写游戏项目之余,便花费一天时间写了这个模拟球体“弹性斜碰”程序。至于为什么要花这么长时间,是因为大多数时间我都花在了这个“斜碰”问题上,这也是我要写这篇博客的主要原因,网上关于小球弹性
斜碰的程序确实很少。不信可以百度下。
上代码
模拟小球碰撞嘛,所以小球的实体类是必须的(Ball.h)
#pragma once
#include <math.h>
#include "hge.h"
class CBall
{
public:
CBall();
CBall(float _x,float _y,float _speedX ,float _speedY,float _radius ,DWORD _color,float _density = 1.0f);
~CBall(){};
public:
bool IsCollision(CBall *ball,float dt); //碰撞检测
void CollisionWith(CBall *ball); //弹性正碰
void CollisionWith2(CBall *ball); //弹性斜碰
void SwapColor(CBall *ball); //好玩点,加个交换颜色
void MoveNext(float dt,float _width,float _height);
//由于程序不大,方便起见所有就都public了
public:
float x; //x轴坐标
float y; //y轴坐标
float speed_x; //x轴方向速度
float speed_y; //x轴方向速度
float radius; //球体半径
float density; //密度
float weight; //质量
DWORD color; //混合颜色
};
从Ball的类成员定义中可以看出来,球体的大概属性基本包括全面了,不过多了个Color这个属性是用来设置球体颜色的,因为图片素材是纯白实心圆,在使用color颜色进行顶点着色时候可直接设置获得该颜色的圆。
下面依次说下各个成员方法的作用,部分有代码。