Ejemplo n.º 1
0
bool Game2D::event(QEvent *event){
     //qDebug () << event->type();

     if (event->type() == QEvent::KeyPress) {
         QKeyEvent *ke = static_cast<QKeyEvent *>(event);

         if (!state_) state_=1;
         else{
             if (state_==2) start ();
         }

         switch (ke->key()){
             case Qt::Key_Up:
             case Qt::Key_W: direction_=UP; break;

             case Qt::Key_Right:
             case Qt::Key_D: direction_=RIGHT; break;

             case Qt::Key_Down:
             case Qt::Key_S: direction_=DOWN; break;

             case Qt::Key_Left:
             case Qt::Key_A: direction_=LEFT; break;

             case Qt::Key_Shift: ship_.setFire(1); break;

             case Qt::Key_Tab: nextLevel (); break;

             case Qt::Key_Backspace: prevLevel (); break;

             case Qt::Key_Pause: setPause (); break;
         }

         return true;
     }

     return QWidget::event(event);
}
Ejemplo n.º 2
0
bool gameLoop()
{
    initLevelManager();
    loadLevel(g_LevelManager, 0);
    initHUD();
    bool done = false;
    int moveStartTime = SDL_GetTicks();

    while(!done)
    {
        int startTime = SDL_GetTicks();
        // handle game lose situation (timer has run out, eaten by monster)
        // now handled in cLevelManager::update()


        SDL_Event event;

        while(SDL_PollEvent(&event))
        {
            //check for messages
            switch(event.type)
            {
                case SDL_QUIT:
                    done = true;
                    break;
                //check for keypresses
                case SDL_KEYDOWN:
                {
                    //handle keypresses
                    switch(event.key.keysym.sym)
                    {
                        case SDLK_ESCAPE:
                            g_LevelManager.stop();
                            done = true;
                            return true;
                            break;
                        case SDLK_m:
                            g_LevelManager.stop();
                            done = true;
                            return false;
                            break;
                        case SDLK_r:
                            g_LevelManager.endLevel();
                            moveStartTime = SDL_GetTicks();
                            loadLevel(g_LevelManager, g_LevelManager.getCurrentLevel());
                            break;
                        case SDLK_n:
                            nextLevel();
                            moveStartTime = SDL_GetTicks();
                            break;
                        case SDLK_p:
                            prevLevel();
                            moveStartTime = SDL_GetTicks();
                            break;
                        default:
                            g_InputManager.updateKey(event.key.keysym.sym);
                            break;
                    }
                }
            } //end switch
        } //end of message processing


        //autoplay routine (if level autoplay enabled)
        if(g_LevelManager.activeLevel()->autoPlay())
        {
            if(g_LevelManager.activePlayer()->moveNumber() < g_LevelManager.activePlayer()->movesSize())
            {
                int moveCheckTime = SDL_GetTicks();
                if(moveCheckTime - moveStartTime >= 300)
                {
                    g_InputManager.update();
                    moveStartTime = moveCheckTime;
                }
            }
        }

        g_InputManager.autoUpdate();
        //do game update

        /*****update graphics*****/

        //clear screen
        SDL_FillRect(screen,0,SDL_MapRGB(screen->format,0,0,0));
        //SDL_FillRect(display,0,SDL_MapRGB(display->format,0,0,0));

        //draw image
        g_RenderManager.update();

        int endTime = SDL_GetTicks();
        if(endTime - startTime < 1000/fps) SDL_Delay(1000/fps - (endTime - startTime));

        //end frame

        SDL_Flip(screen);

        //level win now handled in cLevelManager::update()

        if(g_LevelManager.checkWin())
        {
            done = true;
            return false;
        }

        /*
        if(levelWon())
        {
            nextLevel();
        }
        */
    }
    return done;
    //do exit
}