// Check if the snake is outside bool isOutside(ParticleManager& snakeManager) { for(int i = 0; i < snakeManager.getCount(); ++i) { //Right if(snakeManager.getParticleX(i) >= 1.f) { return true; } // Left if(snakeManager.getParticleX(i) <= -1.f) { return true; } // Up if(snakeManager.getParticleY(i) >= 1.f) { return true; } // Down if(snakeManager.getParticleY(i) <= -1.f) { return true; } } return false; }
// Check collision between snake and food int checkFoodCollision(ParticleGraph& snakeGraph, ParticleManager& snakeManager, ParticleManager& foodManager, ParticleManager& fireworkManager, float step, int init) { for(int i = init; i < foodManager.getCount(); ++i) { if(foodManager.getParticleX(i) - step * foodManager.getParticleMass(i) <= snakeManager.getParticleX(0) && snakeManager.getParticleX(0) <= foodManager.getParticleX(i) + step * foodManager.getParticleMass(i) && foodManager.getParticleY(i) - step * foodManager.getParticleMass(i) <= snakeManager.getParticleY(0) && snakeManager.getParticleY(0) <= foodManager.getParticleY(i) + step* foodManager.getParticleMass(i)) { fireworkManager.addCircleParticlesAtPosition(3, snakeManager.getParticlePosition(0), snakeManager.getParticleColor(1), 25); addParticletoSnake(snakeGraph, i, foodManager, snakeManager); foodManager.addRandomParticle(snakeManager.getCount()); return i; } } return -1; }
// Add repulsive force void addRepulsiveForce(ParticleManager& repulsiveManager, ParticleManager& snakeManager) { if(repulsiveManager.getCount() > 0) { for(int i = 0; i < snakeManager.getCount(); ++i) { for(int j = 0; j < repulsiveManager.getCount(); ++j) { glm::vec2 repulse = snakeManager.getParticlePosition(i) - repulsiveManager.getParticlePosition(j); float d = glm::length(repulse); repulse = glm::normalize(repulse); int repulsiveCoeff = 40; if(d < 0.2) { // Plus on divise et plus c'est petit : pluattractivecoeff augmente et mois l'attraction est forte au loin snakeManager.addForceToParticle(i, glm::vec2(repulse[0]/(repulsiveCoeff*d), repulse[1]/(repulsiveCoeff*d))); } } } } }
// Check collision between snake and snake int checkSnakeCollision(ParticleManager& snakeManager, ParticleManager& foodManager, float step, int init) { for(int i = init; i < foodManager.getCount() - 1; ++i) { if(foodManager.getParticleX(i) - step * foodManager.getParticleMass(i) <= snakeManager.getParticleX(0) && snakeManager.getParticleX(0) <= foodManager.getParticleX(i) + step * foodManager.getParticleMass(i) && foodManager.getParticleY(i) - step * foodManager.getParticleMass(i) <= snakeManager.getParticleY(0) && snakeManager.getParticleY(0) <= foodManager.getParticleY(i) + step* foodManager.getParticleMass(i)) { return i; } } return -1; }
// Add a particle to the Snake void addParticletoSnake(ParticleGraph& graph, int id, ParticleManager& foodManager, ParticleManager& snakeManager) { id = snakeManager.addParticleToHead(foodManager.getParticleMass(id), foodManager.getParticlePosition(id), foodManager.getParticleVelocity(id), foodManager.getParticleForce(id), snakeManager.getHeadColor()); foodManager.clear(); std::pair<unsigned int, unsigned int> pair (id, snakeManager.getCount() - 2); graph.push_back(pair); snakeManager.getParticleColor(1) = snakeManager.getParticleColor(2); }
void ConstantForce::apply(ParticleManager& pm) { for(int i = 0; i < pm.getCount(); ++i) { pm.addForceToParticle(i, this->getForce()); } }