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

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 27.12.2007, 22:19
Freeeeeeeman вне форума Посмотреть профиль Отправить личное сообщение для Freeeeeeeman Найти все сообщения от Freeeeeeeman
  № 1  
Ответить с цитированием
Freeeeeeeman
[+4 05.12.07]
[+1 11.01.08]

Регистрация: Nov 2007
Сообщений: 51
По умолчанию Box2D Flash AS3 -кто нибудь знаком?

Всем доброго времени суток.
Делаю игру на основе готового физического движка Box2d Flash as3 port.
Есть некоторые затруднения. Кто-нибудь знаком с ним?
Не получается сделать отнятие здоровья при collisions, да и вообще я даже класс не могу найти откуда можно столкновения прослеживать.
Кто-нибудь сталкивался с подобными проблемами, на подобном движке?

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

Регистрация: Aug 2006
Адрес: Мюнхен
Сообщений: 509
Отправить сообщение для enepx с помощью ICQ Отправить сообщение для enepx с помощью Yahoo Отправить сообщение для enepx с помощью Skype™
я просто начинал недавно разбираться с этой библиотекой для общего образования, конечно не доходило до таких тонкостей, но там есть большой хелп, в котором описываются все возможности. там я что-то видел про столкновения.

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

Регистрация: Apr 2006
Сообщений: 165
Отправить сообщение для artfabrique с помощью ICQ
мне кажется нада расширять класс какойнить и при колизии диспатцить эвент а классом который отвечает за геймплей подписываться на этот эвент.
__________________
To beer or no to beer?
That is the question...

Старый 29.12.2007, 12:28
Freeeeeeeman вне форума Посмотреть профиль Отправить личное сообщение для Freeeeeeeman Найти все сообщения от Freeeeeeeman
  № 4  
Ответить с цитированием
Freeeeeeeman
[+4 05.12.07]
[+1 11.01.08]

Регистрация: Nov 2007
Сообщений: 51
В принципе колижн у меня уже вызывает функцию столкновения двух тел с ссылками на эти тела:b2Body, теперь хочу узнать как вычислять силу с которой они столкнулись. Не подскажите?

Вот все паблик переменные в классе b2Body:
Код:
public var m_flags:uint;
	
	public var m_position:b2Vec2 = new b2Vec2();	// center of mass position
	public var m_rotation:Number;
	public var m_R:b2Mat22 = new b2Mat22(0);
	
	// Conservative advancement data.
	var m_position0:b2Vec2 = new b2Vec2();
	var m_rotation0:Number;

	public var m_linearVelocity:b2Vec2;
	public var m_angularVelocity:Number;

	public var m_force:b2Vec2;
	public var m_torque:Number;

	public var m_center:b2Vec2;	// local vector from client origin to center of mass

	public var m_world:b2World;
	public var m_prev:b2Body;
	public var m_next:b2Body;

	public var m_shapeList:b2Shape;
	public var m_shapeCount:int;

	public var m_jointList:b2JointNode;
	public var m_contactList:b2ContactNode;

	public var m_mass:Number;
	public var m_invMass:Number;
	public var m_I:Number;
	public var m_invI:Number;
	
	public var  m_linearDamping:Number;
	public var  m_angularDamping:Number;

	public var m_sleepTime:Number;

Делал так:
Паблик переменные:
Код:
m_Hcoeff=0.5;//коэфицент повреждений
m_Hcoeff2=0.01; //второй коэфицент повреждений значения скорости очень велики, поэтому надо умножать на маленькие числа
m_minDamage=0.4;//мин. повреждение
m_health=100;//жизни
m_maxDamage=100;//макс. возможное повреждение
А это сама функциа котораю вычисляет, сколько жизняков отнимать(она довольно глупа, но кое-как работает):
Код:
public function collide(body1:b2Body,body2:b2Body) {
			var body2Vel=Math.sqrt(body2.m_linearVelocity.x * body2.m_linearVelocity.x) + Math.sqrt(body2.m_linearVelocity.y * body2.m_linearVelocity.y); 
                         //^^^ сумма x-скорости тела1 и y-скорости тела1, квадраты и корни тут, чтобы были только положительные числа.

			var body1Vel=Math.sqrt(body1.m_linearVelocity.x * body1.m_linearVelocity.x) + Math.sqrt(body1.m_linearVelocity.y * body1.m_linearVelocity.y);
                       //^^^ аналогично, к телу 2.
			var allVelocity=body2Vel + body1Vel;// суммарная скорость двух тел.
			var damage=allVelocity * m_Hcoeff * m_Hcoeff2;//тут всё ясно
			if (damage > m_minDamage && damage < m_maxDamage) {
				m_health-= damage;//отнимаем жизни
			} else if (damage > m_minDamage && damage > m_maxDamage) {
				m_health-= m_maxDamage;//отнимаем максимально возможное кол-во жизней
			}
		}
