|
|
|||||
Регистрация: Dec 2008
Адрес: Одесса
Сообщений: 129
|
Движение авто (top-down)
Добрый вечер!
Подскажите пожалуйста как правильно задать угловую скорость? Т.е. чтобы объект не сам поворачивался, а сменил траекторию движения. Читал на сайте emanuele статью про машину, но там как то слишком сложно все сделано, т.к. у него добавлены 4 колеса и т.д., хочется понять как оно работает. Пробовал через объект на месте просто повернулся на заданный угол. Попробовал через объект стал крутится с заданной скоростью. Я так понимаю нужно через тот же ApplyForce, только рассчитать векторы х и у, но как не знаю. Прошу помощи. Код package { import flash.display.Sprite; import flash.events.Event; import flash.events.KeyboardEvent; import flash.events.MouseEvent; import Box2D.Collision.*; import Box2D.Collision.Shapes.*; import Box2D.Dynamics.*; import Box2D.Common.Math.*; import Box2D.Dynamics.Joints.*; public class Main extends Sprite { private var world:b2World = new b2World(new b2Vec2(0, 0), true); private var world_scale:int = 30; private var boxBody:b2Body; private var body_def:b2BodyDef; public function Main():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); debug_draw(); draw_box(200, 200, 50, 100); stage.addEventListener(Event.ENTER_FRAME, onEnterFrame); stage.addEventListener(KeyboardEvent.KEY_DOWN, KD); } private function onEnterFrame(e:Event):void { world.Step(1 / 30, 10, 10); world.ClearForces(); world.DrawDebugData(); } private function KD(e:KeyboardEvent):void { switch (e.keyCode) { case 37: break; break; case 39: break; break; case 38: boxBody.ApplyForce(new b2Vec2(0, -10), boxBody.GetPosition()); break; break; case 40: boxBody.ApplyForce(new b2Vec2(0, 10), boxBody.GetPosition()); break; break; } } private function debug_draw():void { var debug_draw:b2DebugDraw = new b2DebugDraw(); var debug_sprite:Sprite = new Sprite(); addChild(debug_sprite); debug_draw.SetSprite(debug_sprite); debug_draw.SetDrawScale(world_scale); debug_draw.SetFlags(b2DebugDraw.e_shapeBit); world.SetDebugDraw(debug_draw); } private function draw_box(px:int, py:int, w:int, h:int):void { body_def = new b2BodyDef(); body_def.position.Set(px / world_scale, py / world_scale); body_def.type = b2Body.b2_dynamicBody; var my_box:b2PolygonShape = new b2PolygonShape(); my_box.SetAsBox(w / 2 / world_scale, h / 2 / world_scale); var my_fixture:b2FixtureDef = new b2FixtureDef(); my_fixture.shape = my_box; boxBody = world.CreateBody(body_def); boxBody.CreateFixture(my_fixture); } } } |
|
|||||
По нажатии кнопок нужно плавно менять угол тачки (setAngle). А из этого угла вычислять вектор.
Для этого нужно вычислить скалярную скорость так: а потом тригонометрия: boxBody.ApplyForce(new b2Vec2(Math.cos(boxBody.a)*v, Math.sin(boxBody.a)*v),boxBody.GetPosition()); Т.е. при нажатии вправо-влево меняем угол, при нажатии вверх наращиваем скорость, а после всего этого применяем вышенаписанное.
__________________
Платон мне друг, но истина в вине. |
|
|||||
Регистрация: Dec 2008
Адрес: Одесса
Сообщений: 129
|
Большое спасибо, вроде работает. boxBody.a это имеется ввиду ускорение или скорость?
|
|
|||||
Я имел в виду угол поворота машинки, не знаю какой там в box2d параметр.
__________________
Платон мне друг, но истина в вине. |
|
|||||
Регистрация: Dec 2008
Адрес: Одесса
Сообщений: 129
|
не в боксе методы работают, а бокс как то по другому себя ведет что ли, вобщем запутался я..
Кто может помочь, очень хочется понять эту штуковину, есть несколько вопросов по box2d as3, готов за каждый решенный вопрос заплатить 1$ |
Часовой пояс GMT +4, время: 13:00. |
|
« Предыдущая тема | Следующая тема » |
Теги |
box2d , car , vehicle , движение автомобиля |
|
|