int ChatWindow::handleInput(SDL_Event &event, ClientSocket& sock) { // Control del input de texto int res = input_box.handleInput(event); if(res == SInput::RES_CLOSE) { this->hide(); }else if(res == SInput::RES_ENTER) { BitStream bs; bs << PROTO::CHAT << nick_local << nick_destino << input_box.getText(); sock.send(bs.str()); } // Control del input del mouse if(event.type == SDL_MOUSEBUTTONDOWN && event.button.button == SDL_BUTTON_LEFT) { if( event.button.x < x + this->w && event.button.x > x + this->w - CLOSE_BUTTON_SIDE && event.button.y > y && event.button.y < y + CLOSE_BUTTON_SIDE) { res = SInput::RES_CLOSE; this->hide(); } } return res; }
void Tile::blit(SDL_Surface* pantalla, Camara& cam, Personaje* personaje, Mapa* mapa){ Tile* tilePersonaje = mapa->getTilePorPixeles(personaje->getX(), personaje->getY()); int deltaX = personaje -> getXAnclajeNiebla() - x; int deltaY = personaje -> getYAnclajeNiebla() - y; if((abs(deltaX) <= personaje->getRadioX()) && (abs(deltaY) <= personaje->getRadioY())){ //dibujo en colores normales for(auto it = entidades.begin(); it != entidades.end(); ++it) { if ( (!(*it)-> isInTile(this->x , this -> y)) && (!(*it)->isCompartido())){ // es un ancla deltaX = personaje -> getXAnclajeNiebla() - (*it)->getX(); deltaY = personaje -> getYAnclajeNiebla() - (*it)->getY(); if((abs(deltaX) <= personaje->getRadioX()) && (abs(deltaY) <= personaje->getRadioY())){ (*it)->setColor(true,x,y, mapa, (personaje -> getXAnclajeNiebla()), (personaje -> getYAnclajeNiebla()), personaje); (*it)->blit(pantalla, &cam, NULL,x, y,true); (*it)->setDibujada(true, mapa,personaje); } }else{ (*it)->setColor(true,x,y, mapa, (personaje -> getXAnclajeNiebla()), (personaje -> getYAnclajeNiebla()), personaje); (*it)->blit(pantalla, &cam, NULL,x, y,true); (*it)->setDibujada(true, mapa,personaje); } } bool agregoTile = personaje->agregarTilesExplorados(this); if(agregoTile){ BitStream bs; bs << PROTO::NIEBLA_SYNC << this->u << this->v; sock.send(bs.str()); } personaje->agregarTilesExplorados(this); }else{ std::vector<Tile*> tilesExplorados = personaje->getTilesExplorados(); if(std::find(tilesExplorados.begin(), tilesExplorados.end(), this) != tilesExplorados.end()){ //lo bliteo en gris for(auto it = entidades.begin(); it != entidades.end(); ++it) { if((*it)->noDibujaFueraDelRadio()) continue; if((!((*it)->getDibujada())) || ((*it)->get_nombre() == "tierraDefault")){ (*it)->setColor(true,x,y, mapa, (personaje -> getXAnclajeNiebla()), (personaje -> getYAnclajeNiebla()), personaje); (*it)->blit(pantalla, &cam, NULL,x, y,false); (*it)->setDibujada(true, mapa,personaje); }else{ (*it)->blit(pantalla, &cam, NULL,x, y,false); } } } } //bliteo el personaje por si el ancla no estaba en el radio (PASA SI RADIO ES 1)pero el personaje se blitea arriba de las cosas //Tile* tileAnclaPersonaje = personaje->getTileAncla(); //for(auto it = tileAnclaPersonaje->entidades.begin(); it != tileAnclaPersonaje->entidades.end(); ++it){ // if((*it) == personaje){ // (*it)->blit(pantalla, &cam, NULL, x, y); // } //} //asi estaba antes //for(auto it = entidades.begin(); it != entidades.end(); ++it) { // (*it)->blit(pantalla, &cam, NULL,x, y); //} }
void Enemigo::atacar(string& NickAtacado,PlayerManager& pm,ServerSocket& socks){ BitStream bs; int danio = intRand(0,30); //resto danio si ataca a un golem o a un enemigo bool encontro = false; bool murio = false; for(auto it = pm.getEnemies().begin();it !=pm.getEnemies().end();it++) { Enemigo* unEnemigo = it->second; if(unEnemigo->getNick() == NickAtacado){ unEnemigo->hacerDanio(danio); encontro = true; if(!it->second->estaVivo()){ murio = true; pm.getEnemies().erase(it); break; } } } //para golem if(!encontro){ for(auto it = pm.getGolems().begin();it !=pm.getGolems().end();it++) { Golem* unGolem = it->second; if(unGolem->getNick() == NickAtacado){ unGolem->hacerDanio(danio); if(!it->second->estaVivo()){ //aviso a los demas que murio enemigo murio = true; pm.getGolems().erase(it); break; } } } } //aviso del ataque for(auto it = socks.get_clients().begin();it !=socks.get_clients().end();it++) { //ataco con la danio bs.clear(); bs << PROTO::ATACAR << this->getNick() << NickAtacado; it->second.send(bs.str()); //mando danio bs.clear(); bs << PROTO::DAMAGE << this->getNick() << NickAtacado << danio; it->second.send(bs.str()); std::cout << "Update " << it->second.nick << " que " << this->getNick() << "->" << NickAtacado << endl; //aviso si murio if(murio){ //Veo si termino la mision if (mision.getTipo() == Misiones::MISION_ENEMIGO) { if (mision.enemigoMision() == NickAtacado) { bs.clear(); bs << PROTO::WINNER << pm.getEnemy(NickAtacado)->ultimoAtacante(); it->second.send(bs.str()); } } else { bs.clear(); bs << PROTO::ENEMY_DEAD << NickAtacado; it->second.send(bs.str()); } } } return; }