физика — Ограничительная рамка для системы частиц C ++ не работает

Я создал систему частиц в C ++, используя Qt, который включает в себя гравитацию. Я хотел бы включить ограничивающий прямоугольник, чтобы система могла также включать столкновения, однако я не могу заставить его работать. Вот мой код .h:

typedef struct {
int top;
int bottom;
int left;
int right;

}BoundingBox;

BoundingBox makeBoundingBox(int top, int bottom, int left, int right);

.каст:

BoundingBox makeBoundingBox(int top, int bottom, int left, int right)
{
BoundingBox boundingBox;
boundingBox.top = top;
boundingBox.bottom = bottom;
boundingBox.left = left;
boundingBox.right = right;

return boundingBox;
}

Затем я обновил ограничивающую рамку в своем классе эмиттера, используя этот цикл:

for(int i=0; i<m_numParticles; ++i)
{

if (m_pos.m_y >= _boundingBox.top)
{
m_dir.m_y = (-1)*(m_dir.m_y);
}

if (m_pos.m_y <= _boundingBox.bottom)
{
m_dir.m_y = (-1)*(m_dir.m_y);
}

if (m_pos.m_x <= _boundingBox.left)
{
m_dir.m_x = (-1)*(m_dir.m_x);
}

if (m_pos.m_x >= _boundingBox.right)
{
m_dir.m_x = (-1)*(m_dir.m_x);
}

m_particles[i].update(m_gravity, _boundingBox);

И установил ограничивающую рамку в моем окне так:

m_emitter->setBoundingBox(makeBoundingBox(m_height, 0, 0, m_width));

Я не получаю никаких ошибок, но, похоже, это не работает,
Любой совет будет принят во внимание
Спасибо

0

Решение

Если предположить, что уменьшение X означает движение влево, а уменьшение Y — движение вверх, ваши условия кажутся неверными. Я также обновил бы позицию наряду со скоростью, чтобы она не запускалась несколько раз подряд.

Пример для координаты Y:

// Are we going up too much?
if (m_pos.m_y < _boundingBox.top)
{
m_dir.m_y = (-1)*(m_dir.m_y);
m_pos.m_y = _boundingBox.top + 1;
}
// Or are we going down too much?
else if (m_pos.m_y > _boundingBox.bottom)
{
m_dir.m_y = (-1)*(m_dir.m_y);
m_pos.m_y = _boundingBox.bottom - 1;
}
0

Другие решения

Не должны:

m_emitter->setBoundingBox(makeBoundingBox(m_height, 0, 0, m_width));

Быть:

m_emitter->setBoundingBox(makeBoundingBox(0, m_height, 0, m_width));
0

По вопросам рекламы [email protected]