EnemyManager::EnemyManager(char* filename, Ogre::SceneManager* _inMgr, Blocks* block_ent) { vData.clear(); vEnemy.clear(); ReadXmlEnemyData(filename); for (int i = 0; i < vData.size(); i++) { Ogre::Vector3 startPos = Ogre::Vector3(vData[i].x, vData[i].y, vData[i].z); Ogre::Vector3 pos = block_ent->absToRealPos(startPos); Enemy* enemy = new Enemy(_inMgr, Ogre::Vector3(pos.x, pos.y-25, pos.z), startPos); vEnemy.push_back(enemy); enemy->Initialize(); enemy->InitCmdVector(vData[i].vCmd); } }
//============================================================================================================= void Game::AddEnemy(int type, int height, int width, int track, int speed) { if( height > 3 || height < 1 ) return; DummyFramework::CSprite9* sprite; D3DXVECTOR2 position; Enemy* enemy; float h = (float)height; float d = GameVariables::PlayFieldHeight; float start = (GameVariables::ScreenHeight - d) * 0.5f; float tw; int cnt; // elöször meg kell tudni, hogy melyik grafika lesz switch( type ) { case 0: sprite = &atlas1["regular"]; break; case 1: sprite = &atlas1["worm"]; break; case 2: sprite = &atlas1["bomb"]; break; case 3: sprite = &atlas1["island"]; break; /* case 4: sprite = &atlas1["elite"]; break; */ case 5: sprite = &atlas1["razor"]; break; default: break; } // aztán kiszámolni a helyzetét float yspacing = (d - 3.0f * sprite->Size.y) / 4.0f; float xspacing = 20; if( track == 0 ) { position.y = start + yspacing + sprite->Size.y * 0.5f; yspacing = (4.0f - h) * yspacing + (3.0f - h) * sprite->Size.y; } else if( track == 1 ) { float center = start + d * 0.5f; position.y = center - (h - 1) * 0.5f * (sprite->Size.y + yspacing); } else if( track == 2 ) { position.y = GameVariables::ScreenHeight - start - yspacing - sprite->Size.y * 0.5f; yspacing = -((5 - h) * sprite->Size.y + (4 - h) * yspacing); } // és létrehozni a megfelelö származtatott objektumot switch( type ) { case 0: for( int i = 0; i < height; ++i ) { position.x = GameVariables::ScreenWidth + sprite->Size.x; for( int j = 0; j < width; ++j ) { enemy = new Enemy(); enemy->shoot.connect(this, &Game::enemy_shoot1); enemy->explode.connect(this, &Game::enemy_explode); enemy->dead.connect(this, &Game::enemy_dead); enemy->Initialize(*game); enemy->Image = sprite; enemy->Hurt = &atlas1["hurt"]; enemy->Speed = GameVariables::CorrelateW((float)speed); enemy->SetPosition(position); enemies.insert(enemy); position.x += (sprite->Size.x + xspacing); } position.y += (sprite->Size.y + yspacing); } break; case 1: position.x = GameVariables::ScreenWidth + sprite->Size.x; if( height > 1 ) { // egyik enemy = new Worm(width); ((Worm*)enemy)->Direction = 1.0f; enemy->explode.connect(this, &Game::enemy_explode); enemy->dead.connect(this, &Game::enemy_dead); enemy->Initialize(*game); enemy->Image = sprite; enemy->Hurt = &atlas1["hurt"]; enemy->Speed = GameVariables::CorrelateH((float)speed); enemy->SetPosition(position); enemies.insert(enemy); // másik enemy = new Worm(width); ((Worm*)enemy)->Direction = -1.0f; enemy->explode.connect(this, &Game::enemy_explode); enemy->dead.connect(this, &Game::enemy_dead); enemy->Initialize(*game); enemy->Image = sprite; enemy->Hurt = &atlas1["hurt"]; enemy->Speed = GameVariables::CorrelateH((float)speed); enemy->SetPosition(position); enemies.insert(enemy); } else { enemy = new Worm(width); ((Worm*)enemy)->Direction = ((track == 0) ? 1.0f : -1.0f); enemy->explode.connect(this, &Game::enemy_explode); enemy->dead.connect(this, &Game::enemy_dead); enemy->Initialize(*game); enemy->Image = sprite; enemy->Hurt = &atlas1["hurt"]; enemy->Speed = GameVariables::CorrelateH((float)speed); enemy->SetPosition(position); enemies.insert(enemy); } break; case 2: tw = width * sprite->Size.x + (width - 1) * xspacing; for( int i = 0; i < height; ++i ) { if( track == 0 ) cnt = (width - (i % 2)); else if( track == 1 ) cnt = (height == 3 ? (width - 1 + (i % 2)) : width); else if( track == 2 ) cnt = ((i + height) % 2 ? width : width - 1); position.x = GameVariables::ScreenWidth + sprite->Size.x + (tw - (cnt * sprite->Size.x + (cnt - 1) * xspacing)) * 0.5f; for( int j = 0; j < cnt; ++j ) { enemy = new Bomb(); ((Bomb*)enemy)->Highlight = &atlas1["highlight"]; enemy->explode.connect(this, &Game::enemy_explode); enemy->dead.connect(this, &Game::enemy_dead); enemy->Initialize(*game); enemy->Image = sprite; enemy->Hurt = &atlas1["hurt"]; enemy->Speed = GameVariables::CorrelateW((float)speed); enemy->SetPosition(position); enemies.insert(enemy); position.x += (sprite->Size.x + xspacing); } position.y += (sprite->Size.y + yspacing); } break; case 3: for( int i = 0; i < height; ++i ) { position.x = GameVariables::ScreenWidth + sprite->Size.x; for( int j = 0; j < width; ++j ) { enemy = new Island(); enemy->Initialize(*game); enemy->Image = sprite; enemy->Speed = GameVariables::CorrelateW((float)speed); enemy->SetPosition(position); enemies.insert(enemy); position.x += (sprite->Size.x + xspacing); } position.y += (sprite->Size.y + yspacing); } break; case 5: position.x = GameVariables::ScreenWidth + sprite->Size.x; position.y = start + yspacing + sprite->Size.y * 0.5f; enemy = new Razor(); enemy->shoot.connect(this, &Game::enemy_shoot2); enemy->explode.connect(this, &Game::enemy_explode); enemy->dead.connect(this, &Game::enemy_dead); enemy->Initialize(*game); enemy->Image = sprite; enemy->Hurt = &atlas1["hurt"]; enemy->Speed = GameVariables::CorrelateW((float)speed); enemy->SetPosition(position); enemies.insert(enemy); // 2 razornál több már szemétség lenne if( width + height > 2 ) { // picit messzebröl induljon, hogy láthato legyen hogy az kettö... position.x = GameVariables::ScreenWidth + sprite->Size.x * 3; position.y = GameVariables::ScreenHeight - start - yspacing - sprite->Size.y * 0.5f; enemy = new Razor(); enemy->shoot.connect(this, &Game::enemy_shoot2); enemy->explode.connect(this, &Game::enemy_explode); enemy->dead.connect(this, &Game::enemy_dead); enemy->Initialize(*game); enemy->Image = sprite; enemy->Hurt = &atlas1["hurt"]; enemy->Speed = GameVariables::CorrelateW((float)speed); enemy->SetPosition(position); enemies.insert(enemy); } break; default: break; } }