Предлагаю обсудить проблемы и решения по созданию игры на IrrLicht
Доброе время суток. Помогите плиз. Я делаю игру РПГ... Сделал человечка, уровень, анимацию. Все здорово... начвал делать атаку и оказалась что нуна как бы смешивать анимацию атаки и бега... irr::scene::ISceneNode *node1=node->getXJointNode("Spine"); Без результатов(... можно ли как заставить ноги бегать а руки атаковать? спс
И еще одна проблема, коллизии. Объявил глобальную переменную scene::ITriangleSelector* selector = 0;
в классе Entity вот:
scene::ISceneNodeAnimator* anim =
irrScene->createCollisionResponseAnimator(selector, node, core::vector3df(10,1,10),
core::vector3df(0,-3,0),
core::vector3df(0,0,0));
node->addAnimator(anim);
anim->drop();
и в классе Object:
selector = irrScene->createOctTreeTriangleSelector(mesh->getMesh(0),node, 32);
node->setTriangleSelector(selector);
selector->drop();
Все работает... Но нуна чтобы Entity между собой тоже коллизили... пробывал код из класса Object коллизия ваще исчезает(
Почаму-то токо на одном обьекте столкновения проверяются.
вот кстати моя игрулька
На сколько мне известно Иррлихт не поддерживает блендинг анимацию, то есть смешение.
А насчет коллизий надо для каждого делать свой аниматор.
createCollisionResponseAnimator(selector, //хранит полигоны с какими должен сталкивать, node, //какой нод должен сталкиваться, допустим герой core::vector3df( 10,1,10), //размер элипсойда вокруг нода для столкновений core::vector3df( 0,-3,0), //гравитаци, по законам физики должно быть -9.8 core::vector3df( 0,0,0)); //это я так понял положение элипсойда относительно нода
То есть для всего что с чем должно сталкиваться ты делаешь свой селектор. Чтобы допустим NPC сталкивались с героем надо и для героя и для NPC делать свой селектор, только для них уже из BoundingBox. Все селекторы добавляешь в метатрианглселектор. Далее создаешь для каждого нода свой аниматор столкновений. Только вместо первого параметра createCollisionResponseAnimator будет уже не селектор одного объекта, а метатрианглселектор, хранящий информацию о всех селекторах в него добавленных. Второй параметр будет тот нод который должен сталкиваться.
Это единственный способ который мне известен :)
Спасибо все запахало!!! Метаселектор рулит.
А как поступить с анимацией? создавать отдельные анимации атака, атака + бег, вытажить оружие, вытащить оружие на бегу и т.д. нереально ... а если так не делать игра будет не интересной... типа подходиш останавливаешся ударяеш птом снова идеш, экшена нету( .... я думал мб разделить тело с ногами...
можно ли заставить двигатся рот во время диалогов с помощью этого irr::scene::ISceneNode *node1=node->getXJointNode("Spine");?
Насчет одновременной атаки и бега у меня одна только мысль. Разделить меш. То есть ноги отделить от всего остального. Во время движения ты управляешь ногами, а все остальное движется за ними. Так можно независимо управлять анимацией обоих частей. В некоторых РПГ тоже отделяют части тела для удобства. Например в Готике головы отдельно от туловища всегда в ресурсах.
здравая мысль, в Alien Shoter тоже модель разбита на ноги и торс
Хм... но тода еще одна проблема... будут Швы! щаз пробывал сделать... Ноги активно перемещаются... а торс атаковал... получились Швы... =( Несовместимо...
Так швы то можно внутрь спрятать или в то место куда не заглядывает камера. Это зависит от того места где ты его разделишь.
Насчет швов - сделать так
Туловище - |-------------|
| |
| |
|------------- |
| | | | | |
| | | | | |
| | | |
Ноги - | | | |
| | | |
----------- ----------
Ноги втыкаешь под рубашку или кофту персонажа чуть глубже, как под колпак, чтобы рубашка швы прикрывала :)
Рисую плохо но суть думаю понятна ;)
ша работаю с NPC классами... проблема. как определить на сколько нужно повернутся чтобы найти меня(игрока)... (аналог процедуры на блитзе DeltaYaw() ).?
\
\
\
а - - - - б
Как то так)) точка "а" должна определить угол чтобы повернутся на "б"... допустим тута "+120" или "-240" значение =)
вроде так
f32 getRotateAngle(vector3df base, vector3df target) { vector3df direction = target - base; return ( -atan2( direction.Z, direction.X) * irr::core::RADTODEG ); }
Тема в архиве.