Пример #1
0
/**
 * 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;
        }
    }
}
Пример #2
0
/*
* 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." );

}
Пример #3
0
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;
}
Пример #4
0
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())));
		}
	}
};
Пример #5
0
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;
        }
    
    }

};
Пример #6
0
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);


}
Пример #7
0
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
}
Пример #8
0
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;
}
Пример #9
0
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;
}
Пример #10
0
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);
}
Пример #11
0
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);
}
Пример #12
0
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++;
}
Пример #13
0
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;
}
Пример #14
0
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
Пример #15
0
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);
    }
}
Пример #16
0
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;
}
Пример #17
0
/* 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;
}