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);
}
}
}
Подскажите пожалуйста как правильно задать угловую скорость? Т.е. чтобы объект не сам поворачивался, а сменил траекторию движения. Читал на сайте 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);
}
}
}