Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Регистрация Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > API приложений и сред

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 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);
		}
	}
}

Старый 10.01.2011, 15:52
sinya вне форума Посмотреть профиль Отправить личное сообщение для sinya Посетить домашнюю страницу sinya Найти все сообщения от sinya
  № 2  
Ответить с цитированием
sinya
 
Аватар для sinya

Регистрация: Apr 2003
Адрес: Ukraine, Kiev
Сообщений: 189
Отправить сообщение для sinya с помощью ICQ
По нажатии кнопок нужно плавно менять угол тачки (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.
Т.е. при нажатии вправо-влево меняем угол, при нажатии вверх наращиваем скорость, а после всего этого применяем вышенаписанное.
__________________
Платон мне друг, но истина в вине.

Старый 11.01.2011, 02:44
Ralph_DiMarko вне форума Посмотреть профиль Отправить личное сообщение для Ralph_DiMarko Найти все сообщения от Ralph_DiMarko
  № 3  
Ответить с цитированием
Ralph_DiMarko
 
Аватар для Ralph_DiMarko

Регистрация: Dec 2008
Адрес: Одесса
Сообщений: 129
Большое спасибо, вроде работает. boxBody.a это имеется ввиду ускорение или скорость?

Старый 11.01.2011, 06:18
sinya вне форума Посмотреть профиль Отправить личное сообщение для sinya Посетить домашнюю страницу sinya Найти все сообщения от sinya
  № 4  
Ответить с цитированием
sinya
 
Аватар для sinya

Регистрация: Apr 2003
Адрес: Ukraine, Kiev
Сообщений: 189
Отправить сообщение для sinya с помощью ICQ
Я имел в виду угол поворота машинки, не знаю какой там в box2d параметр.
__________________
Платон мне друг, но истина в вине.

Старый 13.01.2011, 02:48
Ralph_DiMarko вне форума Посмотреть профиль Отправить личное сообщение для Ralph_DiMarko Найти все сообщения от Ralph_DiMarko
  № 5  
Ответить с цитированием
Ralph_DiMarko
 
Аватар для Ralph_DiMarko

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

Создать новую тему Ответ Часовой пояс GMT +4, время: 15:58.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Теги
box2d , car , vehicle , движение автомобиля
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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