### Flocking/Swarming Algorithm help

I'm trying to implement the flocking algorithm in C++.
All the tutorials I've visited are full of dead links or old information so aren't helping :/

I've tried to implement it myself by making all the particles 'home-in' on the player. When 2 particles then collide within their larger bounding boxes they home-in to each other. And when the 2 particles are actually touching they repel each other until they are outside of their bounding boxes and find another particle to home-into.

In theory, I think I understand it but when I run my application the particles all home into the player and come to a stand still along the Y-axis above the player.

I do apologise for the horrendous code.
All the particles in question are stored in a Vector, with a pos and velocity.

 ``123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114`` ``````for(int i = 0; i < swarm.size(); i++) { for (int j = 0; j < swarm.size(); j++) { if (swarm.at(i)->getParticleModel()->getPosition().x < gameObjects.front()->getParticleModel()->getPosition().x) { if (swarm.at(i)->getParticleModel()->getTouching() == false) { if (swarm.at(i)->getParticleModel()->getVelocity().x < 0) swarm.at(i)->getParticleModel()->setVelocityX(swarm.at(i)->getParticleModel()->getVelocity().x *-1); swarm.at(i)->getParticleModel()->moveConstVel(timestep); } if (CollisionCheck(swarm.at(i)->getParticleModel()->getPosition().x-30, swarm.at(i)->getParticleModel()->getPosition().y-30, 65, 65, swarm.at(j)->getParticleModel()->getPosition().x-30, swarm.at(j)->getParticleModel()->getPosition().y-30, 65, 65)) { if (swarm.at(i)->getParticleModel()->getFarAway() == true) { swarm.at(i)->getParticleModel()->setClose(true); swarm.at(i)->getParticleModel()->setFarAway(false); } } if (swarm.at(i)->getParticleModel()->getClose() == true) { if (swarm.at(i)->getParticleModel()->getPosition().y < swarm.at(j)->getParticleModel()->getPosition().y) { swarm.at(i)->getParticleModel()->setPosition(swarm.at(i)->getParticleModel()->getPosition().x,swarm.at(i)->getParticleModel()->getPosition().y+10); } if (swarm.at(i)->getParticleModel()->getPosition().y > swarm.at(j)->getParticleModel()->getPosition().y) { swarm.at(i)->getParticleModel()->setPosition(swarm.at(i)->getParticleModel()->getPosition().x,swarm.at(i)->getParticleModel()->getPosition().y-10); } if (CollisionCheck(swarm.at(i)->getParticleModel()->getPosition().x, swarm.at(i)->getParticleModel()->getPosition().y, 5, 5, swarm.at(j)->getParticleModel()->getPosition().x, swarm.at(j)->getParticleModel()->getPosition().y, 5, 5)) { swarm.at(i)->getParticleModel()->setTouching(true); swarm.at(i)->getParticleModel()->setClose(false); } } if (swarm.at(i)->getParticleModel()->getTouching() == true) { swarm.at(i)->getParticleModel()->setVelocityX(swarm.at(i)->getParticleModel()->getVelocity().x *-1); if (!CollisionCheck(swarm.at(i)->getParticleModel()->getPosition().x, swarm.at(i)->getParticleModel()->getPosition().y, 5, 5, swarm.at(j)->getParticleModel()->getPosition().x, swarm.at(j)->getParticleModel()->getPosition().y, 5, 5)) { swarm.at(i)->getParticleModel()->setFarAway(true); swarm.at(i)->getParticleModel()->setTouching(false); } } } if (swarm.at(i)->getParticleModel()->getPosition().x > gameObjects.front()->getParticleModel()->getPosition().x) { if (swarm.at(i)->getParticleModel()->getTouching() == false) { if (swarm.at(i)->getParticleModel()->getVelocity().x > 0) swarm.at(i)->getParticleModel()->setVelocityX(swarm.at(i)->getParticleModel()->getVelocity().x *-1); swarm.at(i)->getParticleModel()->moveConstVel(timestep); } if (CollisionCheck(swarm.at(i)->getParticleModel()->getPosition().x-30, swarm.at(i)->getParticleModel()->getPosition().y-30, 65, 65, swarm.at(j)->getParticleModel()->getPosition().x-30, swarm.at(j)->getParticleModel()->getPosition().y-30, 65, 65)) { if (swarm.at(i)->getParticleModel()->getFarAway() == true) { swarm.at(i)->getParticleModel()->setClose(true); swarm.at(i)->getParticleModel()->setFarAway(false); } } if (swarm.at(i)->getParticleModel()->getClose() == true) { if (swarm.at(i)->getParticleModel()->getPosition().y < swarm.at(j)->getParticleModel()->getPosition().y) { swarm.at(i)->getParticleModel()->setPosition(swarm.at(i)->getParticleModel()->getPosition().x,swarm.at(i)->getParticleModel()->getPosition().y+1); } if (swarm.at(i)->getParticleModel()->getPosition().y > swarm.at(j)->getParticleModel()->getPosition().y) { swarm.at(i)->getParticleModel()->setPosition(swarm.at(i)->getParticleModel()->getPosition().x,swarm.at(i)->getParticleModel()->getPosition().y-1); } if (CollisionCheck(swarm.at(i)->getParticleModel()->getPosition().x, swarm.at(i)->getParticleModel()->getPosition().y, 5, 5, swarm.at(j)->getParticleModel()->getPosition().x, swarm.at(j)->getParticleModel()->getPosition().y, 5, 5)) { swarm.at(i)->getParticleModel()->setTouching(true); swarm.at(i)->getParticleModel()->setClose(false); } } if (swarm.at(i)->getParticleModel()->getTouching() == true) { swarm.at(i)->getParticleModel()->setVelocityX(swarm.at(i)->getParticleModel()->getVelocity().x *-1); if (!CollisionCheck(swarm.at(i)->getParticleModel()->getPosition().x, swarm.at(i)->getParticleModel()->getPosition().y, 5, 5, swarm.at(j)->getParticleModel()->getPosition().x, swarm.at(j)->getParticleModel()->getPosition().y, 5, 5)) { swarm.at(i)->getParticleModel()->setFarAway(true); swarm.at(i)->getParticleModel()->setTouching(false); } } } }``````
You should check out HBL source code. I dont know which version now but they did something similar to the main menu
I may be missing something but I Googled 'HBL source code' and got a load of stuff on how to play PSP games on the Vita, and the like.

Struggling to find any relevance :/
it is but in that source code or at least the exploit version you could find snowing flakes with hello world message. i dont know which version it was but i think it was the earlier ones
Okay, so I've had a look and gotten a bit closer. I think the main problem is not knowing how to compare each element in the Vector.

Like, how do I compare each element without comparing 2 of the same elements?

 ``123456789`` `````` for(int i = 0; i < swarm.size(); i++) { for (int j = 1; j < swarm.size(); j++) { if (CollisionCheck(swarm.at(i)->getParticleModel()->getPosition().x, swarm.at(i)->getParticleModel()->getPosition().y, 5, 5, swarm.at(j)->getParticleModel()->getPosition().x, swarm.at(j)->getParticleModel()->getPosition().y, 5, 5)) {}``````

This means that i1 is going to be compared with j1, and so forth.

Or

 ``123456`` ``````for(int i = 0; i < swarm.size(); i++) { if (CollisionCheck(swarm.at(i)->getParticleModel()->getPosition().x, swarm.at(i)->getParticleModel()->getPosition().y, 5, 5, swarm.at(i+1)->getParticleModel()->getPosition().x, swarm.at(i+1)->getParticleModel()->getPosition().y, 5, 5)) {}``````

will give an outofbounds exception...hmmmm
Maybe:
 ``12`` ``````for ( int i=0 ; i < swarm.size()-1; ++i ) for ( int j = i+1; j < swarm.size(); ++j )``````

Topic archived. No new replies allowed.