2016-02-29 1 views
0

Есть ли способ в cocos2d-x обнаружить силу столкновения? Я бы хотел сделать различные звуковые эффекты в зависимости от силы столкновения или вообще отключить звуковой эффект в некоторых случаях.Как обнаружить силу столкновения?

Например: когда я выполняю масштабное действие на моем спрайте, лежащем на земле, он начинает менять его размер каждый момент, и поэтому он мгновенно ударяет по земле. При каждом нажатии приложение воспроизводит звуковой эффект. Я хотел бы играть в нее только тогда, когда мой спрайт падает с какой-то реальной высоты.

ответ

0

Вы обнаруживаете столкновение в некоторой функции update(), не так ли? Таким образом, вам нужно запомнить позицию объекта при предыдущем вызове update(). Что-то вроде этого:

Vec2 previousPosition; 

void YourClass::update(float dt) 
{ 
    … 
    this->detectCollision(); 
    this->updatePhysics(); 
    this->makeSomethingElse(); 
    … 
} 

void YourClass::detectCollision() 
{ 
    currentPosition = yourObject->getPosition(); 
    float distance = currentPosition.getDistance(previousPosition) 
    if (obstacleRect.intersectsRect(yourObjectRect)) 
    { 
     // collide handler 
     if (distance == 0) 
      // do nothing 
     if (distance > threshold) 
      // play some sound 
    } 
    … 
    previousPosition = currentPosition; 
    … 
} 

В зависимости от расстояния между текущим и предыдущим размещением объекта можно вычислить скорость объекта и оценить его силу.
В вашем примере, когда объект сталкивается через ScaleTo, его положение стабильно, а расстояние и скорость = 0.
Если вы перемещаете объект и препятствие, расчет скорости более сложный и должен выполняться в соответствии с rules of vector addition

+0

Спасибо! Но я считаю, что это действительно сложнее, чем вы описали. Как насчет 2 объектов с разной массой, имеющих разный вектор скорости. Как я могу рассчитать силу, когда они сталкиваются? – Ksamp

+0

Конечно, если у вас есть физические тела, лучше вычислить импульс (скорость или расстояние от моего примера, умноженное на массу), а не расстояние. И если препятствие движется также, вам нужно добавить векторы. Но основной принцип тот же. – alc77