В итоге: впринципе нормально, но если тело с большой скоростью катиться по полу, то здоровье довольно быстро сгорает.
И ещё наблюдаются баги в столкновении с много-шэйповыми телами(когда пролетает рядом с предметом).
Если не показывать жизни то человек и не заметит этих багов(ИМХО).

Мне ясно, что повреждения считать надо не так,как я это делаю, хочу сделать чтоб всё было реально, помогите с силами столковений разобраться.


Вообщем вот мой откомпилированный проект(flash player 9, тела можно тягать мышой, Space-взрыв на месте мыши, здоровье над телом):
Вложения
Тип файла: rar Test.rar (46.8 Кб, 132 просмотров)


Последний раз редактировалось Freeeeeeeman; 29.12.2007 в 12:51.
Старый 29.12.2007, 12:54
artfabrique вне форума Посмотреть профиль Отправить личное сообщение для artfabrique Найти все сообщения от artfabrique
  № 5  
Ответить с цитированием
artfabrique
 
Аватар для artfabrique

Регистрация: Apr 2006
Сообщений: 165
Отправить сообщение для artfabrique с помощью ICQ
ну на сколько я знаю бокс2д это твердотельный движок.
Там у предметов есть масса и кинетическая энергия, я думаю хелсы нада расчитывать исходя из этого, примера ща нету(на работе) - вечером разбираться буду - тоже хочу к двиглу для гамесов бокс2д прикрутить
__________________
To beer or no to beer?
That is the question...

Старый 29.12.2007, 13:48
Freeeeeeeman вне форума Посмотреть профиль Отправить личное сообщение для Freeeeeeeman Найти все сообщения от Freeeeeeeman
  № 6  
Ответить с цитированием
Freeeeeeeman
[+4 05.12.07]
[+1 11.01.08]

Регистрация: Nov 2007
Сообщений: 51
Да, бокс2d твердотельный.
Чтобы правильно просчитать дамадж, надо найти импульс тела, который прилагается к другому телу а не allVelocity, которую а высчитал.
Может надо m_linearVelocity на массу умножать и ещё каким-то образом расчитать на данный угол приложения силы?
Как это сделать? Any ideas?

Старый 29.12.2007, 15:31
undefined вне форума Посмотреть профиль Отправить личное сообщение для undefined Найти все сообщения от undefined
  № 7  
Ответить с цитированием
undefined

Регистрация: Oct 2006
Сообщений: 2,282
по идеи повреждения (убыль хэлсов) должны быть пропорциональны модулю разности скоростей точек столкновения тел. Т.е. как я понял ты учитываешь только скорости движения центров масс двух тел, но эти тела-то еще крутятся, следовательно надо к импульсу поступательного движения добавлять еще импульс вращательного.
алгоритм:
1) установить факт столкновения
2) посчитать линейные скорости точек столкновения как
v1 = body1.m_linearVelocity + body1.m_angularVelocity*2PI*r1
v2 = body2.m_linearVelocity + body2.m_angularVelocity*2PI*r2
где r* - еденичные вектора направленные по касательной к окружности радиусом
|m_position - точка_столкновения| и центром в m_position. Считается это все через векторное произведение.
3) помножить скорости на массы, коэффициенты жесткости и т.д.
4) вычесть одно из другого и найти длину результирующего вектора, полученная величина определит силу удара.


Последний раз редактировалось undefined; 29.12.2007 в 15:53.
Старый 29.12.2007, 21:12
Freeeeeeeman вне форума Посмотреть профиль Отправить личное сообщение для Freeeeeeeman Найти все сообщения от Freeeeeeeman
  № 8  
