Как применить силу, которая не должна быть непрерывной - PullRequest
2 голосов
/ 15 апреля 2010

У меня есть тело, которое я двигаю с помощью кнопки, вот что я делаю:

-(void) step: (ccTime) delta
{
  int steps = 2;
  CGFloat dt = delta/(CGFloat)steps;

  for(int i=0; i<steps; i++){
    cpSpaceStep(space, dt);
  }
  cpSpaceHashEach(space->activeShapes, &eachShape, nil);
  cpSpaceHashEach(space->staticShapes, &eachShape, nil);


  if(MoveBody)  
  {     
    cpFloat movementPadding = 0.1;
    cpBodyApplyForce(body, 
    cpvmult(ccp( 10, 0), movementPadding), cpvzero);   
  }
  else
    cpBodyResetForces(body);
}

Я просто хочу остановить движение тела всякий раз, когда условие не выполняется. Я пытаюсь сбросить все силы до 0 с помощью cpBodyResetForces(body), но это никогда не работает - оно просто продолжает двигаться.

Как я могу остановить движение тела?

Ответы [ 2 ]

1 голос
/ 22 марта 2011

Если вы прочтете некоторые базовые физические положения, вы вспомните, что, просто сбросив все силы на ноль - и если нет трения - тело будет продолжать двигаться вечно.Вам нужно либо добавить трение в пространство, в котором движется тело, либо убить первоначальную силу и применить силу в направлении в противоположном направлении , пока тело не остановится - ТОГДА убейте ВСЕ силы.

Использование физического движка может быть очень эффективным способом сделать это, но я просто изучаю все это сам - надеюсь, это полезно!

ура!

0 голосов
/ 18 февраля 2014

Причина, по которой объект движется, связана с его импульсом. Чтобы объект автоматически останавливался, вам нужно установить демпфирование пространства больше 0. Из документов:

> cpFloat cpSpaceGetDamping(const cpSpace *space) void
> cpSpaceSetDamping(cpSpace *space, cpFloat value) 

Количество простого демпфирования, применяемого к пространству. Значение 0,9 означает, что каждое тело потеряет 10% своей скорости в секунду. По умолчанию 1. Как гравитация может быть переопределено для каждого тела.

...