IGameObject* DoSpawnGameObject( const GameObjectSpawnParams& params ) { IGameObject* pGameObject = 0; EGameObject type = params.type; if (type < EGO_COUNT) { std::string name = m_GlobalParameters.go[type].base_name; char buff[16]; _snprintf_s(buff, sizeof(buff), _TRUNCATE, "%d",++(m_NextGameObjectNumber[type])); name += buff; IObject* pObj = IObjectUtils::CreateObjectAndEntity( "GameObject", name.c_str() ); IObjectUtils::GetObject( &pGameObject, pObj->GetObjectId() ); AUVec3f pos = (params.spawnPosition.IsInfinite()) ? GetSpawnPosition(type) : params.spawnPosition; pGameObject->Init(type, pos); m_GameObjects[type].insert(pGameObject); } // Notify any listeners that object was created for (size_t i=0; i<m_Listeners.size(); ++i) { m_Listeners[i]->OnGameObjectCreated(pGameObject); } return pGameObject; }
// Updating void EnemySpawner::Update(float dt) { m_canSpawn = (m_numSpawnedEnemies < m_maxNumEnemiesToHaveActive); // Update timers UpdateTimers(dt); if(m_spawning && m_canSpawn) { if(m_spawnCountdownTimer <= 0.0f) { vec3 spawnPos = GetSpawnPosition(); vec3 toPlayer = spawnPos - m_pPlayer->GetCenter(); if(length(toPlayer) > m_minDistanceFromPlayer) { eEnemyType enemyType = GetEnemyTypeToSpawn(); Enemy* pEnemy = m_pEnemyManager->CreateEnemy(spawnPos, enemyType, 0.08f); pEnemy->SetSpawningParams(spawnPos, spawnPos, 2.0f); pEnemy->SetTargetForwardToLookAtPoint(spawnPos + m_spawnFacingDirection); pEnemy->SetEnemySpawner(this); m_numSpawnedEnemies += 1; m_spawnCountdownTimer = m_spawnTime; } } } }
// Updating void ItemSpawner::Update(float dt) { m_canSpawn = (m_numSpawnedItems < m_maxNumItemsToHaveActive); // Update timers UpdateTimers(dt); if(m_spawning && m_canSpawn) { if(m_spawnCountdownTimer <= 0.0f) { vec3 spawnPos; bool spawnGood = GetSpawnPosition(&spawnPos); if (spawnGood) { vec3 toPlayer = spawnPos - m_pPlayer->GetCenter(); if (length(toPlayer) > m_minDistanceFromPlayer) { eItem itemType = GetItemTypeToSpawn(); string itemFilename = GetItemFilenameForType(itemType); Item* pItem = m_pItemManager->CreateItem(spawnPos, vec3(0.0f, 0.0f, 0.0f), vec3(0.0f, 0.0f, 0.0f), itemFilename.c_str(), itemType, "SpawnedItem", true, false, m_spawnScale); pItem->SetItemSpawner(this); if (itemType == eItem_CopperVein || itemType == eItem_IronVein || itemType == eItem_SilverVein || itemType == eItem_GoldVein) { pItem->SetMaxtInteractCount(4); } pItem->SetRotation(vec3(0.0f, GetRandomNumber(0, 360, 2), 0.0f)); m_numSpawnedItems += 1; m_spawnCountdownTimer = m_spawnTime; } } else { // Can't spawn an item at a good position, wait a while before we try again m_spawnCountdownTimer = 0.5f; } } } }