void Game::keyPressEvent(KeyEvent& event) { /* Move forward */ if(event.key() == KeyEvent::Key::Up || event.key() == KeyEvent::Key::W) { Vector3 direction = player->transformation().backward(); Deg angle = Vector3::angle(Vector3::zAxis(), direction); if(angle < Deg(30.0f)) movePlayer({0, -1}); else if(angle > Deg(60.0f) && angle < Deg(120.0f)) movePlayer({direction.x() > 0 ? -1 : 1, 0}); else if(angle > Deg(150.0f)) movePlayer({0, 1}); if(!level->remainingTargets()) nextLevel(); /* Restart level */ } else if(event.key() == KeyEvent::Key::R) { restartLevel(); /* Switch to menu */ } else if(event.key() == KeyEvent::Key::Esc) pause(); else return; event.setAccepted(); redraw(); }
void hButton::update(){ if (enabled){ if (mouse_x > x - font->GetStringWidth(caption) && mouse_x < x + font->GetStringWidth(caption) && mouse_y < 20 + font->GetHeight() && mouse_y > 0){ selected = true; if (hge->Input_KeyUp(HGEK_LBUTTON)) switch(id){ case idStart: gameEnabled = true; updateEnabled = true; inputEnabled = true; for (int i = 0; i < BUTTONS_COUNT-1; i++) buttons[i]->enabled = false; break; case idRestart: restartLevel(); canPunchBall = true; break; case idExit: bye(); exit(4); break; } }else selected = false; } }
void GameScreen::newLevel(int newLevel) { timeLeft = 300; blocksPerRow = 1; // level 1 block-per-row count will be 2 rowCount = 3; if (newLevel == 1 && diff == EASY) diff = EASY; else if (newLevel == 2 && diff != HARD) diff = MEDIUM; else if (newLevel == 3) diff = HARD; if (diff == EASY) { ballSpeed = 10; paddleSpeed = 10; } else if (diff == MEDIUM) { ballSpeed = 7; paddleSpeed = 7; } else if (diff == HARD) { ballSpeed = 5; paddleSpeed = 5; } for (int i = 0; i < newLevel; i++) { blocksPerRow++; rowCount++; } setTimeText(timeLeft); setLevelText(newLevel); restartLevel(newLevel); spacePressed = false; }
void GameScreen::gameIsWon() { ball->object->stop(); paddle->object->stop(); time->stop(); gameWonLbl = new QLabel(this); gameWonLbl->setPixmap(*gameWonIcon); gameWonLbl->setGeometry(50, 60, 401, 351); gameWonLbl->show(); mainMenuBtn = new QPushButton(this); mainMenuBtn->setGeometry(75, 370, 75, 23); mainMenuBtn->setText("Main Menu"); mainMenuBtn->show(); connect(mainMenuBtn, SIGNAL(clicked()), this, SLOT(quitToMenu())); saveAndQuitBtn = new QPushButton(this); saveAndQuitBtn->setGeometry(165, 370, 81, 23); saveAndQuitBtn->setText("Save and Quit"); saveAndQuitBtn->show(); connect(saveAndQuitBtn, SIGNAL(clicked()), this, SLOT(saveAndQuit())); restartBtn = new QPushButton(this); restartBtn->setGeometry(261, 370, 75, 23); restartBtn->setText("Replay"); restartBtn->show(); connect(restartBtn, SIGNAL(clicked()), this, SLOT(restartLevel())); nextLvlBtn = new QPushButton(this); nextLvlBtn->setGeometry(355, 370, 75, 23); nextLvlBtn->setText("Next Level >"); nextLvlBtn->show(); connect(nextLvlBtn, SIGNAL(clicked()), this, SLOT(nextLevel())); }
///Modo de jogo em que só há uma vida, e termina apenas quando o jogador morre void survivalMode() { system("mode con:cols=90 lines=30"); //tamanho da tela de jogo LEVEL_SCENE hell = {RED, {176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,177, 176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,177, 176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,177,177, 176,176,176,176,176,176,176,176,178,178,176,176,176,176,176,176,178,177,177,177, 176,176,178,177,177,176,176,178,178,178,178,176,176,176,176,178,178,177,177,177, 176,176,178,177,177,177,176,178,178,178,178,176,176,176,176,178,178,178,177,177, 178,178,178,177,177,177,176,178,178,178,178,176,176,176,178,178,178,178,178,178, 178,178,177,177,177,177,176,178,178,178,178,178,176,178,178,178,178,177,178,178, 177,178,177,177,177,177,177,177,178,178,177,177,177,177,177,177,177,177,177,178, 177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177 } }; //cenário do modo de jogo FILE *arq; int score; //pontuação int level; //como só há um level nesse jogo, esta variavél serve apenas para o peso da pontuação int speed; //velocidade do jogo int rows, columns; //Linhas e colunas do mapa int rocksNum; // Número de pedras int ratNum; //Indica qual o rato a ser gerado, há no máximo 4 ratos na tela int ratsEaten; 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 char auxDirection; // BOOL isDead; //Flag de morte da snake char map[ROWSMAX][COLUMNSMAX]; int hasPassed[ROWSMAX*COLUMNSMAX]; SNAKE snake; POSN initialCoord; //Coordenada onde a snake começa o nível POSN rocks[ROWSMAX*COLUMNSMAX]; POSN rats[4]; ratNum = 0; ratsColor = 2; ratsEaten = 0; cont = 0; isDead = 0; level = 1; score = 0; speed = 200; //speed inicial for(i=0; i<rocksNum; i++) hasPassed[i]=0; readMap(42, &rows, &columns, map, &rocksNum, rocks, &initialCoord); restartLevel(&snake, columns, rows, rats, speed, &speed, initialCoord, &isDead); print_lvlART(hell, columns + 5, 0); fadeIN(rows, columns, GREY, 1); printMap(rows, columns, map, hell.color); printRocks(rows, columns, rocksNum, rocks, map); printSnake(&snake); getch(); //pausa o jogo while(!isDead) { for(i=0; i<rocksNum; i++) { if(hasPassed[i]!=0) hasPassed[i]+=1; } print_lvlART(hell, columns + 5, 0); printScore(score); eraseTrail(snake); updateSnakeCoord(&snake); printSnake(&snake); checkColision(&snake, &isDead, rows, columns, map, rocks, rocksNum, hasPassed, &score); if(score < 0) { score = 0; //Não há score negativo! } cont++; //contador de movimentos if(cont % 10 == 0) { makeRats(rows, columns, rats, ratNum, &snake, map, &ratsColor); //gera e printa um rato ratNum++; if(ratNum == 4) //Há 4 ratos, de 0 a 3, logo rato 4 == rato 0 { ratNum = 0; } } eatRat(&snake, rats, &ratsEaten, &score, level); //checa se um rato foi comido 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(&isDead, &isDead, &speed); //Lê cheat code } else if(auxDirection == 'Q' || auxDirection == ESC) //Se o jogador aperta para sair, perde suas vidas para encerrar { isDead = 1; } else snake.direction = auxDirection; //só troca a direção se a nova direção não for uma tecla de pause ou saída } fadeOUT(rows, columns, GREY, 1); //Efeito de fade out na tela printGameOver(); arq = fopen("highscore_survival.bin", "rb+"); //Abre arquivo de highscore, informando caso de erro if(arq == NULL) printf("error"); uptadeHighScore(score, arq); //coloca o score no rank system("cls"); }
///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"); }