//---------------------------------------------------------------------- // Call the factory to create new GameObject as described in the file // Send a Event_CreateObject void GameObjectManager::LoadGameObjects( const char* file ) { XmlMediator* pRoot = TinyXmlLoader::Instance().LoadFile( file ); if( pRoot == nullptr ) { std::cerr << "[GOManager] Loading objects from " << file << " failed." << std::endl; return; } auto pGOChildren = pRoot->GetChildren( std::string("GameObject") ); for( auto It = pGOChildren.begin(); It != pGOChildren.end(); It++ ) { GameObject* newGO = m_pGOFactory->CreateGameObject( *It ); if( newGO != nullptr ) { m_pObjects[ newGO->GetID() ] = newGO; EventManager::Instance().SendEvent( std::make_shared<Event_CreateObject>( Event_CreateObject( newGO ) ) ); } else { std::cerr << "[GOManager] Error in GameObject load." << std::endl; } } SAFE_DELETE( pRoot ); }
objectID Example::GetFarthestAgent( void ) { float farthestDistance = 0.0f; GameObject* farthestGameObject = 0; dbCompositionList list; g_database.ComposeList( list, OBJECT_NPC ); dbCompositionList::iterator i; for( i=list.begin(); i!=list.end(); ++i ) { if( (*i)->GetID() != m_owner->GetID() ) { D3DXVECTOR3 npcPos = (*i)->GetBody().GetPos(); D3DXVECTOR3 myPos = m_owner->GetBody().GetPos(); D3DXVECTOR3 diff = npcPos - myPos; float distance = D3DXVec3Length( &diff ); if( farthestGameObject ) { if( distance > farthestDistance ) { farthestDistance = distance; farthestGameObject = *i; } } else { farthestDistance = distance; farthestGameObject = *i; } } } return( farthestGameObject->GetID() ); }
/*---------------------------------------------------------------------------* Name: Store Description: Stores an object within the database. Arguments: object : the game object Returns: None. *---------------------------------------------------------------------------*/ void Database::Store( GameObject & object ) { if( Find( object.GetID() ) == 0 ) { m_database.push_back( &object ); } else { ASSERTMSG( 0, "Database::Store - Object ID already represented in database." ); } }
GameObject* GameObjectManager::Find( objectID id ) { std::map<int, GameObject*>::iterator b = m_allEntities.begin(); std::map<int, GameObject*>::iterator e = m_allEntities.end(); for ( ; b != e; b++) { GameObject* pkGameObject = (*b).second; if (pkGameObject->GetID() == id) return pkGameObject; } return NULL; }
objectID GameObjectManager::GetIDByName( const char* name ) { std::map<int, GameObject*>::iterator b = m_allEntities.begin(); std::map<int, GameObject*>::iterator e = m_allEntities.end(); for ( ; b != e; b++) { GameObject* pkGameObject = (*b).second; if (strcmp(pkGameObject->GetName(), name) == 0) return pkGameObject->GetID(); } return (INVALID_OBJECT_ID); }
void GameController::ProcessMessages() { while(messages.size() > 0) { Message* msg = messages.front(); messages.pop_front(); GameObject* obj = _model->GetPlayerObject(); if(msg->GetMessageType() == MessageType::USER_INPUT) { assert(obj != NULL); obj->SendMessage(msg); } else if(msg->GetMessageType() == MessageType::GAME_OBJECT_ACTION) { if(msg->GetMessageContent() == MessageContent::CREATE_OBJECT) { GameObject* obj = (GameObject*)msg->GetExtended(); assert(obj != NULL); this->_model->AddNewObject(obj); delete msg; } else if(msg->GetMessageContent() == MessageContent::DESTROY_OBJECT) { GameObject* obj = (GameObject*)msg->GetExtended(); _model->DestroyObject( obj->GetID()); theReaper.DoomObject((GameObject*)msg->GetExtended()); delete msg; } else if(msg->GetMessageContent() == MessageContent::SHOULD_RENDER) { _view->PassMessage(msg); } else if(msg->GetMessageContent() == MessageContent::DO_PHYSICS) { physicsWorld.PassMessage(msg); } } } assert(messages.size() == 0); }
END_ON_EDIT_FUNC //NOTE: THIS ASSUMES THAT THIS NODE WILL BE THE ROOT OF THE KILLER TREE NODE_MSG_RECEIVED(SelectRandomVictim) { GameObject *me = g_database.Find(self); if (name == AGENT_TARGETED_RESPONSE) { if(data.GetInt() == -1) { GameObject *t = g_database.Find(static_cast<objectID>(rand() % g_database.GetSize() - 1)); if (me && t) { IBTNode::SendMsg(AGENT_TARGETED_PING, (t->GetID()), self, "CivilianIdle", MSG_Data(self)); //In root nodes put: // if cop: if(node msg received == AGENT_TARGETED_PING), return data = -1 // if civilian or killer: if(node msg received == AGENT_TARGETED_PING), return data = 1 currentStatus = NS_Running; } else { currentStatus = NS_Failed; } } else { //me->SetTargetPOS() currentStatus = NS_Completed; } } else if (name == AGENT_TARGETED_PING) { currentStatus = NS_Failed; } }