Модель обнаружения столкновений Cocos2d - лучше всего подходит для моего случая? - PullRequest
0 голосов
/ 14 октября 2011

Я создаю игру cocos2d для iPhone с множеством пуль и движущихся врагов, и я обнаруживаю столкновения между ними.Каждый спрайт может быть представлен кругом в целях столкновения.Я рассматриваю следующие варианты:

1) Простое обнаружение сферы

Я обнаруживаю так через регулярные интервалы:

-(BOOL) isCollidingSphere:(CCSpriteExt*) obj1 WithSphere:(CCSprite *) obj2
{
    float minDistance = obj1.radius + obj2.radius;
    float dx = obj2.position.x - obj1.position.x;
    float dy = obj2.position.y - obj1.position.y;
    if (! (dx > minDistance || dy > minDistance) )
    {
        float actualDistance = sqrt( dx * dx + dy * dy );
        return (actualDistance <= minDistance);
    }
    return NO;
}

2) Box2d только для обнаружения столкновений

Я создаю тело Box2d для всех спрайтов, как показано в этом руководстве: http://www.raywenderlich.com/606/how-to-use-box2d-for-just-collision-detection-with-cocos2d-iphone

Мой вопрос прост: если мой приоритет - оптимизацияКакой подход быстрее?

Спасибо!

1 Ответ

1 голос
/ 14 октября 2011

Если все, что вам нужно, это проверка столкновений на основе расстояния / радиуса, вам не нужен физический движок.

Хотя вам следует избавиться от sqrt .Прежде всего, вы используете функцию квадратного корня, которая работает с двойными числами.Для версии с плавающей запятой используйте sqrtf .

Чтобы полностью избавиться от квадратного корня, убедитесь, что ваши объекты хранят свой радиус в квадрате (radiusSquared = radius * radius).Таким образом, вам больше не нужно брать квадратный корень:

-(BOOL) isCollidingSphere:(CCSpriteExt*) obj1 WithSphere:(CCSprite *) obj2
{
    float r1 = obj1.radius;
    float r2 = obj2.radius;
    float minDistanceSquared = r1 * r1 + r2 * r2 + 2 * r1 * r2;
    float dx = obj2.position.x - obj1.position.x;
    float dy = obj2.position.y - obj1.position.y;
    float actualDistanceSquared = dx * dx + dy * dy;
    return (actualDistanceSquared <= minDistanceSquared);
}
...