Esempio n. 1
0
/**
* Attempt to move the player as instructed
*
* @param dungeon A pointer to the dungeon
* @param move The move to make
*
* @return RESULT_WIN if the player has won the game
*         RESULT_DIE if the player has died in the game
*         INVALID_MOVE if the move is invalid
*         else 0
*/
int makeMove(Dungeon* dungeon, char move) {
    Object *player;
    int result=0;
    int len;

    if(!dungeon->moveList) {
        dungeon->moveList = malloc(EXTEND_MOVE*4+1);
        bzero(dungeon->moveList, EXTEND_MOVE*4+1);
    }

    len = cgc_strlen(dungeon->moveList);
    sprintf(&dungeon->moveList[len], "!H", (unsigned char) move);

    if(!(player = getObjectById(dungeon->start, PLAYER_NUM)))
        _terminate(OBJECT_NOT_FOUND_ERROR);

    if(move == dungeon->moveTypes.left) {
        player->direction->x = 0;
        if((result = moveLeft(dungeon, player)))
            return result;
        if((result = moveEnemies(dungeon, player->moves)))
            return result;
        sendCurrentDungeonView(dungeon->start);
        if((result = checkFloor(dungeon, player)))
            return result;
    } else if(move == dungeon->moveTypes.right) {
        player->direction->x = 0;
        if((result = moveRight(dungeon, player)))
            return result;
        if((result = moveEnemies(dungeon, player->moves)))
            return result;
        sendCurrentDungeonView(dungeon->start);
        if((result = checkFloor(dungeon, player)))
            return result;
    }
    else if(move == dungeon->moveTypes.jump)
        return jump(dungeon, player);
    else if (move == dungeon->moveTypes.jumpleft)
        return jumpLeft(dungeon, player);
    else if (move == dungeon->moveTypes.jumpright)
        return jumpRight(dungeon, player);
    else if (move == dungeon->moveTypes.wait) {
        addMove(dungeon, player, dungeon->moveTypes.wait);
        if((result = moveEnemies(dungeon, player->moves)))
            return result;
        sendCurrentDungeonView(dungeon->start);
        return 0;
    } else
        return INVALID_MOVE;

    return 0;

}
Esempio n. 2
0
void Bakoom::timerEvent(QTimerEvent *event)
{
    // create random scenery
    createRandomScenery();
    // level 6 and 7 enemy spawns
    if(level >= 6)
        for(int i = 0; i < enemies_.size(); i++)
            if(rand()%1000 < 5 && enemies_.size() <= 12) enemies_.push_back(new Interceptor(enemies_.at(i)->getRect().x(), enemies_.at(i)->getRect().y()));
    // move scenery
    for(int i = 0; i < scenery_.size(); i++)
        scenery_.at(i)->autoMove();
    // move enemies
    moveEnemies();
    // make enemies shoot
    createEnemyProjectiles();
    // automove credits
    for(int i = 0; i < credits_.size(); i++)
        credits_.at(i)->autoMove();
    // automove medipaks_
    for(int i = 0; i < medipaks_.size(); i++)
        medipaks_.at(i)->autoMove();
    // automove projectiles_
    for(int i = 0; i < projectiles_.size(); i++)
    {
        // homing projectiles_
        if(projectiles_.at(i)->isHoming())
        {
            int proj_x = projectiles_.at(i)->getRect().x(), proj_y = projectiles_.at(i)->getRect().y();
            int enem_x = nearestEnemyTo(proj_x, proj_y)->getRect().x(), enem_y = nearestEnemyTo(proj_x, proj_y)->getRect().y();
            if(distanceBetween(enem_x, enem_y, proj_x, proj_y) < 250)
            {
                if(projectiles_.at(i)->isEnemyProjectile())
                    enem_x = player_ ->getRect().x();
                if(enem_x+40 > proj_x) projectiles_.at(i)->setXdir(1);
                else if(enem_x-40 < proj_x) projectiles_.at(i)->setXdir(-1);
                else projectiles_.at(i)->setXdir(0);
            }
        }
        projectiles_.at(i)->autoMove();
    }
	checkCollision();
	checkOutOfBounds();
	deleteDead();
    // check for win condition
    if(enemies_.size() == 0 && credits_.size() == 0)
    {
        shield = player_ ->getHealth();     // update shield variable before exiting
        qApp->exit();
    }
    // auto heal if applicable
    if(hasItem[15])
        autoHeal();
    playerKeyEvents();
	//deleteDead();
    // move player
    player_->autoUpdateRect();
    spawnMedipaks();
	repaint();
}
void gameClass::update(float deltaTime) {
		
	if (newLevel)
		{
		currentLevel++;
		enemies.clear();
		projectiles.clear();
		player->tile.resetPos(mapLevel[currentLevel].getEntrancePos());
		renderer->resetCam(player->tile.getPos(), player->tile.getSize());
		newLevel = false;
	}

	renderer->getCam(renderingPort.x, renderingPort.y);
	renderingPort *= -1;

	spawnTimer += deltaTime;
	projectileTimer += deltaTime;

	moveEnemies(deltaTime);

	if (spawnTimer > Constants::spawnRate) {
		spawnEnemies();
		spawnTimer = 0;
	}

	moveProjectiles(deltaTime);
	
	if(player->getHealth() <= 0)
	{
		if(!isPlayerDead)
		{
			animationTime = 0.0f;
			player->resetIndex();
			isPlayerDead = true;
			player->setCurrentAction("tipping over");
			SoundEngine->play2D("audio/Sound Effect (31).wav", GL_FALSE);
		}

		animationTime += deltaTime;

		if (animationTime >= Constants::animationFrameTime) 
		{
			animationTime = 0.0f;
			player->increaseIndex();
		}
	}
}
Esempio n. 4
0
/**
* Attempt to jump JUMP_HEIGHT spaces up and return to starting position
* NOTE: If there are not JUMP_HEIGHT spaces, player will stay at the highest
*       point until JUMP_HEIGHT moves upward have been made. The player will
*       then move down until the floor is reached.
*
* @param dungeon A pointer to the dungeon
* @param dungeon A pointer to the object to move
*
* @return RESULT_WIN if the player has won the game
*         RESULT_DIE if the player has died in the game
*         else 0
*/
int jump(Dungeon* dungeon, Object* object) {
    int result=0;
    object->direction->x = 0;
    object->direction->y = DIR_UP;
    for(int up=1; up<=JUMP_HEIGHT; up++) {
        if(object->id == PLAYER_NUM)
            addMove(dungeon, object, dungeon->moveTypes.jump);
        if((result = moveUp(dungeon, object)))
            return result;
        if((result = moveEnemies(dungeon, object->moves)))
            return result;
        sendCurrentDungeonView(dungeon->start);
    }

    object->direction->y = DIR_DOWN;
    if((result = checkFloor(dungeon, object)))
        return result;

    return 0;
}
Esempio n. 5
0
/**
* Attempt to jump JUMP_HEIGHT spaces up and to the left
* NOTE: If there are not JUMP_HEIGHT spaces, player will stay at the highest
*       point until JUMP_HEIGHT moves upward have been made. The player will
*       then move down until the floor is reached. Player will move left a
*       space for each move up and down unless a wall or floor is hit.
*
* @param dungeon A pointer to the dungeon
* @param dungeon A pointer to the object to move
*
* @return RESULT_WIN if the player has won the game
*         RESULT_DIE if the player has died in the game
*         else 0
*/
int jumpRight(Dungeon* dungeon, Object* object) {
    int result=0;

    object->direction->y = DIR_UP;
    object->direction->x = DIR_RIGHT;
    for(int up=1; up<=JUMP_HEIGHT; up++) {
        if((result = moveUp(dungeon, object)))
            return result;
        if((result = moveRight(dungeon, object)))
            return result;
        if((result = moveEnemies(dungeon, object->moves)))
            return result;
        sendCurrentDungeonView(dungeon->start);
    }

    object->direction->y = DIR_DOWN;
    if((result = checkFloor(dungeon, object)))
        return result;

    object->direction->x = 0;

    return 0;
}
Esempio n. 6
0
/**
* Check if the object is standing on a floor object, if not move player
*
* @param dungeon A pointer to the dungeon and game info
* @param object The object to check
*
* @return RESULT_WIN if the player has won the game
*         RESULT_DIE if the player has died in the game
*         else 0
*/
int checkFloor(Dungeon *dungeon, Object* object) {
    Object* floor_obj;
    Coordinate floor_coord;
    int result=0;

    floor_coord.x = object->position->x;
    floor_coord.y = object->position->y+1;
    if(!(floor_obj = getObjectByCoord(dungeon->start, floor_coord)))
        _terminate(OBJECT_NOT_FOUND_ERROR);

    if(object->direction->x == 0) {
        while(floor_obj->id > WALL_NUM) {
            if((result = moveDown(dungeon, object)))
                return result;
            if(object->id == PLAYER_NUM) {
                addMove(dungeon, object, dungeon->moveTypes.left);
                if((result = moveEnemies(dungeon, object->moves)))
                    return result;
                sendCurrentDungeonView(dungeon->start);
            }
            floor_coord.x = object->position->x;
            floor_coord.y = object->position->y+1;
            if(!(floor_obj = getObjectByCoord(dungeon->start, floor_coord)))
                _terminate(OBJECT_NOT_FOUND_ERROR);
        }
    } else if(object->direction->x == DIR_LEFT) {
        while(floor_obj->id > WALL_NUM) {
            if((result = moveDown(dungeon, object)))
                return result;
            if((result = moveLeft(dungeon, object)))
                return result;
            if(object->id == PLAYER_NUM) {
                if((result = moveEnemies(dungeon, object->moves)))
                    return result;
                sendCurrentDungeonView(dungeon->start);
            }
            floor_coord.x = object->position->x;
            floor_coord.y = object->position->y+1;
            if(!(floor_obj = getObjectByCoord(dungeon->start, floor_coord)))
                _terminate(OBJECT_NOT_FOUND_ERROR);
        }
    } else if(object->direction->x == DIR_RIGHT) {
        while(floor_obj->id > WALL_NUM) {
            if((result = moveDown(dungeon, object)))
                return result;
            if((result = moveRight(dungeon, object)))
                return result;
            if(object->id == PLAYER_NUM) {
                if((result = moveEnemies(dungeon, object->moves)))
                    return result;
                sendCurrentDungeonView(dungeon->start);
            }
            floor_coord.x = object->position->x;
            floor_coord.y = object->position->y+1;
            if(!(floor_obj = getObjectByCoord(dungeon->start, floor_coord)))
                _terminate(OBJECT_NOT_FOUND_ERROR);
        }
    }

    return 0;

}
Esempio n. 7
0
void mode1Loop(Input *pIn,GameOptions* pGameOptions,Screen* pScreen, GameState* pGameState){
	MusicManager musicManager;
	audioInitialization(&musicManager);
	Mix_PlayMusic(musicManager.music[musicManager.currentMusic], -1); //Jouer infiniment la musique
	
	TTFManager ttfManager;
	ttfInitialization(pScreen,&ttfManager);
	initPauseText(pScreen, &ttfManager);
	
	Character character;
	characterInitialization(&character,pScreen);
	
	Enemies enemies;
	enemiesInitialization(&enemies,pScreen);
	Unit seed;
	initSeed(&seed,pScreen);
	randomMove(&seed);
	
	Collision collision;
	
	TimeManager timeManager;
	timeManager.debutTicks = (long) SDL_GetTicks();
	timeManager.playingTime=0;

	long frame = 0;
	long frameTime = 0;
	long delay = 0;
	int score = 0;
	Texte scoreTexte = {0};
	scoreTexte.rec.x=865;
	scoreTexte.rec.y=580;
	scoreTexte.rec.w=0;
	scoreTexte.rec.h=30;
	
	
	pGameState->lost = 0;
	//On set la taille du BG du mode
	pGameOptions->BGRec.x = 0;
	pGameOptions->BGRec.y = 0;
	pGameOptions->BGRec.w = PLAYING_AREA_WIDTH;
	pGameOptions->BGRec.h = PLAYING_AREA_HEIGHT;
	updateTTFManager(pScreen,&ttfManager,&timeManager,&enemies);
	updateSeedScore(pScreen, &scoreTexte, score, &ttfManager);

	while(!pGameState->menu && !pIn->quit && !pGameState->lost){
		frameTime = (long) SDL_GetTicks();
		frame++;
		
		updateInput(pIn);
		checkCollision(&character,&enemies,&collision,pGameState);
		moveEnemies(&enemies);
		moveCharacter(pIn,&collision,&character);
		//On ajoute un ennemi régulièrement
		if (frame%240 == 0){
			addOneEnemy(&enemies);
		}
		//On met à jours l'afficheur du temps de jeu mais pas trop souvent
		if(frame%20 == 0){
		      updateTTFManager(pScreen,&ttfManager,&timeManager,&enemies);
		}
		//Est ce que le joueur à trouver une seed ?
		if(checkUnitCollisionWIthCharacter(&seed, &character)){
			score ++;
			randomMove(&seed);
			updateSeedScore(pScreen, &scoreTexte, score, &ttfManager);
		}
		//On affiche l'ensemble
		SDL_RenderClear(pScreen->renderer);
		updateScreen(&character,&enemies,pScreen,&ttfManager,pGameOptions);
		SDL_RenderCopy(pScreen->renderer,seed.pTexture, NULL, &seed.rec);
		SDL_RenderCopy(pScreen->renderer,scoreTexte.pTexture, NULL, &scoreTexte.rec);
		SDL_RenderPresent(pScreen->renderer);
		//Si on vérifie si le joueur veux mettre en pause(P) ou quitter (Q)
		if(pIn->keys[SDL_SCANCODE_P]){
			pGameState->pause=1;
			pIn->keys[SDL_SCANCODE_P]=0;
		}
		if(pIn->keys[SDL_SCANCODE_Q]){
			pGameState->menu=1;
		}
		
		//boucle de pause
		if(pGameState->pause){
			//il faut arrêter replacer le compteur de temps après la pause
			long pauseDebut = (long) SDL_GetTicks();
			//on print dans le renderer ce qu'on veut afficher pendant la pause
			updateScreen(&character,&enemies,pScreen,&ttfManager,pGameOptions);
			SDL_RenderCopy(pScreen->renderer, ttfManager.pauseTextL1, NULL, &ttfManager.pauseTextL1Rec);
			SDL_RenderCopy(pScreen->renderer, ttfManager.pauseTextL2, NULL, &ttfManager.pauseTextL2Rec);
			SDL_RenderCopy(pScreen->renderer, ttfManager.pauseTextL3, NULL, &ttfManager.pauseTextL3Rec);
			SDL_RenderCopy(pScreen->renderer,seed.pTexture, NULL, &seed.rec);
			pauseLoop(pGameState,pIn,pScreen);
			timeManager.debutTicks += (long) SDL_GetTicks() - pauseDebut;
		}
		
		//Code pour attendre une durée de frame fixe
		delay = pScreen->frameDuration - (long) SDL_GetTicks() + frameTime;
		if (delay > 0) {
			SDL_Delay(delay);
		}
	}
	
	//Si le joueur sort du jeu car il a perdu la partie courante
	if(pGameState->lost){
		pGameState->waiting=1;
		
		//Petit son de défaite 
		Mix_PauseMusic(); 
		Mix_PlayChannel(1, musicManager.sound[0], 0);
		//On print l'affichage de fin de partie
		updateScreen(&character,&enemies,pScreen,&ttfManager,pGameOptions);
		SDL_RenderCopy(pScreen->renderer, ttfManager.playAgain, NULL, &ttfManager.playAgainRec);
		SDL_RenderCopy(pScreen->renderer, ttfManager.BAM, NULL, &ttfManager.BAMRec);
		SDL_RenderCopy(pScreen->renderer,seed.pTexture, NULL, &seed.rec);
		//On attend que l'utilisateur décide de rejouer ou non
		endGameLoop(pIn,pGameState,pScreen);
	}
}
Esempio n. 8
0
void mode0Loop(Input *pIn,GameState *pGameState,Character *pCharacter,Enemies *pEnemies,Screen *pScreen,Collision *pCollision,MusicManager *pMusicManager,TTFManager * pTTFManager,TimeManager *pTimeManager,GameOptions* pGameOptions){
	long frame = 0;
	long frameTime = 0;
	long delay = 0;
	
	enemiesInitialization(pEnemies,pScreen);
	pGameState->lost = 0;
	pTimeManager->debutTicks = (long) SDL_GetTicks();
	pTimeManager->playingTime=0;
	
	Mix_PlayMusic(pMusicManager->music[pMusicManager->currentMusic], -1); //Jouer infiniment la musique
	
	//On set la taille du BG du mode
	pGameOptions->BGRec.x = 0;
	pGameOptions->BGRec.y = 0;
	pGameOptions->BGRec.w = PLAYING_AREA_WIDTH;
	pGameOptions->BGRec.h = PLAYING_AREA_HEIGHT;

	while(!pGameState->menu && !pIn->quit && !pGameState->lost){
		frameTime = (long) SDL_GetTicks();
		frame++;
		
		//On ajoute un ennemi régulièrement
		if (frame%240 == 0){
			addOneEnemy(pEnemies);
		}
		//On vérifie les collisions 
		checkCollision(pCharacter,pEnemies,pCollision,pGameState);
		//On met à jour les entrées claviers
		updateInput(pIn);
		//On déplace les objets du jeu
		moveEnemies(pEnemies);
		moveCharacter(pIn,pCollision,pCharacter);
		//On met à jours l'afficheur du temps de jeu mais pas trop souvent
		if(frame%20 == 0){
			updateTTFManager(pScreen,pTTFManager,pTimeManager,pEnemies);
		}
		//On réaffiche l'ensemble
		SDL_RenderClear(pScreen->renderer);
		updateScreen(pCharacter,pEnemies,pScreen,pTTFManager,pGameOptions);
		SDL_RenderPresent(pScreen->renderer);
		//Si on a appuyé sur p on rentre dans la boucle de pause
		if(pIn->keys[SDL_SCANCODE_P]){
			pGameState->pause=1; 		
			pIn->keys[SDL_SCANCODE_P]=0;
		}
		if(pIn->keys[SDL_SCANCODE_Q]){
			pGameState->menu=1;
		}
		if(pGameState->pause){
			//il faut arrêter replacer le compteur de temps après la pause
			long pauseDebut = (long) SDL_GetTicks();
			//on print dans le renderer ce qu'on veut afficher pendant la pause
			updateScreen(pCharacter,pEnemies,pScreen,pTTFManager,pGameOptions);
			SDL_RenderCopy(pScreen->renderer, pTTFManager->pauseTextL1, NULL, &pTTFManager->pauseTextL1Rec);
			SDL_RenderCopy(pScreen->renderer, pTTFManager->pauseTextL2, NULL, &pTTFManager->pauseTextL2Rec);
			SDL_RenderCopy(pScreen->renderer, pTTFManager->pauseTextL3, NULL, &pTTFManager->pauseTextL3Rec);
			pauseLoop(pGameState,pIn,pScreen);
			pTimeManager->debutTicks += (long) SDL_GetTicks() - pauseDebut;
		}
		
		//Code pour attendre une durée de frame fixe
		delay = pScreen->frameDuration - (long) SDL_GetTicks() + frameTime;
		if (delay > 0) {
			SDL_Delay(delay);
		}
	}
	
	//Le joueur a perdu la partie courante
	if(pGameState->lost){
		pGameState->waiting=1;
		//Petit son de défaite et on stoppe la musique courante 
		Mix_PauseMusic(); 		
		Mix_PlayChannel(1, pMusicManager->sound[0], 0);
		
		if(pMusicManager->currentMusic==0){
			pMusicManager->currentMusic=1;
		}
		else pMusicManager->currentMusic=0;
		
		//On print l'affichage de fin de partie
		updateScreen(pCharacter,pEnemies,pScreen,pTTFManager,pGameOptions);
		SDL_RenderCopy(pScreen->renderer, pTTFManager->playAgain, NULL, &pTTFManager->playAgainRec);
		SDL_RenderCopy(pScreen->renderer, pTTFManager->BAM, NULL, &pTTFManager->BAMRec);
		//On attend que l'utilisateur décide de rejouer ou non
		endGameLoop(pIn,pGameState,pScreen);
		
	}
}
Esempio n. 9
0
//function that is repeatedly called to render the window
void renderWin1(int currentTime, int deltaTime)
{
	Matrix4 vpMatrix, viewMatrix, modelMatrix;
	handleInput(deltaTime);

	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	viewMatrix = camera1->getViewMatrix();
	vpMatrix = projectionMatrix * viewMatrix;
	Matrix4 orthographicMatrix = Matrix4::IDENTITY;
	orthographicMatrix = createOrthographicProjectionMatrix(win1.width, win1.height, -1, 1);
	char buffer[256];

	if (State == "Play"){
		checkEnemyCollision();
		skybox->render_self(projectionMatrix*viewMatrix, camera1->getPosition(), win1.zFar);
		levels[currLevel]->drawLevel(vpMatrix);
		time->setPosition(Vector3(0, -330, 0));

		if (Time >= 59){
			Time -= 59;
			TimeMin++;
		}
		
		if (Time >= 9.0f){
			sprintf(buffer, "Total time : %d:%0.0f", TimeMin, Time);
		}
		else{
			sprintf(buffer, "Total time : %d:0%0.0f", TimeMin, Time);
		}

		std::string timeM(buffer);
		time->render(orthographicMatrix, timeM);
		cylinder1.setPosition((camera1->getPosition()));
		cylinder1.render(vpMatrix);

		for (int i = 0; i < 30; i++){
			if (enemies[i]->getAlive())
				enemies[i]->render(vpMatrix);
			moveEnemies(i);
		}

		if (hasSavePoint){
			saveFlag->setPosition(savePoint);
			saveFlag->render(vpMatrix);
		}
		buffer[256];
		sprintf(buffer, "Stamina: %0.2f", Stamina);
		std::string message(buffer);
		Paused->setPosition(Vector3(-390, -330, 0));
		if (Stamina < 20){
			Paused->setColor(Color(1, 0, 0, 1));
		}
		else if (Stamina < 60){
			Paused->setColor(Color(1, 1, 0, 1));
		}
		else{
			Paused->setColor(Color(0, 1, 0, 1));
		}

		Paused->render(orthographicMatrix, message);
			
		checkNextLevel();
	} else if (State == "Menu") {
		notice->setColor(Color(1, 0, 1, 0));
		notice->setPosition(Vector3(-260, -180, 0));
		notice->render(orthographicMatrix, "ARROWS TO NAVIGATE SPACE TO SELECT");
		Title->render(orthographicMatrix, "Maze Adventures!");
		PlayBut->render(orthographicMatrix, "Play");
		
		if (MenOption == 0)
			PlayBut->setColor(Color(1, 1, 0, 1));
		else
			PlayBut->setColor(Color(1, 1, 1, 200));

		ControlsBut->render(orthographicMatrix, "Controls");
		if (MenOption == 1)
			ControlsBut->setColor(Color(1, 1, 0, 1));
		else
			ControlsBut->setColor(Color(1, 1, 1, 200));

		CreditsBut->render(orthographicMatrix, "Credits");
		if (MenOption == 2)
			CreditsBut->setColor(Color(1, 1, 0, 1));
		else
			CreditsBut->setColor(Color(1, 1, 1, 200));

		Exitbut->render(orthographicMatrix, "Exit");
		if (MenOption == 3)
			Exitbut->setColor(Color(1, 1, 0, 0.1f));
		else
			Exitbut->setColor(Color(1, 1, 1, 200));

		if (isPaused){
			Paused->setPosition(Vector3(-50, -150, 0));
			Paused->setColor(Color(1, 0, 0, 1));
			Paused->render(orthographicMatrix, "PAUSED");
			if (MenOption == 4)
				Restartbut->setColor(Color(1, 1, 0, 1));
			else
				Restartbut->setColor(Color(1, 1, 1, 200));
			Restartbut->render(orthographicMatrix, "Restart Level");

		}
	}
	else if (State == "Controls"){
		Back->setPosition(Vector3(-260, 200, 0));
		Back->render(orthographicMatrix, "BACK");
		Controls1->render(orthographicMatrix, "MOVE: W - Forward, S - Backward");
		Controls2->render(orthographicMatrix, "STRAFE: A - Left, D - Right");
		Controls3->render(orthographicMatrix, "LOOK/TURN: Mouse");
		Controls4->render(orthographicMatrix, "JUMP: Spacebar");
		Controls5->render(orthographicMatrix, "SPRINT: L-Shift");
		Controls6->render(orthographicMatrix, "PLACE SAVE: F - RETURN TO SAVE: G");
	}
	else if (State == "Credits"){
		Back->setPosition(Vector3(-260, 200, 0));
		Credits1->render(orthographicMatrix, "Maze Adventures Created By:");
		Credits2->render(orthographicMatrix, "Joel Scarfone & Alex Carlucci");
		Back->render(orthographicMatrix, "BACK");
	}
	else if (State == "Loading"){
		
		time->setPosition(Vector3(-50, -150, 0));
		sprintf(buffer, "Total time", Time);
		std::string timeM(buffer);
		//time->render(orthographicMatrix, timeM);
		char buffer[256];
		sprintf(buffer, "Level: %d", currLevel + 1);
		std::string message(buffer);
		

		Loading->render(orthographicMatrix, message);
		Back->setPosition(Vector3(-50, -150, 0));
		Back->render(orthographicMatrix, "Start");
	}
	else if (State == "Game_Finished"){
		Paused->setPosition(Vector3(-220, 120, 0));
		Paused->setColor(Color(0, 1, 0, 0));
		Paused->render(orthographicMatrix, "CONGRAGULATION YOU WON!");
		if (Time >= 59){
			Time -= 59;
			TimeMin++;
		}

		if (Time >= 9.0f){
			sprintf(buffer, "Total time: %d:%0.0f", TimeMin, Time);
		}
		else{
			sprintf(buffer, "Total time: %d:0%0.0f", TimeMin, Time);
		}

		std::string timeM(buffer);
		time->render(orthographicMatrix, timeM);
		time->setPosition(Vector3(-150, -150, 0));
	}
	glutSwapBuffers(); //works with GL_DOUBLE. use glFlush(); instead, if using GL_SINGLE
}
Esempio n. 10
0
void run(){
	Display gDisplay;
	Assets gAssets;
	ControlState gControlState;

	SDL_Event e;
	bool quit = false;

	srand(time(NULL));

	if (!initDisplay(&gDisplay)) {
		fprintf(stderr, "ERROR: failed to initialize\n");
		exit(1);
	}

	if (!loadAssets(&gAssets, &gDisplay)) {
		fprintf(stderr, "ERROR: failed to load game assets\n");
		exit(1);
	}

	Player p = P_createPlayer();
	AI *ai = AI_createAI();

	LinkedList playerBulletList = LL_createLinkedList();
	LinkedList enemyBulletList = LL_createLinkedList();
	LinkedList enemyList = LL_createLinkedList();

	Timer fpsCapTimer = T_createTimer();
	Timer gameTimer = T_createTimer();

	unsigned int lastShooting = 0;
	unsigned int lastEnemenySpawn = 0;
	unsigned int check = 0;
	T_start(&gameTimer);
	
	int controlarray[4] = {0};
	SDL_Rect healthbar;
	initialisehealthbar(&healthbar);
	quit = staticscreen(gDisplay.renderer, "Assets/startmenu.bmp");
	
	SDL_Surface* temp;
	SDL_Texture* background;
	temp = SDL_LoadBMP("Assets/background.bmp");
	background = SDL_CreateTextureFromSurface(gDisplay.renderer, temp);
	SDL_FreeSurface(temp);
	temp = NULL;

	/*Event loop*/
	do{
		// start frame timer
		T_start(&fpsCapTimer);
		
		// check for exit event
		SDL_PollEvent(&e);
		quit = (e.type == SDL_QUIT);
		
		// check to open ai interface
		if(e.type == SDL_KEYDOWN){
			if(e.key.keysym.sym == SDLK_ESCAPE){
				quit = openaiscreen(gDisplay.renderer, controlarray);
				e.key.keysym.sym = SDLK_0;
				SDL_PushEvent(&e);
			}
		}

		// move player
		getKeyState(&gControlState);
		getMouseState(&gControlState);

		movePlayer(&p, &gControlState, &gAssets);
		AI_move(ai, P_getPosition(&p));

		if ((check = T_getTicks(&gameTimer)) - lastEnemenySpawn > DEFAULT_SPAWN_INTERVAL) {
			spawnEnemy(&enemyList);
			lastEnemenySpawn = check;
		}
		
		aiaction(ai, &playerBulletList, &enemyList, T_getTicks(&gameTimer), controlarray, &p);

		moveEnemies(&enemyList, P_getPosition(&p));
		enemiesShoot(&enemyList, &enemyBulletList, &p, T_getTicks(&gameTimer));


		if (leftMouseIsDown() && ((check = T_getTicks(&gameTimer)) - lastShooting) > SHOOT_DELAY) {
			double mx = (double)gControlState.mouseX / SCREEN_WIDTH;
    		double my = (double)gControlState.mouseY / SCREEN_HEIGHT;
    		Point origin = P_getPosition(&p);
    		Point destination = {mx, my};
			shootBullet(&playerBulletList, origin, getShotDirection(origin, destination), PLAYER);
			lastShooting = check;
		}

		moveBullets(&playerBulletList);
		moveBullets(&enemyBulletList);

		detectCollision(&playerBulletList, &enemyList, &gAssets);
		detectCollisionPlayer(&enemyBulletList, &p, &gAssets);
		
		/* Update Screen */
		SDL_RenderCopy(gDisplay.renderer, background, NULL, NULL);
		displayhealth(gDisplay.renderer, healthbar, p.health);
		renderBullets(&playerBulletList, &gDisplay, &gAssets, PLAYER);
		renderBullets(&enemyBulletList, &gDisplay, &gAssets, ENEMY);
		renderEnemies(&enemyList, &gDisplay, &gAssets);
		renderPlayer(&gDisplay, &gAssets, &gControlState);
		renderAI(ai, &gDisplay, &gAssets);
		
		// draw screen
		SDL_RenderPresent(gDisplay.renderer);
        delayNextFrame(T_getTicks(&fpsCapTimer));

        if (gameOver(&p)) {
        	printf("GAME OVER\n");
        	quit = staticscreen(gDisplay.renderer, "Assets/gameover.bmp");
			p.health = 100;
        }

	} while (!quit);
	
	/* Memory Cleanup */
	LL_destroyLinkedList(&playerBulletList);
	LL_destroyLinkedList(&enemyBulletList);
	AI_destroyAI(ai);
	SDL_DestroyTexture(background);
	freeAssets(&gAssets);
	closeDisplay(&gDisplay);
}