我遇到了圆形和矩形碰撞检测的问题。我试图用毕达哥拉斯定理来解决这个问题。但是没有一个查询有效。矩形与圆的矩形边界框碰撞。
if (CGRectIntersectsRect(player.frame, visibleEnemy.frame)) {
if (([visibleEnemy spriteTyp] == jumper || [visibleEnemy spriteTyp] == wobble )) {
if ((visibleEnemy.center.x - player.frame.origin.x) * (visibleEnemy.center.x - player.frame.origin.x) +
(visibleEnemy.center.y - player.frame.origin.y) * (visibleEnemy.center.y - player.frame.origin.y) <=
(visibleEnemy.bounds.size.width/2 * visibleEnemy.bounds.size.width/2)) {
NSLog(@"Check 1");
normalAction = NO;
}
if ((visibleEnemy.center.x - (player.frame.origin.x + player.bounds.size.width)) *
(visibleEnemy.center.x - (player.frame.origin.x + player.bounds.size.width)) +
(visibleEnemy.center.y - player.frame.origin.y) * (visibleEnemy.center.y - player.frame.origin.y) <=
(visibleEnemy.bounds.size.width/2 * visibleEnemy.bounds.size.width/2)) {
NSLog(@"Check 2");
normalAction = NO;
}
else {
NSLog(@"Check 3");
normalAction = NO;
}
}
}
答案 0 :(得分:0)
以下是我在一个小型游戏项目中的表现。它给了我最好的结果,而且很简单。我的代码检测圆和线之间是否有碰撞。因此,通过检查矩形的所有4个边缘,您可以轻松地将其用于圆形 - 矩形碰撞检测。
假设一个球有一个ballRadius
和一个位置(xBall, yBall)
。该行定义为两个点(xStart, yStart)
和(xEnd, yEnd)
。
实现简单的碰撞检测:
float ballRadius = ...;
float x1 = xStart - xBall;
float y1 = yStart - yBall;
float x2 = xEnd - xBall;
float y2 = yEnd - yBall;
float dx = x2 - x1;
float dy = y2 - y1;
float dr = sqrtf(powf(dx, 2) + powf(dy, 2));
float D = x1*y2 - x2*y1;
float delta = powf(ballRadius*0.9,2)*powf(dr,2) - powf(D,2);
if (delta >= 0)
{
// Collision detected
}
如果delta大于零,则球(圆)和线之间有两个交点。如果delta等于零,则有一个交叉点 - 完美碰撞。
我希望它会对你有所帮助。