Движение весла с помощью Box2D - PullRequest
0 голосов
/ 03 января 2011

Я создаю игру наподобие Арканоида и для перемещения корабля мышью я использую следующий код:

var mousex:int = costume.stage.mouseX;
if (mousex < paddleWidth/2)
    mousex = paddleWidth/2;
else if (mousex > PhysiVals.STAGE_WIDTH - paddleWidth/2)
    mousex = PhysiVals.STAGE_WIDTH - paddleWidth / 2;

var idealLocation:Point = new Point(mousex, ypos);

var directionToTravel:b2Vec2 = new b2Vec2((idealLocation.x -> costume.x) * PhysiVals.paddleSpeed, idealLocation.y-costume.y);

directionToTravel.Multiply(1 / PhysiVals.RATIO);

directionToTravel.Multiply(30);

body.SetLinearVelocity(directionToTravel);

Там все идет хорошо!Весло движется так, как должно!Проблема в том, что я хочу немного наклониться к направлению его движения, и когда он перестанет двигаться, угол наклона должен стать нулевым.Я пытался играть с угловой скоростью, но понятия не имею, как это сделать!Поэтому, пожалуйста, помогите!

1 Ответ

1 голос
/ 06 января 2011

Угловая скорость тела - это скорость его вращения, и, если я правильно помню, Box2D измеряет ее в радианах / секунду. Поэтому, если вы установите его на 1, вы увидите медленное вращение.

body.SetAngularVelocity(1);

(Если вы этого не сделаете, это может означать, что я ошибаюсь в единицах, или это может означать, что у вас есть ограничение на тело, препятствующее его вращению.)

Однако звучит так, будто вы хотите, чтобы тело двигалось под определенным углом. Существует функция SetXForm, которая позволяет вам указать новую позицию и угол, но если вы будете использовать ее, вы будете связываться с системой контактов, и Box2D не будет использовать ее, если элемент действительно не телепортировался с места на место.

Ваше весло не делает этого, так что, возможно, вы могли бы попробовать это.

body.SetAngularVelocity((targetAngle - body.GetAngle()) * x);

x здесь константа, которая контролирует скорость вращения. Установка его в FPS клипа заставит тело щелкнуть в пределах кадра под прямым углом. Установка его ниже приведет к более медленному и плавному повороту на требуемый угол, но также сделает вращение тела более восприимчивым к воздействию при контакте с другими телами.

Тот же трюк работает, чтобы переместить тело в заданное целевое местоположение, но он более многословен:

var delta:b2Vec2 = new b2Vec2(target.x, target.y);
delta.Subtract(body.GetPosition());
delta.Multiply(x);
body.SetLinearVelocity(delta);

Само собой разумеется, что ни один из них не будет работать, если на пути препятствует движению какое-то другое статическое тело. Кроме того, используя любой из них, вы перезаписываете угловые / линейные скорости, которые генерирует Box2D, что означает, что вы идете вразрез с имитацией.

предостережение: код не тестировался и был записан из памяти

...