Esempio n. 1
0
void kMancalaMain::pauseGame(void) {
	qDebug("pausing game ... ");
	if ( _gamePaused ) return;
	if ( !_gameActive ) return;
	if ( _gameOver ) return;

	_gamePaused = true;
	_playerAiMoveTimer->stop();
	_guiBoard->setClickable(false);
	emit disableHint();
	emit gamePause();
}
Esempio n. 2
0
int updateWorld(char keyPressed) {	// run this method every frame
	if (!paused) {
		if (!gameover) {
			switch (keyPressed) {
				case 27:				// puase the game
					gamePause();
					break;
				case 32:				// jump the bird
				case 10:
					updateBird(1);
					updatePipe(PIPE);
					break;
				default:				// falling bird
					updateBird(0);
					updatePipe(PIPE);
					break;
			}
		} else {
				switch (keyPressed) {
					case 'r':
					case 'R':
					case 27:
						initializeWorld();
						break;
					case 'c':
					case 'C':
						QUIT = 1;
					default:			// do nothing
						break;
				}
		}
	}	else {
			if (keyPressed == 27)
				gamePause();
	}
	return paused;	
}
Esempio n. 3
0
kMancalaMain::kMancalaMain(QSize s, QWidget *parent = 0)
  : QWidget(parent) {
	QHBoxLayout *layout = new QHBoxLayout();
	QVBoxLayout *historyBox = new QVBoxLayout();

	_historyLabel = new QLabel(i18n("<h3 style=\"color: black;\">Moves History</h3>"));
	_historyListWidget = new kMancalaHistory(this);
	_historyListWidget->setFocusPolicy(Qt::NoFocus);

	historyBox->addWidget(_historyLabel);
	historyBox->addWidget(_historyListWidget);

	_guiBoard = new kMancalaBoard(s, this);
	_gameActive = false;
	_gameOver = false;
	_gamePaused = false;

	setBackgroundRole(QPalette::Dark);
	layout->addWidget(_guiBoard);
	layout->addLayout(historyBox);

	setLayout(layout);
	setMinimumSize(s);
	toggleHistory(false);

	connect(_guiBoard, SIGNAL(playerHumanMove(int)), this, SLOT(playerHumanMove(int)));
	connect(_guiBoard, SIGNAL(playerAIMove()), this, SLOT(playerAIMove()));
	connect(_historyListWidget, SIGNAL(currentRowChanged(int)), this, SLOT(historyShow(int)));

	connect(this, SIGNAL(updateBoard(board*)), _guiBoard, SLOT(updateBoard(board*)));
	connect(this, SIGNAL(playerSwitched(player *)), _guiBoard, SLOT(playerSwitched(player *)));
	connect(this, SIGNAL(gameOver(player*)), _guiBoard, SLOT(gameOver(player*)));
	connect(this, SIGNAL(playersUpdated(player**, int)), _guiBoard, SLOT(updatePlayers(player**, int)));
	connect(this, SIGNAL(gamePause()), _guiBoard, SLOT(pause()));
	connect(this, SIGNAL(gameUnPause()), _guiBoard, SLOT(play()));
	connect(this, SIGNAL(suggestHint(int, int)), _guiBoard, SLOT(hint(int, int)));
	connect(this, SIGNAL(clearGameOver()), _guiBoard, SLOT(clearGameOver()));

	_controller = new controller;
	_ai = new ai(_controller);
	_playerAiMoveTimer = new QTimer;
	_playerAiMoveTimer->setSingleShot(true);
	connect(_playerAiMoveTimer, SIGNAL(timeout()), this, SLOT(startPlayerAIMove()));

	_board = NULL; 
	_players = NULL;
}
Esempio n. 4
0
void MainWindow::keyPressEvent(QKeyEvent *event)
{
    // 在這裡設定按下鍵盤要觸發的功能
    if (gamemod == lose) {
        if (birdTimer->isActive()) birdTimer->stop();
        gameRedy();
        gameStart();
        Number->setnum(0);
    }
    if (gamemod == pause) gameStart();
    if (event->key() == Qt::Key_Up || event->key() == Qt::Key_Space){
        fgm->stop();
        fgm->play();
        birdup();
    }
    if (event->key() == Qt::Key_Down) gamePause();

}
Esempio n. 5
0
int main(int argc, char *argv[])
{
	initialize();

	// main game loop
	while(notReadyToQuit())
	{
		update();
		render();
		gamePause();

		tick++;
		if(tick == TICS_PER_SEC)
		{
			tick = 0;
		}
	}

	cleanup();

	return 0;
}
Esempio n. 6
0
GameOfLifeMain::GameOfLifeMain(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::GameOfLifeMain),
    map(new ColonyMap(this))

