PDA

Просмотр полной версии : [Box2D] Движение авто (top-down)


Ralph_DiMarko
10.01.2011, 00:29
Добрый вечер!
Подскажите пожалуйста как правильно задать угловую скорость? Т.е. чтобы объект не сам поворачивался, а сменил траекторию движения. Читал на сайте emanuele статью про машину, но там как то слишком сложно все сделано, т.к. у него добавлены 4 колеса и т.д., хочется понять как оно работает.

Пробовал через boxBody.SetAngle() объект на месте просто повернулся на заданный угол.

Попробовал через boxBody.SetAngularVelocity объект стал крутится с заданной скоростью.

Я так понимаю нужно через тот же 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);
}
}
}

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$ :)