Форум Flasher.ru

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

Ralph_DiMarko 10.01.2011 00:29

Движение авто (top-down)
 
Добрый вечер!
Подскажите пожалуйста как правильно задать угловую скорость? Т.е. чтобы объект не сам поворачивался, а сменил траекторию движения. Читал на сайте emanuele статью про машину, но там как то слишком сложно все сделано, т.к. у него добавлены 4 колеса и т.д., хочется понять как оно работает.

Пробовал через
Код AS3:

boxBody.SetAngle()

объект на месте просто повернулся на заданный угол.

Попробовал через
Код AS3:

boxBody.SetAngularVelocity

объект стал крутится с заданной скоростью.

Я так понимаю нужно через тот же ApplyForce, только рассчитать векторы х и у, но как не знаю. Прошу помощи.
Код
Код AS3:

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);
                }
        }
}


sinya 10.01.2011 15:52

По нажатии кнопок нужно плавно менять угол тачки (setAngle). А из этого угла вычислять вектор.
Для этого нужно вычислить скалярную скорость так:
Код:

var v = Math.sqrt(boxBody.vx*boxBody.vx + boxBody.vy*boxBody.vy)
а потом тригонометрия:
Код:

boxBody.ApplyForce(new b2Vec2(Math.cos(boxBody.a)*v, Math.sin(boxBody.a)*v),boxBody.GetPosition());
Ну или не ApplyForce, а напрямую vx и vy менять, а то я не в курсе, как оно в box2D.
Т.е. при нажатии вправо-влево меняем угол, при нажатии вверх наращиваем скорость, а после всего этого применяем вышенаписанное.

Ralph_DiMarko 11.01.2011 02:44

Большое спасибо, вроде работает. boxBody.a это имеется ввиду ускорение или скорость?

sinya 11.01.2011 06:18

Я имел в виду угол поворота машинки, не знаю какой там в box2d параметр.

Ralph_DiMarko 13.01.2011 02:48

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


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

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