![]() |
|
||||||||||
|
|||||
|
[+4 05.12.07]
[+1 11.01.08] Регистрация: Nov 2007
Сообщений: 51
|
Всем доброго времени суток.
Делаю игру на основе готового физического движка Box2d Flash as3 port. Есть некоторые затруднения. Кто-нибудь знаком с ним? Не получается сделать отнятие здоровья при collisions, да и вообще я даже класс не могу найти откуда можно столкновения прослеживать. Кто-нибудь сталкивался с подобными проблемами, на подобном движке? |
|
|||||
|
я просто начинал недавно разбираться с этой библиотекой для общего образования, конечно не доходило до таких тонкостей, но там есть большой хелп, в котором описываются все возможности. там я что-то видел про столкновения.
|
|
|||||
|
мне кажется нада расширять класс какойнить и при колизии диспатцить эвент а классом который отвечает за геймплей подписываться на этот эвент.
__________________
To beer or no to beer? That is the question... |
|
|||||
|
[+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-взрыв на месте мыши, здоровье над телом): Последний раз редактировалось Freeeeeeeman; 29.12.2007 в 12:51. |
|
|||||
|
ну на сколько я знаю бокс2д это твердотельный движок.
Там у предметов есть масса и кинетическая энергия, я думаю хелсы нада расчитывать исходя из этого, примера ща нету(на работе) - вечером разбираться буду - тоже хочу к двиглу для гамесов бокс2д прикрутить
__________________
To beer or no to beer? That is the question... |
|
|||||
|
[+4 05.12.07]
[+1 11.01.08] Регистрация: Nov 2007
Сообщений: 51
|
Да, бокс2d твердотельный.
Чтобы правильно просчитать дамадж, надо найти импульс тела, который прилагается к другому телу а не allVelocity, которую а высчитал. Может надо m_linearVelocity на массу умножать и ещё каким-то образом расчитать на данный угол приложения силы? Как это сделать? Any ideas? |
|
|||||
|
Регистрация: 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. |
|
|||||
|
[+4 05.12.07]
[+1 11.01.08] Регистрация: Nov 2007
Сообщений: 51
|
Цитата:
А к квадратам и др. некруглым телам тоже самое? У них вроде касательной нет. Цитата:
body2.m_linearVelocity.x + body2.m_angularVelocity body2.m_linearVelocity.y + body2.m_angularVelocity Цитата:
И как его высчитать? Последний раз редактировалось Freeeeeeeman; 29.12.2007 в 22:57. |
|
|||||
|
Регистрация: 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)); Цитата:
|
|
|||||
|
Регистрация: Oct 2006
Сообщений: 2,282
|
Блин сейчас прикинул, намудрил похоже я, попроще можно.
Сила удара должна быть пропорциональна количеству переданной кинетеческой энергии, т.е. достаточно посчитать кин. энергию тела до столкновения и после, их разница даст силу удара. Только кин. энергию надо считать для одного тела учавствующего в столкновении, потому как суммарная энергия обоих тел меняться не должна. Энергия тела считается, кажется, так: Последний раз редактировалось undefined; 29.12.2007 в 23:15. |
![]() |
![]() |
Часовой пояс GMT +4, время: 10:32. |
|
|
« Предыдущая тема | Следующая тема » |
|
|