void Ambiente::inicializar() { // Inicializar a semente do rand uniRandSetSemente(time_t(NULL)); // Inicializar as comidas com posição aleatória for (unsigned int i = 0; i < NUM_COMIDAS; ++i) { Comida c; // Fazer o rand entre dois vetores nos dá uma posição aleatória na area formada pelos dois vetores c.pos = uniRandEntre(Vetor2D(0, 0), Vetor2D(gJanela.getLargura(), gJanela.getAltura())); c.spr.setSpriteSheet("branco"); c.spr.setCor(0, 255, 0); c.indice = i; comidas.push_back(c); } // Inicialiar os agentes com posição aleatória for (unsigned int i = 0; i < NUM_AGENTES; ++i) { agentes.push_back(Agente()); // Passamos o ponteiro para o ambiente, pois o agente // precisa conhecer o ambiente para saber o que fazer. agentes[i].inicializar(this); } }
void Ambiente::sortearPosComida(int indice) { do { comidas[indice].pos = uniRandEntre(Vetor2D(0, 0), Vetor2D(gJanela.getLargura(), gJanela.getAltura())); } // mantêm o loop enquanto a comida está colidindo com algum agente while (comidaColidiuComAlgumAgente(indice)); }
Vetor2D Vetor2D::getRotacionado(float angulo) { float rad = angulo*PI / 180; float cs = cosf(rad); float sn = sinf(rad); return Vetor2D(x*cs - y*sn, x*sn + y*cs); }
Vetor2D Vetor2D::normalizar() { float size = this->getNorma(); return Vetor2D(this->x/size,this->y/size); }
void Jogo::executar() { while(!gTeclado.soltou[TECLA_ESC] && !gEventos.sair) { uniIniciarFrame(); // Se pressionou R, restaura o painel de debug if (gTeclado.pressionou[TECLA_R]) gDebug.restaurar(); // Depurar variaveis gDebug.depurar("FPS", (int)gTempo.getFPS()); gDebug.depurar("deltaTempo", gTempo.getDeltaTempo()); gDebug.depurar("mouse", Vetor2D(gMouse.x, gMouse.y)); gDebug.depurar("retanguloTela", Quad(0, 0, gJanela.getLargura(), gJanela.getAltura())); // Cria um erro gDebug.erro("Erro Teste", this); // Opcionalmente, passa-se uma cor para a depuração gDebug.depurar("Verde", "Este é um texto Verde", Cor(0, 255, 0)); // Desenhar fundo, para poder ver melhor a transparência do painel sprFundo.desenhar(gJanela.getLargura() / 2, gJanela.getAltura() / 2); desenharInstrucoes(); uniTerminarFrame(); } }
Vetor2D Vetor2D::rotate(float degrees) { //convertendo para radianos degrees = grausToRad(degrees); return Vetor2D(this->x*cosf(degrees) - this->y*sinf(degrees),this->x*sinf(degrees) + this->y*cosf(degrees)); }
void Vetor2D::setAngle(float angle) { float norma = this->getNorma(); (*this) = Vetor2D(angle); if(norma){ this->setNorma(norma); } }
void Monstro::pursuit() { if( !this->targetIsVisible() ) { this->state = Monstro::SEEK; this->delay_seek.stop(); this->delay_seek.start(); this->setVel(this->getVel()/2); } else { double dx = ( target->getOffset().getX() - this->getOffset().getX() ); double dy = ( target->getOffset().getY() - this->getOffset().getY() ); if( abs(dx) > abs(dy) ) { if( dx > 0 ) this->vdirector = Monstro::VD_RIGHT; else if( dx < 0 ) this->vdirector = Monstro::VD_LEFT; } else if( abs(dy) > abs(dx) ) { if( dy > 0 ) this->vdirector = Monstro::VD_DOWN; else if( dy < 0 ) this->vdirector = Monstro::VD_UP; } if( Vetor2D(dx,dy).getNorma() <= this->getDimension().getNorma()/2) { this->vdirector = Monstro::VD_STOP; this->target->setWasCaught(true); } } }
Vetor2D Vetor2D::operator+(const Vetor2D& v) { return Vetor2D(x + v.x, y + v.y); }
bool AStar::calcularCaminho(float origem_x, float origem_y, float destino_x, float destino_y) { return calcularCaminho(Vetor2D(origem_x, origem_y), Vetor2D(destino_x, destino_y)); }
Vetor2D Vetor2D::getNormal() { float invCompr = 1.0f / comprimento(); return Vetor2D(x * invCompr, y * invCompr); }
Vetor2D Vetor2D::operator/(float a) { return Vetor2D(x / a, y / a); }
Vetor2D Vetor2D::operator-(float a) { return Vetor2D(x - a, y - a); }
Vetor2D Vetor2D::operator/(const Vetor2D& v) { return Vetor2D(x / v.x, y / v.y); }
Vetor2D Vetor2D::operator* (float k) { return Vetor2D(this->x*k,this->y*k); }
Vetor2D::Vetor2D(float angle) { (*this) = Vetor2D(cosf(grausToRad(angle)),sinf(grausToRad(angle))); }
#include "vetor2D.h" float grausToRad(float graus) { return (graus*float(M_PI))/180.0f; } float radToGraus(float radianos) { return (radianos*180.0f)/float(M_PI); } const Vetor2D Vetor2D::ZERO = Vetor2D(0,0); Vetor2D::Vetor2D() { this->x = 0; this->y = 0; } Vetor2D::Vetor2D(float x,float y) { this->x = x; this->y = y; } Vetor2D::Vetor2D(float angle) { (*this) = Vetor2D(cosf(grausToRad(angle)),sinf(grausToRad(angle))); }
Vetor2D Vetor2D::operator-(const Vetor2D& v) { return Vetor2D(x - v.x, y - v.y); }
Vetor2D Vetor2D::operator*(const Vetor2D& v) { return Vetor2D(x * v.x, y * v.y); }
Vetor2D Vetor2D::operator/ (float k) { return Vetor2D(this->x/k,this->y/k); }
Vetor2D Vetor2D::operator+(float a) { return Vetor2D(x + a, y + a); }
Vetor2D Vetor2D::operator+ (Vetor2D other) { return Vetor2D(this->x + other.getX(),this->y + other.getY()); }
Vetor2D Vetor2D::operator*(float a) { return Vetor2D(x * a, y * a); }
Vetor2D Vetor2D::operator- (Vetor2D other) { return Vetor2D( this->x - other.getX(), this->y - other.getY() ); }
float Vetor2D::getAngulo() { return getAnguloAPartirDoVetor(Vetor2D(1, 0)); }
Vetor2D ObjetoTile::getPos() { return Vetor2D(x, y); }
#include "Monstro.h" const int Monstro::SEEK = 0; const int Monstro::PURSUIT = 1; const int Monstro::CATCH = 2; const Vetor2D Monstro::VD_UP = Vetor2D(0, -1); const Vetor2D Monstro::VD_DOWN = Vetor2D(0, 1); const Vetor2D Monstro::VD_RIGHT = Vetor2D(1, 0); const Vetor2D Monstro::VD_LEFT = Vetor2D(-1, 0); const Vetor2D Monstro::VD_STOP = Vetor2D::ZERO; // 200 ms const int Monstro::RESPONSE_TIME_SEEK = 1000; const int Monstro::RESPONSE_TIME_UNIVERSAL = 200; Monstro::Monstro(Uint16 spriteWidth, Uint16 spriteHeight, string spriteSrc, double visualField, Personagem* target, double vel,int thresholdVision) throw(LoadImageException,NoVideoBufferException,NoTargetException) : Sprite(spriteWidth, spriteHeight, spriteSrc) { this->vdirector = Monstro::VD_RIGHT; //this->foundTarget = false; this->target = target; this->vel = vel; this->thresholdVision = thresholdVision; this->visualField = visualField; if(!this->target) throw NoTargetException();
Vetor2D ObjetoTile::getPosCentro() { return Vetor2D(getXCentro(), getYCentro()); }