Ответить с цитированием
Freeeeeeeman
[+4 05.12.07]
[+1 11.01.08]

Регистрация: Nov 2007
Сообщений: 51
Цитата:
где r* - еденичные вектора направленные по касательной к окружности радиусом
|m_position - точка_столкновения| и центром в m_position. Считается это все через векторное произведение.
как это сделать?
А к квадратам и др. некруглым телам тоже самое? У них вроде касательной нет.
Цитата:
body2.m_linearVelocity + body2.m_angularVelocity
body2.m_linearVelocity это вектор, к нему просто так не прибавишь. Наверно надо
Код:
body2.m_linearVelocity.x + body2.m_angularVelocity
body2.m_linearVelocity.y + body2.m_angularVelocity
Так или я во что-то не врубаюсь?


Цитата:
где r* - еденичные вектора направленные по касательной к окружности радиусом
|m_position - точка_столкновения| и центром в m_position. Считается это все через векторное произведение.
Это так чтоли?
И как его высчитать?
Изображения
 


Последний раз редактировалось Freeeeeeeman; 29.12.2007 в 22:57.
Старый 29.12.2007, 22:57
undefined вне форума Посмотреть профиль Отправить личное сообщение для undefined Найти все сообщения от undefined
  № 9  
Ответить с цитированием
undefined

Регистрация: Oct 2006
Сообщений: 2,282
Цитата:
как это сделать?
обозначим:
body1.m_position - координата центра масс 1-го тела, вектор
body2.m_position - координата центра масс 2-го тела, вектор
col_position - координата точки столкновения, вектор
body*.m_linearVelocity - линейная скорость центра масс, вектор
body*.m_angularVelocity - угловая скорость тела, число
Код:
//посчитаем 2 вспомогательных вектора
m1.x=body1.m_position.x-col_position.x;
m1.y=body1.m_position.y-col_position.y;
m2.x=body2.m_position.x-col_position.x;
m2.y=body2.m_position.y-col_position.y;
//теперь посчитаем линейные скорости тел в точке удара
//вклад от вращательного движения
v1.x=m1.y*body1.m_angularVelocity*2*Math.PI;
v1.y=-m1.x*body1.m_angularVelocity*2*Math.PI;
v2.x=m2.y*body2.m_angularVelocity*2*Math.PI;
v2.y=-m2.x*body2.m_angularVelocity*2*Math.PI;
//вклад от поступательного движения
v1.x+=body1.m_linearVelocity.x;
v1.y+=body1.m_linearVelocity.y;
v2.x+=body2.m_linearVelocity.x;
v2.y+=body2.m_linearVelocity.y;
//импульсы тел считаем как-будто вся масса тел сосредоточена в точке удара
p1.x=v1.x*body1.m_mass;
p1.y=v1.y*body1.m_mass;
p2.x=v2.x*body2.m_mass;
p2.y=v2.y*body2.m_mass;
//и наконец сила удара
health=Math.sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
код писал не проверяя, так что могут быть ошибки.
Цитата:
А к квадратам и др. некруглым телам тоже самое? У них вроде касательной нет.
Касательная строится не к форме тела, а к окружности с центром в центре масс тела и проходящей через точку столкновения (см. рисунок)
Изображения
 

Старый 29.12.2007, 23:05
undefined вне форума Посмотреть профиль Отправить личное сообщение для undefined Найти все сообщения от undefined
  № 10  
Ответить с цитированием
undefined

Регистрация: Oct 2006
Сообщений: 2,282
Блин сейчас прикинул, намудрил похоже я, попроще можно.
Сила удара должна быть пропорциональна количеству переданной кинетеческой энергии, т.е. достаточно посчитать кин. энергию тела до столкновения и после, их разница даст силу удара. Только кин. энергию надо считать для одного тела учавствующего в столкновении, потому как суммарная энергия обоих тел меняться не должна.
Энергия тела считается, кажется, так:
Код:
var n_linearVelocity=Math.sqrt(m_linearVelocity.x*m_linearVelocity.x+m_linearVelocity.y*m_linearVelocity.y);
E = m_mass*n_linearVelocity*n_linearVelocity*0.5 + m_I*m_angularVelocity*m_angularVelocity*0.5;


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

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

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


 


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


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