Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   API приложений и сред (http://www.flasher.ru/forum/forumdisplay.php?f=61)
-   -   [Box2D] Плавное равномерное движение (http://www.flasher.ru/forum/showthread.php?t=171213)

Altera Pars 11.11.2011 17:03

Плавное равномерное движение
 
Добрый вечер!
Есть небольшая проблемка: мой объект движется по воздействию на него силы, но мне нужно равномерное движение, движение без ускорения. Я пытаюсь сделать это вот таким образом, но получаю рывки (они и понятно):

Код AS3:

case 39 :
if (LevelVars.player.GetLinearVelocity().x <= 5) {
        direction.Set((250),0);
        LevelVars.player.WakeUp();
        LevelVars.player.ApplyForce(direction, LevelVars.player.GetPosition());
} else if (LevelVars.player.GetLinearVelocity().x >= 5) {
        LevelVars.player.ApplyForce(new b2Vec2((LevelVars.player.GetMass() * 0.8), 0), LevelVars.player.GetPosition());
}
break;

Может быть, кто-нибудь знает, как сделать ограничение скорости без вот такой вот костыльной проверки? Здесь я проверяю линейную скорость объекта, если она больше 5, тогда я применяю к объекту силу, равную силе трения. Буду признателен, если кто-нибудь мне подскажет.

goodguy 11.11.2011 17:44

Через ApplyImpulse() только.
Код AS3:

public function update():void {
        _speed                = 3;
        _direction        = _body.GetPosition().Copy();
        _direction.Subtract(_clickPoint); // движение к точке где произошел щелчок
        _direction.Normalize();
        _direction.Multiply(_speed);
        _direction.NegativeSelf();
          _body.ApplyImpulse(_direction, _body.GetPosition()); // применяем импульс
}


Altera Pars 11.11.2011 19:05

Спасибо большое. Сейчас попробую. Но я забыл указать то, что это движение происходит по нажатию на клавиши с клавиатуры. Импульс подойдет для продолжительного движения?

goodguy 11.11.2011 19:06

Ну там же нормальизация вектора. Т.е. по сути пофиг какова продолжительность, скорость все равно не будет больше 3.
Хотя такую задачу я бы лучше реализовал через SetPosition()

Altera Pars 11.11.2011 19:11

Видимо, это Box2D версией старше, чем 2.0.2)

goodguy 11.11.2011 19:40

я про 2.1а, в 2.0.2 был метод SetXForm()

GBee 11.11.2011 20:29

Может подойдет просто SetLinearVelocity?

goodguy 11.11.2011 20:38

Кстати, да! Что-то он у меня вообще из головы вылетел.

Altera Pars 13.11.2011 19:01

Есть некоторые проблемы при использовании линейной скорости. Если во время прыжка я буду нажимать на клавиши движения, чтобы стабилизировать траекторию падения в нужную мне сторону, то тогда эта траекторию сильно искажается в пользу горизонтального движения. Как будто бы тело реактивное и у него в этот момент включают турбину:)

goodguy 13.11.2011 19:22

Судя по всему там скорости суммируются. Нужно так же использовать SetLinearDamping(), чтобы тело замедлялось


Часовой пояс GMT +4, время: 09:31.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.