예제 #1
0
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();
}
예제 #2
0
파일: hButton.cpp 프로젝트: Badrpas/LD26
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;
	}
}
예제 #3
0
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;
}
예제 #4
0
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()));

}
예제 #5
0
///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");

}
예제 #6
0
///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");

}