void ItemFactory::removeExpiredItem(float dt) { //remove all the item that is out of time if (m_pApple) { if (m_pApple->getDuration() <= 0 && !m_bRemovingApple) eatApple(); else { m_pApple->setDuration(m_pApple->getDuration() - dt); } } if (m_pStar) { if (m_pStar->getDuration() <= 0 && !m_bRemovingStar) eatStar(); else m_pStar->setDuration(m_pStar->getDuration() - dt); } if (m_pBall) { if (m_pBall->getDuration() <= 0 && !m_bRemovingBall) eatBall(); else m_pBall->setDuration(m_pBall->getDuration() - dt); } }
///Executa uma fase do jogo no modo story void playOneLevel(int level, int objetivo, int speed, LEVEL_SCENE scenario, int *lifes, int *score) { int rows, columns; //Linhas e colunas do mapa int rocksNum; // Número de pedras int ratsEaten; //Número de ratos int ratNum; //Indica qual o rato a ser gerado, há no máximo 4 ratos na tela int ratsColor; //Cor do rato a ser gerado int i; // Usado nos loops for int cont; //Usado para contabilizar o número de movimentos da snake int actualSpeed; //velocidade que vai sendo aumentada char auxDirection; //recebe direção antes de trocar a direção da snake BOOL isDead; //Flag de morte da snake BOOL levelEnded; //Flag que indica se o nível chegou ao fim BOOL eatenAllRats; //Flag que indica se todos os ratos necessário para gerar a maçã foram comidos char map[ROWSMAX][COLUMNSMAX]; int hasPassed[ROWSMAX*COLUMNSMAX]; //array para indicar as pedras pelas quais a snake passou SNAKE snake; POSN initialCoord; //Coordenada onde a snake começa o nível POSN rocks[ROWSMAX*COLUMNSMAX]; POSN rats[4]; POSN apple = {500, 500}; //coordenada fora do mapa eatenAllRats = 0; ratsEaten = 0; ratNum = 0; ratsColor = GREEN; //primeiro rato é verde cont = 0; isDead = 0; levelEnded = 0; for(i=0; i<rocksNum; i++) hasPassed[i]=0; readMap(level, &rows, &columns, map, &rocksNum, rocks, &initialCoord); print_lvlART(scenario, columns + 5, 0); restartLevel(&snake, columns, rows, rats, speed, &actualSpeed, initialCoord, &eatenAllRats); fadeIN(rows, columns, GREY, 1); printMap(rows, columns, map, scenario.color); printRocks(rows, columns, rocksNum, rocks, map); printSnake(&snake); printInfo(level, *lifes, *score, ratsEaten, objetivo); getch(); //pausa o jogo while(*lifes > 0 && levelEnded == 0) { for(i=0; i<rocksNum; i++) { if(hasPassed[i] != 0) hasPassed[i] += 1; } print_lvlART(scenario, columns + 5, 0); printInfo(level, *lifes, *score, ratsEaten, objetivo); eraseTrail(snake); updateSnakeCoord(&snake); printSnake(&snake); checkColision(&snake, &isDead, rows, columns, map, rocks, rocksNum, hasPassed, score); teleport(&snake, rows, columns); if(*score < 0) { *score = 0; //Não há score negativo! } cont++; //conta o número de movimentos if(cont % 10 == 0 && ratsEaten < objetivo) //a cada 10 movimentos gera um rato, se não for atingido o objetivo { makeRats(rows, columns, rats, ratNum, &snake, map, &ratsColor); ratNum++; if(ratNum == 4) { ratNum = 0; } } eatRat(&snake, rats, &ratsEaten, score, level); eatApple(&snake, &apple, score, &levelEnded); if(ratsEaten >= objetivo && eatenAllRats == 0) //gera maçã se forem comidos todos os ratos necessários { eatenAllRats = 1; makeApple(rows, columns, &apple, rats, ratNum, &snake, map); } if(isDead || snake.size == 1) //Se a cobra teve uma colisão fatal ou perdeu todo o corpo exceto a cabeça { Beep(700, 100); isDead = 0; (*lifes)--; ratsEaten = 0; //Se morrer, deve comer todos os ratos de novo if(*lifes > 0) //Se ainda há vidas, continua o jogo { system("cls"); print_lvlART(scenario, columns + 5, 0); restartLevel(&snake, columns, rows, rats, speed, &actualSpeed, initialCoord, &eatenAllRats); printMap(rows, columns, map, scenario.color); printRocks(rows, columns, rocksNum, rocks, map); printSnake(&snake); printInfo(level, *lifes, *score, ratsEaten, objetivo); getch(); //pausa o jogo } } Sleep(speed); //controla a velocidade do jogo if(speed > 100) //máxima velocidade do jogo speed -= 1; auxDirection = changeDirection(snake.direction); //lê nova direção to teclado if(auxDirection == 'P') { getch(); //Pausa o jogo } else if(auxDirection == 'C') { cheatCode(&(*lifes), &levelEnded, &speed); //Lê cheat code } else snake.direction = auxDirection; if(snake.direction == 'Q' || snake.direction == ESC) //Se o jogador aperta para sair, perde suas vidas para encerrar { *lifes = 0; } } fadeOUT(rows, columns, GREY, 1); //Efeito de fade out na tela system("cls"); }