超级玛丽碰撞检测(跑酷碰撞检测)

来源:互联网 发布:DB2000数据库 2008 编辑:程序博客网 时间:2024/05/16 15:04
/*检测是否碰撞*/ if(CCRectMake(X-mario->getPathLenght()+1,Y,Widht-2,Height).intersectsRect(mario->getPlayerBoundingBox())) {/*上面的函数是检测到已经碰撞后, 下面的逻辑是判断碰撞后人物与物体的位置关系*//*物体位置和长宽*/float x2 = X-mario->getPathLenght();float y2 = Y;int h2 = Height;int w2 = Widht;/*人物位置和长宽*/int y1 = mario->getPositionY();int x1 = mario->getPositionX();float w1 = mario->getCurrentWidth();float h1 = mario->getCurrentHeight();/*如果y坐标不重叠 , y坐标就减去人物y轴的速度*/if (abs(y1+h1-y2)>1e-4){y1-=mario->verticalVelocity;}/*     25------------        6|           ||    |1|    |       3|    |------------      8            4               7上面数字是物体的方位人物从哪个方位碰撞到物体*/if ((y1>=y2)&&(y1+h1<y2+h2)){if (x1<x2)//1{/*正面碰撞1设置x位置设置水平速度*/mario->setPositionX(x2-w1);mario->horizontalVelocity = 0;} else//3{/*正面碰撞3设置x位置设置水平速度*/mario->setPositionX(x2+w2);mario->horizontalVelocity = 0;}}else if ((x1>=x2)&&(x1+w1<x2+w2)){if (y1>y2)//2{/*正面碰撞2设置y位置设置垂直速度*/mario->setPositionY(y2+h2);if (mario->getIsJumping()){mario->setIsJumping(false);}mario->setIsOnTheObject(true);} else//4{/*正面碰撞4设置y位置设置垂直速度*/mario->setPositionY(y2-h1);mario->verticalVelocity = -mario->verticalVelocity;}}else if(x1<=x2&&y1>y2)//5{/*碰撞面5 (同时碰撞 面1 和 面2 )*/if (x1+w1-x2>y2+h2-y1){/*如果碰撞到的2比1多设置y坐标设置垂直速度*/mario->setPositionY(y2+h2);if (mario->getIsJumping()){mario->setIsJumping(false);}mario->setIsOnTheObject(true);}else{/*如果碰撞到的2比1少设置x坐标设置水平速度*/mario->setPositionX(x2-w1);mario->horizontalVelocity = 0;}}else if (x1>=x2&&y1>y2)//6{/*同理。。。。。。*/if (x2+w2-x1>y2+h2-y1){mario->setPositionY(y2+h2);if (mario->getIsJumping()){mario->setIsJumping(false);}mario->setIsOnTheObject(true);} else{mario->setPositionX(x2+w2);mario->horizontalVelocity = 0;}}else if(x1>=x2&&y1<y2)//7{if (x2+w2-x1>y1+h1-y2){mario->setPositionY(y2-h1);mario->verticalVelocity = -mario->verticalVelocity;mario->setPositionY(mario->getPositionY()+mario->verticalVelocity);} else{mario->setPositionX(x2+w2);mario->horizontalVelocity = 0;}}else if (x1<=x2&&y1<y2)//8{if (x1+w1-x2>y1+h1-y2){mario->verticalVelocity = -mario->verticalVelocity;mario->setPositionY(y2-h1);mario->setPositionY(mario->getPositionY()+mario->verticalVelocity);} else{mario->setPositionX(x2-w1);mario->horizontalVelocity = 0;}} }

0 0