/** * Extrait les entités de la map. * @param board Le plateau de jeu * @param entityList La liste des entités extraites */ void extractEntities(char board[ROWS][COLS], Entity* entityList[ENTITY_MAX]) { unsigned short x, y; int count; Entity* entity = NULL; count = -1; for (x = 0; x < ROWS; x++) { for (y = 0; y < COLS; y++) { entity = NULL; switch (board[x][y]) { case ENEMY_CHAR: if (board[x + 1][y] != THIN_CHAR && board[x - 1][y] != THIN_CHAR) entity = createEnemy(x, y, RIGHT); else entity = createEnemy(x, y, UP); count++; break; case MOWER_CHAR: entity = createMower(x, y); count++; break; } if (entity != NULL) entityList[count] = entity; } } }
/* * creates two enemies and checks their defaut values */ void Test_createEnemy() { freeAllEnemies(); createEnemy(); sput_fail_unless(getNumberOfEnemies() == 1, "Valid: Number of enemies held in group is one."); sput_fail_unless(getEnemyHealth(getNumberOfEnemies()) == 100,"Valid: Enemy health is default." ); createEnemy(); sput_fail_unless(getNumberOfEnemies() == 2, "Valid: Number of enemies held in group is two."); sput_fail_unless(getEnemyHealth(getNumberOfEnemies()) == 100,"Valid: Enemy 2 health is default." ); }
StageManager* Stage::StageCreater::create(Layer* layer,const std::string& filename) { StageDataReader sdr; StageManager* sm = StageManager::create(); EnemyManager* em = EnemyManager::create(); StageFactory sf; EnemyFactory ef; StageObjManager* som = StageObjManager::create(); SeaFireFlyManager* sfm = new SeaFireFlyManager(); sfm->init(); auto plistcontener = sdr.read(filename); for (auto objStr : plistcontener) { createEnemy(layer,&ef, em, objStr); createStageObj(layer,&sf, som, objStr); createSeaFly(layer, sfm, objStr); } sm->setManager(em, som, sfm); return sm; }
void GameRun(Config & conf, GameData & gData) { sf::Clock clock; float timeCreate = conf.timeDistanceCreate; bool flagBG = true; while (gData.window.isOpen()) { if (gData.gameSprites["hero"].spriteItems.begin()->spriteHeal > 0) { float time = (float)clock.getElapsedTime().asMicroseconds(); clock.restart(); timeCreate -= time; sf::Event event; while (gData.window.pollEvent(event)) events(event, gData); moveBackG(gData, flagBG); for (auto &staticItr : gData.gameSprites) { createEnemy(gData, conf, timeCreate, staticItr.first); auto remover = std::bind(moveForDinamics,std::placeholders::_1, std::ref(staticItr.second), std::ref(gData), std::ref(staticItr.first), time); auto newEnd = std::remove_if(staticItr.second.spriteItems.begin(), staticItr.second.spriteItems.end(), remover); staticItr.second.spriteItems.erase(newEnd, staticItr.second.spriteItems.end()); }//конец статик gData.window.clear(); gData.window.draw(gData.backeG1); gData.window.draw(gData.backeG2); for (auto &staticItr : gData.gameSprites) for (auto &dinamicItr : staticItr.second.spriteItems) gData.window.draw(dinamicItr.sprite); gData.window.display(); sf::sleep(sf::microseconds((sf::Int64)(1000000 / 60.0 - clock.getElapsedTime().asMicroseconds()))); } } };
void EnemyHandler::update(float timeEllapsed) { if(rand()%50==1) { createEnemy(5, rand()%1200 -600, 1400); } for(int i=0;i<enemys.size();i++) { if(enemys[i]->y<-500 || enemys[i]->lives==0) { enemysBuffer.push_back(enemys[i]); removeChild(enemys[i]); enemys.erase (enemys.begin()+i); i--; }else{ enemys[i]->y =enemys[i]->y -400*timeEllapsed; } } };
Game::Game( int numCellsWide, int numCellsLong, int cellSize, QWidget *parent): QGraphicsView(parent), pathingMap_(numCellsWide,numCellsLong,cellSize), scene_(new QGraphicsScene(this)), player_(new Player(this,cellSize)), enemies_(), cellSize_(cellSize) { //set size of window/scene setScene(scene_); setSceneRect(0,0,numCellsWide*cellSize,numCellsLong*cellSize); // add the player to the scene/give him keyboard focus player_->setPos(3*cellSize,1*cellSize); scene_->addItem(player_); player_->setFocus(); // create some enemies createEnemy(1,1); createEnemy(14,1); createEnemy(14,10); // draw the map std::vector<std::vector<int>> vec { {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, {1,0,1,1,1,1,1,0,1,1,1,1,1,1,0,1}, {1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1}, {1,0,1,0,1,1,1,1,1,1,1,1,0,1,0,1}, {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, {1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1}, {1,0,1,0,1,1,1,1,1,1,1,1,0,1,0,1}, {1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1}, {1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1}, {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, }; drawMap(vec); // make enemies follow player QTimer* followTimer = new QTimer(this); connect(followTimer,SIGNAL(timeout()),this,SLOT(setEnemyPathsToPlayer())); followTimer->start(1000); }
void GameState::Update() { if(currentInGameState == Play) { std::list<Player*>::iterator it_player = Player::s_playerList.begin(); while(it_player != Player::s_playerList.end()) { if(!(*it_player)->isDead()) (*it_player)->update(); it_player++; } std::list<Rock*>::iterator it_rock = Rock::s_rockList.begin(); while(it_rock != Rock::s_rockList.end()) { (*it_rock)->update(); it_rock++; } std::list<Enemy*>::iterator it_enemy = Enemy::s_enemyList.begin(); while(it_enemy != Enemy::s_enemyList.end()) { (*it_enemy)->update(); it_enemy++; } checkForCollision(); createDollar(); createEnemy(); createRock(); if(isGameOver() && currentInGameState != GameOver) { //ALL PLAYERS DIED! currentInGameState = GameOver; Text::s_textList.push_back(new Text("Press key to exit to menu", 48, 0, 0, 255, 255, 255)); Text::s_textList.back()->centerHorizontal(0,config::W_WIDTH); Text::s_textList.back()->bottomAlign(config::W_HEIGHT, 20); temp_delay = 1000; } } else if (currentInGameState == CountDown) { if(countDown_compareTime < SDL_GetTicks()) { text_countDown->updateText(countDown); text_countDown->centerHorizontal(0,config::W_WIDTH); text_countDown->centerVertical(0,config::W_HEIGHT / 2); countDown_compareTime += 1000; countDown--; if (countDown < 0) { Text::s_textList.remove(text_countDown); currentInGameState = Play; } } } FPS::FPSControl.Update(); #ifdef WIN32 std::stringstream ss; ss << config::WINDOW_TEXT << " " << FPS::FPSControl.GetFPS(); SDL_WM_SetCaption(ss.str().c_str(), ss.str().c_str()); #endif }
Enemy createTestEnemy() { Enemy e = createEnemy(); int testEnemyLevel = 1; EnemyGroup eGroup = getEnemyGroup(NULL); if(eGroup == NULL) { fprintf(stderr,"Unable to find enemy group in testEnemyMovement()"); exit(1); } initialiseEnemy(e, testEnemyLevel, INT_TYPE, intBasic, INT_BASIC_HEALTH, INT_BASIC_ARMOUR, INT_BASIC_SPEED, INT_BASIC_DAMAGE, INT_BASIC_HEIGHT, INT_BASIC_WIDTH); return e; }
EnemyController* EnemyController::createAnEnemy() { auto s = new EnemyController(); /*Size visibleSize = ParameterManager::getVisibleSize(); //int x = rand() % (int(visibleSize.width) - 100) + 100; //int y = rand() % (int(visibleSize.height) - 100) + 100; int x = 300; int y = 200; //auto aSprite = (EnemyController*)Sprite::createWithSpriteFrameName(Constant::getEnemyFrameName()); auto aSprite = new EnemyController(); aSprite->initWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName(Constant::getEnemyFrameName())); aSprite->autorelease(); auto aBody = PhysicsBody::createCircle(aSprite->getContentSize().width / 2); aBody->setRotationEnable(false); aSprite->setPhysicsBody(aBody); aSprite->setPosition(x, y); aSprite->setAnchorPoint(Vec2(0, 0)); aSprite->getPhysicsBody()->setContactTestBitmask(0x0000F00F); aSprite->getPhysicsBody()->setCategoryBitmask(0x0000F00F); auto animation = AnimationCache::getInstance()->getAnimation(Constant::getEnemyAnimationName()); aSprite->runAction(RepeatForever::create(Animate::create(animation))); aSprite->runAction(MoveTo::create(ParameterManager::getEnemyMovingTime() * x / visibleSize.width, Vec2(0,30))); aSprite->getPhysicsBody()->getFirstShape()->setTag(Constant::getEnemyTag()); return aSprite;*/ auto t = new Enemy(); auto i = new Enemy(); i->createEnemy(1000, 200, 1, 1); t->createEnemy(500, 200, 2,2); s->addChild(t); s->addChild(i); return s; }
void World::handleEvent(sf::Event const& event) { // Zoom sf::View& view = rd::Renderer::getView(); if (event.type == sf::Event::MouseWheelScrolled && event.mouseWheelScroll.wheel == sf::Mouse::VerticalWheel) { if (event.mouseWheelScroll.delta < 1) { if (view.getSize().x < 1024.f) view.zoom(1.2f); } else { if (view.getSize().x > 320.f) view.zoom(0.8f); } } // Get a BOW if (event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::W) { Weapon::Ptr w = std::make_shared<Weapon>(); w->setType(Weapon::Type::Bow); w->setDamage(20,25); mEntities.get(1)->getComponent<WeaponComponent>().setWeapon(w); } // Get a SWORD if (event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::X) { Weapon::Ptr w = std::make_shared<Weapon>(); w->setType(Weapon::Type::Sword); w->setDamage(20,25); mEntities.get(1)->getComponent<WeaponComponent>().setWeapon(w); } // Spawn an Enemy if (event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::A) { createAlly(ah::Application::instance().getMousePositionView(rd::Renderer::getView())); } if (event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::E) { createEnemy(ah::Application::instance().getMousePositionView(rd::Renderer::getView())); } mEntities.getSystem<PlayerControllerSystem>().handleEvent(event); }
Level::Level(HGE* _hge, int xRes, int yRes) { hge = _hge; this->xRes = xRes; this->yRes = yRes; //set up level gravity = new hgeVector(0,5); terrain = new Terrain(xRes,yRes,_hge); font = new hgeFont("font.fnt", true); //set up gfx particleManager = new hgeParticleManager(); HTEXTURE texture = hge->Texture_Load("ships.png"); hgeSprite* sprite = new hgeSprite(texture, 0,0,30,30); sprite->SetHotSpot(15, 15); collisionLarge = new hgeParticleSystem("particle9.psi", sprite); //create a player & enemy createPlayer(xRes/2, yRes/2); createEnemy(100, 100); }
void EnemyGenerator::generateEnemies(std::list<Enemy *> *enemies) { // 出現する敵がもういない if (mNextAppearance.x > 9999) { return; } if (mFrameCount >= mNextAppearance.frame) { for (int i = 0; i < mNextAppearance.size; i++) { Enemy *enemy = createEnemy(&mNextAppearance, i); enemies->push_back(enemy); } if (mCurrentPos >= mAppearances.size()) { mNextAppearance.x = 10000; } else { mNextAppearance = mAppearances[mCurrentPos++]; } } mFrameCount++; }
int createSpecificEnemy(TypeOfEnemy eType, int lvl, int entranceNum) { Enemy e = createEnemy(); switch (eType) { case intBasic : initialiseEnemy(e, lvl, INT_TYPE, eType, INT_BASIC_HEALTH, INT_BASIC_ARMOUR, INT_BASIC_SPEED, INT_BASIC_DAMAGE, INT_BASIC_HEIGHT, INT_BASIC_WIDTH); break; case intHeavy : initialiseEnemy(e, lvl, INT_TYPE, eType, INT_HEAVY_HEALTH, INT_HEAVY_ARMOUR, INT_HEAVY_SPEED, INT_HEAVY_DAMAGE, INT_HEAVY_HEIGHT, INT_HEAVY_WIDTH); break; case charBasic : initialiseEnemy(e, lvl, CHAR_TYPE, eType, CHAR_BASIC_HEALTH, CHAR_BASIC_ARMOUR, CHAR_BASIC_SPEED, CHAR_BASIC_DAMAGE, CHAR_BASIC_HEIGHT, CHAR_BASIC_WIDTH); break; case charHeavy : initialiseEnemy(e, lvl, CHAR_TYPE, eType, CHAR_HEAVY_HEALTH, CHAR_HEAVY_ARMOUR, CHAR_HEAVY_SPEED, CHAR_HEAVY_DAMAGE, CHAR_HEAVY_HEIGHT, CHAR_HEAVY_WIDTH); break; default : fprintf(stderr,"ERROR**** incorrect value for TypeOfEnemy (value = %d) passed to createSpecificEnemy() ****\n", eType); exit(1); } return e->enemyID; }
void drawElements(Map * level[6],int xPos,int yPos, Player * chris, int room, int width, int height, Enemy * enemy[20], int * eneNum) { //decalre variables int xLoc, yLoc, exDigit, i; exDigit = 0; //create elements for (i = 0;i <= level[room]->eleNum;i++) { //if door if (level[room]->elements[i][0] == 'd') { //draw door drawDoor(xPos, yPos, level, room, width, height, i); }//end if door //any other element else { //parse element location yLoc = level[room]->elements[i][1] - '0'; if((level[room]->elements[i][2] <= '9') && (level[room]->elements[i][2] >= '0')) { yLoc = ((level[room]->elements[i][1] - '0') * 10) + (level[room]->elements[i][2] - '0'); exDigit = 1; } xLoc = level[room]->elements[i][3+exDigit] - '0'; if((level[room]->elements[i][4 + exDigit] <= '9') && (level[room]->elements[i][4 + exDigit] >= '0')) { xLoc = ((level[room]->elements[i][3 + exDigit] - '0') * 10) + (level[room]->elements[i][4 + exDigit] - '0'); } //reset variable exDigit = 0; //hero special case (sets initial hero data) if (level[room]->elements[i][0] == 'h') { createPlayer(level[room]->elements[i], room, chris, level, xLoc, yLoc); } //print element to screen mvaddch((yPos + yLoc), (xPos + xLoc), getFig(level[room]->elements[i][0])); //enemy special case (sets enemy data) if(level[room]->elements[i][0] == 'm' || level[room]->elements[i][0] == 'M') { createEnemy(level[room]->elements[i], room, enemy, *eneNum, level, xLoc, yLoc); (*eneNum)++; } } }//end element loop }//end drawElements
void GameStart::execute(HelloWorld* s) { //!清除超过屏幕的子弹 auto layer=s->playerlayer; for(auto i=layer->bullets.begin(); i!=layer->bullets.end();) { if((*i)->getPositionY()>810) { (*i)->removeFromParent(); i=layer->bullets.erase(i); } else { i++; } } //!清除超过屏幕的敌机 auto layer1=s->enemylayer; for(auto i=layer1->enemyNum.begin(); i!=layer1->enemyNum.end();) { if((*i)->getPositionY()<-15) { (*i)->removeFromParent(); i=layer1->enemyNum.erase(i); } else { i++; } } //!消灭生命值低于零的死亡敌机 for(auto i=layer1->deadEnemy.begin(); i!=layer1->deadEnemy.end();) { auto life=(int)(*i)->getUserData(); if(life<0) { (*i)->removeFromParent(); i=layer1->deadEnemy.erase(i); } else { i++; } } //!滚动背景图片 s->updateBackGround(); //// layer1->addTime(Director::getInstance()->getDeltaTime()); //!添加敌机 if(layer1->onTime()) { layer1->createEnemy(); layer1->setTime(0); } //!检测炸弹是否启动 auto goodslayer=s->goodslayer; if(goodslayer->getIsEexplosion()) { //!计算所有被消灭的敌机分数 int score1=0; for(auto i=layer1->enemyNum.begin(); i!=layer1->enemyNum.end();) { auto point1=(*i)->getPositionY(); if(point1<800) { int life=(int)(*i)->getUserData(); score1+=life; //!设置死亡敌机消失时间 life=50; (*i)->setUserData((void*)life); (*i)->stopAllActions(); (*i)->getChildByTag(1)->setVisible(true); //!将死亡的敌机放到死亡容器中 layer1->deadEnemy.pushBack(*i); i=layer1->enemyNum.erase(i); } else { i++; } } score1+=s->getScore(); s->setScore(score1); goodslayer->setExplosion(false); } //!添加子弹 layer->update(Director::getInstance()->getDeltaTime()); ///////////////////////////////////////////////////// //////////////////////////////////////////////////// //!碰撞检测 //先判断玩家是否与敌机相撞 auto es=layer1->enemyNum; for(auto i=es.begin(); i!=es.end(); ++i) { auto rect1=(*i)->getBoundingBox(); auto rect2=layer->getPlaneRect(); if(rect1.intersectsRect(rect2)) { //!跳转到游戏结束状态 layer->getPlayer()->getChildByTag(1)->setVisible(true); s->changeState(GameOver::getInstance()); return; } } //!子弹与敌机的碰撞检测 for(auto i=layer1->enemyNum.begin(); i!=layer1->enemyNum.end(); ++i) { for(auto y=layer->bullets.begin(); y!=layer->bullets.end();) { auto rect1=(*i)->getBoundingBox(); auto rect2=(*y)->getBoundingBox(); int life=(int)(*i)->getUserData(); if(rect1.intersectsRect(rect2)) { (*y)->removeFromParent(); y=layer->bullets.erase(y); life--; (*i)->setUserData((void*)life); s->scorePlus(); s->updateScore(); } else { y++; } } } //!将生命值为0的敌机添加到死亡列表里 for(auto i=layer1->enemyNum.begin(); i!=layer1->enemyNum.end();) { int life=(int)(*i)->getUserData(); if(life<=0) { life=50; (*i)->stopAllActions(); (*i)->setUserData((void*)life); (*i)->getChildByTag(1)->setVisible(true); layer1->deadEnemy.pushBack(*i); i=layer1->enemyNum.erase(i); } else { i++; } } //!更新所有死亡的敌机集合 for (auto i=layer1->deadEnemy.begin(); i!=layer1->deadEnemy.end(); ++i) { int life=(int)(*i)->getUserData(); life--; (*i)->setUserData((void*)life); } }
int main(int argc, char* argv[]) { // Init initPath(argv[0]); SDL_Surface* screen = NULL; SDL_Event event; int *seed; srand((int)seed); int previousTime = 0, currentTime = 0; Events *flags = createEventFlags(); SDL_Init(SDL_INIT_VIDEO); SDL_SetEventFilter(eventFilter); screen = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE | SDL_ASYNCBLIT | SDL_DOUBLEBUF | SDL_NOFRAME); SDL_WM_SetCaption("Tower Defense", NULL); Action *actionList = initAction(); Map* map = createMap(getPath("resources/Forest.png")); _map = map; SDL_Rect surface = {0, 0, 720, 600}; Viewport* viewport = createViewport(screen, surface, map); _viewport = viewport; // FIXME uh? what's this thing? surface.x = 800 - 80; surface.y = 0; surface.h = 80; surface.w = 600; // Creation of the enemies TypeEn *whiteCat = createTypeEn(100, 5, false, true, true, false, 1,getPath("resources/white_transparent_cat.png")); TypeEn *blackCat = createTypeEn(100, 5, false, true, true, false, 1,getPath("resources/black_transparent_cat.png")); Enemy *cat1 = createEnemy(1,1,whiteCat); Enemy *cat2 = createEnemy(1,10,whiteCat); Enemy *cat3 = createEnemy(5,5,blackCat); Enemy *cat4 = createEnemy(21,4,blackCat); TypeEn *zombie = createTypeEn(100,5,false,true,true,false,1,getPath("resources/zombie.png")); Enemy *zombie1 = createEnemy(4,4,zombie); Enemy *zombie2 = createEnemy(9,4,zombie); Enemy *zombie3 = createEnemy(9,9,zombie); Enemy *zombie4 = createEnemy(7,14,zombie); //Add enemy in the List List *catList = newList(cat4); pushList((void*)catList,cat2); pushList((void*)catList,cat3); // pushList((void*)catList,cat1); List *zombieList = newList(zombie1); /* pushList((void*)zombieList,zombie2);*/ /* pushList((void*)zombieList,zombie3);*/ /* pushList((void*)zombieList,zombie4);*/ // removeEnemyFromList(cat4,catList); //TOWER TypeBul *bullet = createTypeBul(getPath("resources/bullet.png"), 1); TypeTo *tower = createTypeTo(0,5,0,0,false,false,false,false,bullet,NULL,getPath("resources/tower.png")); upgradeTypeTo(tower,0.5,getPath("resources/towerUP.png")); flags->selectedTower = tower->nextType; Tower *tower1 = createTower(7,7,tower); List *towerList = newList(tower1); flags->towerList = towerList; // Create and Renders the right panel game menu SDL_Rect surfaceMenu = {720, 0, 800, 600}; Menu* menu = menu_create(screen, surfaceMenu); menu_loadBackground(menu, "resources/enemyFont.gif"); // For testing only, we add a few random buttons menu_addButton(menu, button_createBuildButton(tower)); menu_addButton(menu, button_createBuildButton(tower)); menu_addButton(menu, button_createBuildButton(tower)); menu_render(menu); _cell = *getCase(20,11); // Main loop while(actionList[QUIT].boolean == NULL) { // Managing the events manageEvents(viewport, flags,actionList); for(int i=1; i<ACTION_LENGTH; i++) { if(actionList[i].boolean) { int repeat = (*actionList[i].action)(viewport,flags,actionList[i].boolean); if(!repeat) { actionList[i].boolean = NULL; } } } // Redraws the map (viewport contents) before blitting stuff on it updateViewport(viewport); ///////////////////////////// DEBUG WALL ///////////////////////////// SDL_Rect position; for(int i=0; i < _map->nbCaseW; i++) { for(int j=0; j < _map->nbCaseH; j++) { Case cell = *getCase(i,j); position.x = cell.x; position.y = cell.y; if(map->matrice[i][j].hasTower == 2) { SDL_Surface *wall = IMG_Load(getPath("resources/brick.png")); blitToViewport(viewport, wall, NULL, &position); } } } position.x = _cell.x; position.y = _cell.y; blitToViewport(viewport, IMG_Load(getPath("resources/candy_cane.png")), NULL, &position); ///////////////////////////////////////////////////////////////////// // Move enemies if(flags->enemy_Path_Calculation) { pathReCalculation(catList); pathReCalculation(zombieList); flags->enemy_Path_Calculation = false; } moveEnemyList(zombieList); moveEnemyList(catList); // Blit enemies drawEnemyList(zombieList); drawEnemyList(catList); //Blit TOWER /* if(event.key.keysym.sym == SDLK_u){*/ /* upgrade(tower1);*/ /* }*/ Bullet *bullet1 = createBullet(tower1); animateBullet(bullet1); drawTowerList(towerList); /* This should be handled by event.c switch(event.key.keysym.sym){ case SDLK_a: flags->selectedTower = tower; break; case SDLK_b: flags->selectedTower = tower->nextType; break; default: break; }*/ /* */ // Ask SDL to swap framebuffers to update the displayed screen SDL_Flip(screen); // Managing frames currentTime = SDL_GetTicks(); if (currentTime - previousTime <= 20) { SDL_Delay(20 - (currentTime - previousTime)); } // DEBUG printf("Frame %i : %ims\n", framecounter++, currentTime - previousTime); previousTime = SDL_GetTicks(); } free(actionList); SDL_Quit(); return EXIT_SUCCESS; }
/* Gera um novo nivel */ Nivel genNivel(int level, Player* player, Enemy* enemies){ Nivel nivel; clear(); move(0,0); /* Escolhe um tamanho aleatorio para o mapa */ do{ nivel.tamI = rand() % 26; }while(nivel.tamI < 21); do{ nivel.tamJ = rand() % 51; }while(nivel.tamJ < 46); int tamI = nivel.tamI; int tamJ = nivel.tamJ; for(int i = 0; i < tamI; i++){ for(int j = 0; j < tamJ; j++) nivel.mapa[i][j].shown = 0; } nivel.nivel = level; nivel.inimigos = 0; /* Gera o mapa aleatoriamente (apenas muros e espacos vazios) */ genRoom(&nivel); /* Inicializa as posicoes do mapa */ for(int i = 0; i < tamI; i++){ for(int j = 0; j < tamJ; j++){ if(nivel.mapa[i][j].shown == 1){ nivel.mapa[i][j].used = 1; nivel.mapa[i][j].enemyIndice = -1; nivel.mapa[i][j].itemIndice = -1; nivel.mapa[i][j].player = 0; nivel.mapa[i][j].wall = 1; nivel.mapa[i][j].stairs = 0; nivel.mapa[i][j].quantItems = 0; } else{ nivel.mapa[i][j].used = 0; nivel.mapa[i][j].enemyIndice = -1; nivel.mapa[i][j].itemIndice = -1; nivel.mapa[i][j].player = 0; nivel.mapa[i][j].wall = 0; nivel.mapa[i][j].stairs = 0; nivel.mapa[i][j].quantItems = 0; } } } /* Posiciona a escada para o proximo nivel*/ int stairsI, stairsJ; do{ stairsI = rand() % tamI; stairsJ = rand() % tamJ; }while(nivel.mapa[stairsI][stairsJ].used == 1); nivel.mapa[stairsI][stairsJ].used = 1; nivel.mapa[stairsI][stairsJ].stairs = 1; for(int i = stairsI - 1; i <= stairsI + 1; i++){ for(int j = stairsJ - 1; j <= stairsJ + 1; j++){ if(nivel.mapa[i][j].wall == 1){ if((i > 0) && (i < tamI - 1) && (j > 0) && (j < tamJ - 1)){ nivel.mapa[i][j].used = 0; nivel.mapa[i][j].wall = 0; } } } } /* Posiciona boss do nivel */ int flag = 0; if(flag == 0){ if(stairsI - 1 > 0){ nivel.mapa[stairsI - 1][stairsJ].enemyIndice = 0; nivel.mapa[stairsI - 1][stairsJ].used = 1; nivel.inimigos++; enemies[0] = createEnemy(1, stairsI - 1, stairsJ, nivel.nivel); } else flag = 1; } if(flag == 1){ if(stairsI + 1 < tamI - 1){ nivel.mapa[stairsI + 1][stairsJ].enemyIndice = 0; nivel.mapa[stairsI + 1][stairsJ].used = 1; nivel.inimigos++; enemies[0] = createEnemy(1, stairsI + 1, stairsJ, nivel.nivel); } else flag = 2; } if(flag == 2){ if(stairsJ - 1 > 0){ nivel.mapa[stairsI][stairsJ - 1].enemyIndice = 0; nivel.mapa[stairsI][stairsJ - 1].used = 1; nivel.inimigos++; enemies[0] = createEnemy(1, stairsI, stairsJ - 1, nivel.nivel); } else flag = 3; } if(flag == 3){ if(stairsJ + 1 < tamJ - 1){ nivel.mapa[stairsI][stairsJ + 1].enemyIndice = 0; nivel.mapa[stairsI][stairsJ + 1].used = 1; nivel.inimigos++; enemies[0] = createEnemy(1, stairsI, stairsJ + 1, nivel.nivel); } } /* Posiciona o jogador e garante que ele nao esta encostado em um muro (isso pode atrapalhar movimento em corredores) */ do{ (*player).y = rand() % tamI; (*player).x = rand() % tamJ; }while((nivel.mapa[player->y][player->x].used == 1) || (!distancia(player->y, player->x, stairsI, stairsJ, tamI * tamJ))); nivel.mapa[player->y][player->x].used = 1; nivel.mapa[player->y][player->x].player = 1; nivel.mapa[player->y][player->x].stairs = -1; for(int i = player->y - 1; i <= player->y + 1; i++){ for(int j = player->x - 1; j <= player->x + 1; j++){ if(nivel.mapa[i][j].wall == 1){ if((i > 0) && (i < tamI - 1) && (j > 0) && (j < tamJ - 1)){ nivel.mapa[i][j].used = 0; nivel.mapa[i][j].wall = 0; } } } } enemyPositions(nivel, enemies); return nivel; }