Показать сообщение отдельно
Старый 10.01.2011, 00:29
Ralph_DiMarko вне форума Посмотреть профиль Отправить личное сообщение для Ralph_DiMarko Найти все сообщения от Ralph_DiMarko
  № 1  
Ответить с цитированием
Ralph_DiMarko
 
Аватар для Ralph_DiMarko

Регистрация: Dec 2008
Адрес: Одесса
Сообщений: 129
По умолчанию Движение авто (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);
		}
	}
}