Расчитать начальные координаты пули

220
20 декабря 2017, 22:43

Пишу 2d игру с видом сверху. Как рассчитать начальные координаты пули, которая должна быть на конце ствола? Т.к. использую box2d игрок имеет форму круга, изначально использовал такую формулу:
pos - позиция, raduis - радиус тела игрока, rot - поворот (уже известен)
pos.x + radius * Math.cos(rot)
pos.y + radius * Math.sin(rot)
Но пули появлялись в плотную от игрока и происходила коллизиция, т.е. игрок попадал сам в себя. Как сделать, что бы пуля появлялась "на конце ствола" и был правильный вылет. Можете ответить на любом языке, мне только формула нужна.

Answer 1

В box2D есть встроенная поддержка фильтрации столкновений. Фильтрация имеет две ступени

  • разделение на группы: объекты, принадлежащие разным группам не сталкиваются; следует использовать, когда объекты полностью независимы;
  • разделение внутри группы по 16-битной маске: каждому объекту присваивается маска категории, к которой он принадлежит (обычно 1 бит), и маска категории объектов, с которыми он должен сталкиваться; следует использовать, когда объекты не должны сталкиваться между собой, но могут сталкиваться с некоторым третьим объектом.

Ваша ситуация скорее подпадает под 2 категорию - пули и игрок не должны сталкиваться между собой однако и пули, и игрок должны сталкиваться со стенками.

Задавать эти параметры можно при создании fixture, например:

int16 const main_group_id{1};
uint16 const flag_wall{0x0001};
uint16 const flag_player{0x0002};
uint16 const flag_bullet{0x0004};
b2FixtureDef wall_fixture_def;
wall_fixture_def.filter.categoryBits = flag_wall; // что такое
wall_fixture_def.filter.maskBits = flag_player | flag_bullet; // с кем сталкиваться
wall_fixture_def.filter.groupIndex = main_group_id;
b2Fixture * p_wall_fixture = p_wall_body->CreateFixture(&wall_fixture_def);
b2FixtureDef player_fixture_def;
player_fixture_def.filter.categoryBits = flag_player; // что такое
player_fixture_def.filter.maskBits = flag_wall; // с кем сталкиваться
player_fixture_def.filter.groupIndex = main_group_id;
// create player fixtures...
b2FixtureDef bullet_fixture_def;
bullet_fixture_def.filter.categoryBits = flag_bullet; // что такое
bullet_fixture_def.filter.maskBits = flag_wall; // с кем сталкиваться
bullet_fixture_def.filter.groupIndex = main_group_id;
// create bullet fixtures...

Или позже посредством метода b2Fixture::SetFilterData.

READ ALSO
Как перевести INT в PCHAR в режиме ядра Windows?

Как перевести INT в PCHAR в режиме ядра Windows?

Как перевести INT в PCHAR в режиме ядра Windows ? Я знаю как перевести в обычной проге но вот в режиме ядра (написания драйвера) не знаю получиться...

150
N случайных элементов из std::set

N случайных элементов из std::set

Есть std::set минимум из N элементовКак выбрать N разных случайных?Порядок любой

216
C++ Умный указатель

C++ Умный указатель

Всем приветВ общем дали мне задание, связанное с сортировкой методом шейкере используя пользовательские типы fraction и data

199
Можна ли реализовать кучу через список?

Можна ли реализовать кучу через список?

Я думаю что нельзяТак как в куча имеет хедер в котором есть(свободный ли блок и сколько байт в нему)

297