{
    ui->setupUi(this);

    // place colony widget on window
    QPalette Pal(palette());
    Pal.setColor(QPalette::Background, Qt::white);
    map->setAutoFillBackground(true);
    map->setPalette(Pal);
    ui->mapLayout->addWidget(map);

    // setting connections

    // connect control buttons to main slots of map
    connect(ui->startButton, SIGNAL(clicked(bool)),
            map, SLOT(gameStart()));
    connect(ui->stopButton, SIGNAL(clicked(bool)),
            map, SLOT(gameStop()));
    connect(ui->stepButton, SIGNAL(clicked(bool)),
            map, SLOT(nextGen()));
    connect(ui->resetButton, SIGNAL(clicked(bool)),
            map, SLOT(gameReset()));
    connect(ui->cleanColonyButton, SIGNAL(clicked(bool)),
            map, SLOT(cleanMap()));

    // saving and loading
    connect(ui->saveButton, SIGNAL(clicked(bool)),
            map, SLOT(saveMap()));
    connect(ui->loadButton, SIGNAL(clicked(bool)),
            map, SLOT(loadMap()));
    // cell color control
    connect(ui->cellColorButton, SIGNAL(clicked(bool)),
            map, SLOT(chooseCellColor()));

    // let size slider set map size
    connect(ui->colonySizeSlider, SIGNAL(valueChanged(int)),
            map, SLOT(setMapSize(int)));
    // while slider pressed, pause the game
    connect(ui->colonySizeSlider, SIGNAL(sliderPressed()),
            map, SLOT(gamePause()));
    // resume, when slider released
    connect(ui->colonySizeSlider, SIGNAL(sliderReleased()),
            map, SLOT(gameResume()));

    // let generation time slider change time interval
    connect(ui->generationTimeSlider, SIGNAL(valueChanged(int)),
            map, SLOT(setInterval(int)));

    connect(ui->colonySizeSpinBox, SIGNAL(editingFinished()),
            this, SLOT(setMapSize()));
    connect(ui->generationTimeSpinBox, SIGNAL(editingFinished()),
            this, SLOT(setInterval()));

    // Buttons must react to game running state
    connect(map, SIGNAL(gameRunning(bool)),
            ui->stepButton, SLOT(setDisabled(bool)));
    connect(map, SIGNAL(gameRunning(bool)),
            ui->startButton, SLOT(setDisabled(bool)));
    connect(map, SIGNAL(gameRunning(bool)),
            ui->stopButton, SLOT(setEnabled(bool)));

    // inform sliders, when size and tine interval changed
    connect(map, SIGNAL(sizeChanged(int)),
            ui->colonySizeSlider, SLOT(setValue(int)));
    connect(map, SIGNAL(intervalChanged(int)),
            ui->generationTimeSlider, SLOT(setValue(int)));

    connect(map, SIGNAL(generationLived(int)),
            ui->generationCountLabel, SLOT(setNum(int)));
}
Esempio n. 7
0
int runGame(SDL_Surface* screen)
{
  if(gameState==GAMESTATEPLAYING)
  {
    getInpPointerState()->escEnable=1;
    //Handle input
    int lim=1; //Limit cursor travel...
    int goUp=0, goDown=0, goLeft=0, goRight=0;
    if( getButton( C_UP ) )
    {
      restartConfirm=0;
      if( getBtnTime( C_UP ) > REPEATDELAY )
      {
        goUp=1;
      } else if(getBtnTime(C_UP)==0) {
        goUp=1;
        lim=0;
      }
    }

    if( getButton( C_DOWN ) )
    {
      restartConfirm=0;
      if( getBtnTime( C_DOWN ) > REPEATDELAY )
      {
        goDown=1;
      } else if(getBtnTime(C_DOWN)==0) {
        goDown=1;
        lim=0;
      }
    }

    if( getButton( C_LEFT ) )
    {
      restartConfirm=0;
      if( getBtnTime( C_LEFT ) > REPEATDELAY )
      {
        goLeft=1;
      } else if(getBtnTime(C_LEFT)==0) {
        goLeft=1;
        lim=0;
      }
    }

    if( getButton( C_RIGHT ) )
    {
      restartConfirm=0;
      if( getBtnTime( C_RIGHT ) > REPEATDELAY )
      {
        goRight=1;
      } else if(getBtnTime(C_RIGHT)==0) {
        goRight=1;
        lim=0;
      }
    }

    //Pause ?
    if( getButton( C_BTNMENU ) || isPointerEscapeClicked() )
    {
      resetBtn( C_BTNMENU );
      gamePause(screen);
      return(STATEMENU);
    }

    //Retry
    if( getButton( C_BTNSELECT ) || (getInpPointerState()->timeSinceMoved<POINTER_SHOW_TIMEOUT && isBoxClicked(&ptrRestartRect)) )
    {
      resetBtn( C_BTNSELECT );
      resetMouseBtn();
      if(!restartConfirm)
      {
        restartConfirm=1;
      } else if(restartConfirm) {
        gameRestart(screen);
      }

    }

    //Handle mouse input
    if( getInpPointerState()->timeSinceMoved==0 && !cur.lock )
    {
      setCursor(&cur, getInpPointerState()->curX,getInpPointerState()->curY );
    }

    if(!getInpPointerState()->isDown)
    {
      mouseGrab=0;
      //Allow moving the cursor around with the input device when no brick is below, just for effect
    } else {
      brickType* b=brickUnderCursor(&pf, cur.x,cur.y);

      //We're over a brick, tell curser it's position, it will be locked later because we grab it now

      if( b )
      {
        getInpPointerState()->startX=b->dx;
        getInpPointerState()->startY=b->dy;
        if( !cur.lock )
        {
          mouseGrab=1;
          getInpPointerState()->startX=getInpPointerState()->curX;
          getInpPointerState()->startY=getInpPointerState()->curY;
        } else
        {
          if( b->dx > getInpPointerState()->curX )
          {
            //Drag Left
            if( b->dx == b->sx  && getInpPointerState()->startX != getInpPointerState()->curX )
            {
              goLeft=1;
            }
          } else if(  b->dx < getInpPointerState()->curX )
          {
            //Drag Right
            if( b->dx == b->sx && getInpPointerState()->startX != getInpPointerState()->curX )
            {
              goRight=1;
            }
          }
        }
      } else {
        mouseGrab=0;
      }
    }
   //   printf("x:%i\n", getInpPointerState()->curX );
      //Drag
    if( getButton( C_BTNX ) || getButton( C_BTNB ) || mouseGrab || isPointerClicked() )
    {
      //Remove "Restart" question
      restartConfirm=0;

      //Magnet to brick if it's moving
      brickType* b=brickUnderCursor(&pf, cur.dx, cur.dy);

      if( !cur.lock && b )
      {
        //Attach cursor
        cur.lock=1;
        b->curLock=1;
        cur.x=cur.dx;
        cur.y=cur.dy;
        cur.px = b->pxx-4;
        cur.py = b->pxy-4;

        sndPlay( SND_BRICKGRAB, cur.px );
      }

      int movedBrick=0;
      //We're holding a brick, and it's not falling
      if( b )
      {
        if( (goRight && curMoveBrick(&pf,b, DIRRIGHT)) || (goLeft && curMoveBrick(&pf,b, DIRLEFT)) )
        {
          movedBrick=1;
          b->curLock=1;
          cur.lock=1;
        }
      }

      //Moved brick
      if(movedBrick)
      {
        player()->hsEntry.moves++;
        sndPlay(SND_BRICKMOVE, cur.px);
        ps.layer=PSYS_LAYER_TOP;
        ps.x=b->pxx;
        ps.y=b->pxy+18;
        ps.vel=50;
        ps.life=500;
        ps.lifeVar=250;
        ps.gravity=1;
        ps.srcImg=stealGfxPtr()->tiles[b->type-1]->img;
        ps.srcRect=stealGfxPtr()->tiles[b->type-1]->clip;
        ps.srcRect.y += 18;
        ps.srcRect.h = 2;
        spawnParticleSystem(&ps);
      }

    }
    else
    {
      cur.lock=0;
    }

      if(!cur.lock)
      {
        if( goLeft ) moveCursor(&cur, DIRLEFT, 0, lim);
        if( goRight ) moveCursor(&cur, DIRRIGHT, 0, lim);
        if( goUp ) moveCursor(&cur, 0, DIRUP, lim);
        if( goDown ) moveCursor(&cur, 0, DIRDOWN, lim);
      }

    //Sim first, so moving blocks get evaluated before getting moved again
    simField(&pf, &cur);

    //Do rules
    int ret=doRules(&pf);

    //Draw scene
    draw(&cur,&pf, screen);

    //Draw a path to show where we are pulling the brick
    if( mouseGrab )
      drawPath( screen, getInpPointerState()->startX,getInpPointerState()->startY,getInpPointerState()->curX,getInpPointerState()->startY,1 );


    //If no more bricks, countdown time left.
    if(ret == NOBRICKSLEFT)
    {
      if( !justWon )
      {
        sndPlay(SND_WINNER,160);
      }
      justWon++;
      pf.levelInfo->time -= 1000;
      player()->hsEntry.score +=1;

      if(getButton(C_BTNX) || getButton(C_BTNB) || isPointerClicked() )
      {
        resetBtn(C_BTNX);
        resetBtn(C_BTNB);
        resetMouseBtn();
        while(pf.levelInfo->time > 0)
        {
          player()->hsEntry.score +=1;
          pf.levelInfo->time -= 1000;
        }
      }

      if(justWon > 50)
      {
        sndPlayOnce(SND_SCORECOUNT, 160);
      }
      if(pf.levelInfo->time < 1)
      {
        //Completed level
        player()->timeouts=0;
        pf.levelInfo->time=0;
        sndPlay(SND_VICTORY, 160);

        if(!player()->inEditor)
        {
          //Don't submit if it was from the leveleditor
          statsSubmitBest();
          setMenu(menuStateFinishedLevel);
          if(pf.levelInfo->stopImg)
          {
            gameState=GAMESTATESTOPIMAGE;
            return(STATEPLAY);
          }
        } else {
          setLevelCompletable(pf.levelInfo->file, 1);
        }
        cleanUpGame();
        startTransition(screen, TRANSITION_TYPE_ROLL_IN, 700);
        return(STATEMENU);
      }
    } else if(ret > 0) //Player destroyed bricks.
    {
      if(ret > 2) //Check for combo's
      {
        ///TODO: Some nice text effect? How about dissolving an image into a particle system?
        printf("%i Combo!\n",ret);
        player()->hsEntry.combos++;
      }
      player()->hsEntry.score += ret*ret*11*(player()->level+1);
    }

    //if ret > -1 then ret == number of bricks destroyed
    if(ret>-1)
    {
      //Update time:
      pf.levelInfo->time -= getTicks();
      player()->hsEntry.time += getTicks();
      if(pf.levelInfo->time < 1 && ret!=NOBRICKSLEFT )
      {
        countdown=4000;
        gameState=GAMESTATEOUTOFTIME;
        if( !player()->inEditor )
        {
          player()->timeouts++;
        }

        sndPlay(SND_TIMEOUT, 160);
      }
    }

    //Check if level is unsolvable.
    if(ret==UNSOLVABLE)
    {
      countdown=2000;
      gameState=GAMESTATEUNSOLVABLE;
      if( !player()->inEditor )
      {
        player()->timeouts++;
      }

      sndPlay(SND_LOSER, 160);
    } else if(ret==LIFELOST)
    {
      countdown=2000;
      gameState=GAMESTATELIFELOST;

      if( !player()->inEditor )
      {
        player()->timeouts++;
      }

      sndPlay(SND_LOSER, 160);

    }


    //Draw question
    if(restartConfirm)
    {
      sprintf(buf,STR_GAME_RESTARTWARNING);
      txtWriteCenter(screen, GAMEFONTMEDIUM, buf, HSCREENW, HSCREENH-20);
      sprintf(buf,STR_GAME_RESTARTCONFIRM);
      txtWriteCenter(screen, GAMEFONTSMALL, buf, HSCREENW, HSCREENH);
    } else {
      //Draw text
      drawUi(screen);
    }
    //Show the restart icon
    if(getInpPointerState()->timeSinceMoved<POINTER_SHOW_TIMEOUT && getInpPointerState()->escEnable)
    {
      SDL_Rect ptrRestartRectC = ptrRestartRect;
      SDL_BlitSurface( ptrRestart,NULL, screen, &ptrRestartRectC );
    }


  } else
  if(gameState==GAMESTATECOUNTDOWN)
  {

    draw(&cur,&pf, screen);
    countdown -=getTicks();

    if( getButton( C_BTNMENU ) )
    {
      resetBtn( C_BTNMENU );
      countdownSeconds=0;
      countdown=0;
    }

    if( (getButton( C_BTNX ) || getButton( C_BTNB ) || getInpPointerState()->isDown ) && countdownSeconds )
    {
      countdownSeconds=0;
      countdown=500;
    }

    drawShowCountDown(screen, countdownSeconds);

    drawUi(screen);

    if(countdown < 1)
    {
      countdown=1000;
      countdownSeconds--;

      if(countdownSeconds == -1)
      {
        gameState=GAMESTATEPLAYING;
        return(STATEPLAY);
      }
      if(countdownSeconds==0)
      {
        countdown=500;
        sndPlay(SND_START, 160);
      } else {
        sndPlay(SND_COUNTDOWNTOSTART, 160);
      }
    }

  } else
  if(gameState==GAMESTATEOUTOFTIME) //Menu was last in "Entering level" so it will return to that if timeout
  {
    draw(&cur,&pf, screen);
    //drawUi(screen);

    countdown-=getTicks();

    //Offer to skip after dying twice on same level, but only if it is not the last level in the pack.
    if( player()->timeouts > 1 && player()->level+1 < getNumLevels() )
    {
      int skipLevel = skipLevelDialog(screen);
      if( skipLevel==1 )
      {
        gameState=GAMESTATESKIPLEVEL;
        countdown=500;
      }
      txtWriteCenter(screen, GAMEFONTMEDIUM, STR_GAME_OUTOFTIME, HSCREENW,HSCREENH-24-31);
    } else {
      if( lostLifeMsg(&cur, &pf, screen, STR_GAME_OUTOFTIME, "lostlife-timeout" ) )
      {
        return(STATEMENU);
      }
    }

  } else
  if(gameState==GAMESTATEUNSOLVABLE) //The same as out-of-time, but with another graphics.
  {
    draw(&cur,&pf, screen);
    //drawUi(screen);

    countdown-=getTicks();

    //Offer to skip after dying twice on same level, but only if it is not the last level in the pack.
    if( player()->timeouts > 1 && player()->level+1 < getNumLevels() )
    {
      int skipLevel = skipLevelDialog(screen);
      if( skipLevel==1 )
      {
        gameState=GAMESTATESKIPLEVEL;
        countdown=500;
      }
      txtWriteCenter(screen, GAMEFONTMEDIUM, buf, HSCREENW,HSCREENH-24-31);

    } else {
      if( lostLifeMsg(&cur, &pf, screen, STR_GAME_UNSOLVABLE, "lostlife-unsolvable" ) )
      {
        return(STATEMENU);
      }
    }


  } else
  if(gameState==GAMESTATELIFELOST)
  {
    if( lostLifeMsg(&cur, &pf, screen, STR_GAME_LOSTLIFE, "lostlife-evilbrick" ) )
    {
      return(STATEMENU);
    }
  } else
  if(gameState==GAMESTATESTARTIMAGE)
  {

    if(!startStopImg)
    {
      startStopImgCounter=0;
      startStopImg = loadImg( packGetFile("themes/", pf.levelInfo->startImg) );
      if(!startStopImg)
      {
        printf("Couldn't load '%s'\n",packGetFile("themes/", pf.levelInfo->startImg));
      }
    }

    startStopImgCounter+=getTicks();

    if((startStopImgCounter > 500 && ( getButton(C_BTNB) || isPointerClicked() ) ) || !startStopImg)
    {
      if(startStopImg)
        SDL_FreeSurface(startStopImg);
      startStopImg=0;
      resetBtn(C_BTNB);
      resetMouseBtn();
      gameState=GAMESTATECOUNTDOWN;
    }

    SDL_BlitSurface( startStopImg, 0, screen, &(setting()->bgPos) );

    if(startStopImgCounter>4000)
      txtWriteCenter(screen, GAMEFONTSMALL, STR_GAME_PRESSB, HSCREENW,HSCREENH+80);

  } else if(gameState==GAMESTATESTOPIMAGE)
  {
    if(!startStopImg)
    {
      startStopImgCounter=0;
      startStopImg = loadImg( packGetFile("themes/", pf.levelInfo->stopImg) );
      if(!startStopImg)
      {
        printf("Couldn't load '%s'\n",packGetFile("themes/", pf.levelInfo->stopImg));
      }
    }

    startStopImgCounter+=getTicks();

    if((startStopImgCounter > 500 && (getButton(C_BTNB) || isPointerClicked() ) ) || !startStopImg)
    {
      if(startStopImg)
        SDL_FreeSurface(startStopImg);
      startStopImg=0;
      resetBtn(C_BTNB);
      resetMouseBtn();
      cleanUpGame();
      startTransition(screen, TRANSITION_TYPE_ROLL_IN, 700);
      return(STATEMENU);
    }

    SDL_BlitSurface( startStopImg, 0, screen, &(setting()->bgPos) );
    if(countdownSeconds>4000)
      txtWriteCenter(screen, GAMEFONTSMALL, STR_GAME_PRESSB, HSCREENW,HSCREENH+80);

  } else if(gameState==GAMESTATESKIPLEVEL)
  {

    doRules(&pf);
    simField(&pf, &cur);
    draw(&cur,&pf, screen);

    countdown-=getTicks();

    if( countdown < 1 )
    {
      countdown=500;

      if( boardDestroyNextBrick(&pf) == 0 )
      {

        //Tell that we chose to skip level
        statsUpload(player()->level, player()->hsEntry.time, player()->hsEntry.moves,player()->hsEntry.combos,player()->hsEntry.score, "skip-level",0, NULL);

        pf.levelInfo->time=0;
        player()->hsEntry.score=0;
        cleanUpGame();
        startTransition(screen, TRANSITION_TYPE_ROLL_IN, 700);
        clearParticles();
        setMenu(menuStatePrepareNextLevel);
        return(STATEMENU);
      }
    }
    drawUi(screen);

  }
  return(STATEPLAY);
}