30分!请教一个《打砖块》小问题!(女生新学VC,请帮帮忙了)
我现在正用VC++做一个打砖块的小游戏,基本的框架已经做好了,但是,小球弹起与砖块相撞后(我是根据颜色判断碰撞的),对应的砖块应该消失,如何判断哪一个砖块与小球发生碰撞,这个地方的代码不会写了,我想请教哪位好心的GG,能帮我解决一下。
谢谢!
[133 byte] By [
gxz1983] at [2008-4-9]
我觉得你的做法(我是根据颜色判断碰撞的)错了,应该记录所有砖块的位置和小球的当前位置来判断是否发生碰撞,那样你自然就知道碰撞的是哪一块砖块了
我觉得你的想法挺好的.但能不能仔细说一说啊.
1.小球的当前坐标是左上角坐标还是碰撞点坐标?如果是碰撞点,它的坐标怎么得到的.
如果是左上角,有可能出错:左上角坐标所在的范围的砖块,和实际发生碰撞的砖块不是同一个.
2.如果不使用颜色来判断碰撞,那么小球和底版(就是游戏中在画面底部来回移动的板)的碰撞
怎么判断.使用坐标来判断,好象很难实现阿.
不知我说清楚没!请前辈指教一二!谢谢了!
可以不需要知道是哪一点发生碰撞,只需要知道是那个矩形发生碰撞就可以了
先用aabb,如果碰撞了,再进一步和球检测
哦,我想问一下,你说的那个矩形是哪个矩形,还有aabb是什么?
不好意思,我刚学VC,有好多东西都不知道。
砖块的矩形啊,依次和每个砖块,或者和球附近的砖块进行判断
aabb是游戏编程术语,Axially Aligned Bounding Box的简写,与vc无关
你说的是通过范围检测碰撞吗?
还有依次和每个砖块进行判断,我觉得好复杂,有没有简单一点方法呢?嘿嘿,太笨了,没办法阿 。
每个砖块肯定是一个对象,或者是数组里面的一个值也可以表示
struct Tile
{
float left,right,top,bottom;
bool visible;
int color;
};
class Ball
{
public :
float x,y;//中心坐标
float r;//半径
bool CollideWith(Tile& t);
};
游戏中的所有砖块比如在一个数组里面
vector<Tile> tiles;
Ball ball;
碰撞的时候把每个tile都循环一次
for(vector<Tile>::iterator i = tiles.begin(); i!= tiles.end(); ++i)
{
if(ball.CollideWith(*i))
(*i).visible = false;
}
所以只有写出CollideWith这个函数就可以了
矩形是否相交速度很快
bool TntersectRect(float r1x1, float r1y1, float r1x2, float r1y2,
float r2x1, float r2y1, float r2x2, float r2y2) {
if (r2x1 >= r1x2 || r2y1 >= r1y2 || r2x2 <= r1x1 || r2y2 <= r1y1) {
return false;
} else {
return true;
}
}
bool Ball::CollideWith(Tile& t)
{
if(TntersectRect(t.left,t.top,t.right,t.bottom,x-r,y-r,x+r,y+r))
{
//矩阵四个点与球心的距离最小值小于r说明碰撞
}
return false;
}
如果要球碰撞点的坐标,就麻烦一点了
感谢 Bobby136 的技术支持!!
呵呵,我按你说的,已经完成那个功能了,哈哈,再次感谢!
希望以后有问题时,还能再请教你!