# How to simulate flocking behavior with Boids using HTML5 and Phaser

I bet you don’t know what Boids are. From Wikipedia: Boids is an artificial life program, developed by Craig Reynolds in 1986, which simulates the flocking behaviour of birds. The name “boid” corresponds to a shortened version of “bird-oid object”, which refers to a bird-like object. I am going to show you, in a series of posts, how to simulate a flocking behavior and how to use it in other projects which have nothing to do with flocking. First, a couple of references: you may find interesting the official Boids page by Craig Reynolds, and also the pseudo code by Conrad Parker. We’ll divide the tutorial step by step, and in the first step we’ll see how to accomplish to the first Boids rule. Rule 1: Boids try to fly towards the centre of mass of neighbouring boids. In other words, each boid will try to fly towards the average position of all other boids. It’s quite easy thanks to Phaser `Point` class and Arcade Physics. At each frame, boids trajectory is adjusted. Obviously a Boid can’t see all the other boids, but only the ones within a given range. Look at the example – you may need to reload it if you only see a white ball:
Boids converge to the center of the flock, and if you notice some boids wandering like crazy, that’s because they are too far from any other visible boid. This is the commented source code:
```var game;

// number of boids (bird-oid objects)
var boidsAmount = 50;
// speed of each boid, in pixels per second
var boidSpeed = 100;
// radius of sight of the boid
// array which will contain all boids
var boids = [];

game = new Phaser.Game(640, 640, Phaser.AUTO, "");
game.state.start("Simulate");
}

var simulate = function(game){};
simulate.prototype = {
},
create: function(){
for(var i = 0; i < boidsAmount; i++){
// placing the boid at a random point within the canvas
var randomPoint = new Phaser.Point(game.rnd.between(0, game.width - 1), game.rnd.between(0, game.height - 1));
boids[i] = {
position: randomPoint,
}
boids[i].asset.anchor.set(0.5);
// enabling boid physics
// allowing us to manually rotate the boid
boids[i].asset.body.allowRotation = false;
}
},
update: function(){
// temp array to calculate centroid
var centroidArray = [];
// looping through each boid
for(var i = 0; i < boidsAmount; i++){
// for each boid, looping through each boid
for(var j = 0; j < boidsAmount; j++){
// if the boid is not the current boid and the boid is within boid radius...
if(i != j &amp;&amp; boids[i].position.distance(boids[j].position) < boidRadius){
// pushing the boid into centroid array
centroidArray.push(boids[j].position);
}
}
// if centroidArray is populated, that is if there were boids nearby the current boid...
if(centroidArray.length &gt; 0){
// calculating the centroid
var centroid = Phaser.Point.centroid(centroidArray);
}
else{
// just tossing a random point
var centroid = new Phaser.Point(game.rnd.between(0, game.width - 1), game.rnd.between(0, game.height - 1));
}
// rotating the boid towards the centroid
boids[i].asset.angle = boids[i].position.angle(centroid, true);
// moving the boid towards the centroid
// updating boid position
boids[i].position.set(boids[i].asset.x, boids[i].asset.y);
}
}
}
```
This was just the beginning as there are two more steps to develop, meanwhile you can download the source code.
214 GAME PROTOTYPES EXPLAINED WITH SOURCE CODE
// 1+2=3
// 10000000
// 2 Cars
// 2048
// Avoider
// Ballz
// Block it
// Blockage
// Bloons
// Boids
// Bombuzal
// Breakout
// Bricks
// Columns
// CubesOut
// Dots
// DROP'd
// Dudeski
// Eskiv
// Filler
// Fling
// Globe
// HookPod
// Hundreds
// InkTd
// Iromeku
// Lumines
// Magick
// MagOrMin
// Maze
// Memdot
// Nano War
// Nodes
// o:anquan
// Ononmin
// Pacco
// Phyballs
// Platform
// Poker
// Pool
// Poux
// Pudi
// qomp
// Racing
// Renju
// SameGame
// Security
// Sling
// Slingy
// Sokoban
// Splitter
// Sproing
// Stack
// Stringy
// Sudoku
// Tetris
// Threes
// Toony
// Turn
// TwinSpin
// vvvvvv
// Wordle
// Worms
// Yanga
// Zhed
// zNumbers