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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
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?

1
2
3
4
5
6
7
8
9

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

1
2
3
4
5
6
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:
1
2
for ( int i=0 ; i < swarm.size()-1; ++i )
    for ( int j = i+1; j < swarm.size(); ++j )

Topic archived. No new replies allowed.