2016-04-29 9 views
0

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

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

}BoundingBox; 

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

.cpp:

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

Что значит "не работает" означает в этом контексте? Будьте осторожны с простыми испытаниями в полевых коробках в физике. Для них возможно идти прямо друг к другу, если скорость равна размеру коробки. – Robinson

+0

Я бы поставил в вашей функции некоторые утверждения cout, которые проверяют наличие конфликтов, чтобы узнать, какие цифры вы получаете, и посмотрите, действительно ли ваши операторы if верны. Вы делаете преобразования на самих частицах? Если это так, проверьте, чтобы ваши преобразования также применялись к ограничивающим прямоугольникам – element11

ответ

0

Предполагая, что снижение Х означает идти в направлении влево и уменьшения 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)); 

Be:

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