Ejemplo n.º 1
0
int main( int argc, char* args[] ) 
{
	
	if (InitSDL())
	{
		WindowSurface screen(800,600);
		MusicHandler musicHandler;
		SoundEffectsHandler sfxHandler;
		Graphics graphics;
		Sounds sounds;
		Settings setting;
		Maps levels;
		GlobalSettings gSettings;
		GameStateManager gameStates(&setting);
		SettingSaverLoader ssl;
		ssl.LoadSettings(gSettings);
		long Timer = clock();//For Frame Independent Movement
		bool gameRunning=true;
		FPS fps(30);
		SDL_Event sEvent;
		musicHandler.SetNewMusic(&sounds.titleScreen);	
		sfxHandler.AddSoundEffect(&sounds.death);
		sfxHandler.AddSoundEffect(&sounds.bell);
		sfxHandler.AddSoundEffect(&sounds.damage);
		sfxHandler.AddSoundEffect(&sounds.enemyDeath);
		gameStates.NewState(GSIntro);

		int introCount=0; float logoPositionY = 0;

		Surface surface; surface.LoadImage("Images/icon.png", 255, 255, 0);
		SDL_WM_SetIcon(surface, NULL);
		screen.SetCaption("A Rat's Tale");

		EnemyHandler enemies;
		Map map(&graphics.tileSheet, 50, 50, "Map/map1.txt");
		levels.count++;

		map.AddTile('A', 0, 0);
		map.AddTile('B', 50, 0);
		map.AddTile('C', 100, 0);
		map.AddTile('D', 0, 50);
		map.AddTile('E', 50, 50);
		map.AddTile('F', 100, 50);
		map.AddTile('G', 0, 100);
		map.AddTile('H', 50, 100);
		map.AddTile('I', 100, 100);
		map.AddTile('J', 0, 150);
		map.AddTile('K', 50, 150);
		map.AddTile('L', 100, 150);
		map.AddTile('M', 150, 0);
		map.AddTile('N', 150, 50);
		map.AddTile('O', 150, 100);

		map.AddTile('P', 200, 0);
		map.AddTile('Q', 250, 0);
		map.AddTile('R', 200, 50);
		map.AddTile('S', 250, 50);
		map.AddTile('T', 200, 100);
		map.AddTile('U', 250, 100);
		map.AddTile('V', 150, 150);
		map.AddTile('W', 200, 150);
		map.AddTile('X', 250, 150);
		map.AddTile('Y', 150, 200);
		map.AddTile('Z', 200, 200);
		map.AddTile('(', 250, 200);
		map.AddTile(')', 300, 200);

		map.AddTile('>', 300, 0, 50, 0);
		map.AddTile('<', 300, 50, 0, 50);
		map.AddTile('\\', 300, 100, 50, 0);
		map.AddTile('/', 300, 150, 0, 50);

		map.AddTile('a', 350, 50);
		map.AddTile('b', 400, 50);
		map.AddTile('c', 450, 50);
		map.AddTile('d', 350, 100);
		map.AddTile('e', 400, 100);
		map.AddTile('f', 450, 100);
		map.AddTile('g', 350, 150);
		map.AddTile('h', 400, 150);
		map.AddTile('i', 450, 150);
		map.AddTile('j', 350, 0);
		map.AddTile('k', 400, 0);
		map.AddTile('l', 450, 0);

		map.AddTile('w', 500, 0, 50, 0);
		map.AddTile('v', 500, 50, 0, 50);
		map.AddTile('x', 500, 100, 50, 0);
		map.AddTile('y', 500, 150, 0, 50);
	
		map.AddTile('m', 0, 200, 0, 50);
		map.AddTile('n', 50, 200);
		map.AddTile('o', 100, 200, 50, 0);
	
		map.AddTile('p', 350, 200, TStop);
		map.AddTile('q', 400, 200, TSleft);
		map.AddTile('r', 450, 200, TSright);
		map.AddTile('s', 500, 200, TSbottom);
		
		map.AddTile('u', 200, 250, false, true);
		map.AddTile('z', 50, 250, false, true);
		map.AddTile('@', 150, 250);
		map.AddTile('!', 100, 250);

		Player player(&graphics.player, map.GetSpawnLocation().X, map.GetSpawnLocation().Y, 3, 3, 2);
		player.SetVelocity(200, 300); //If Timer is set in draw of player (50 pixels per second) else (50pixels per frame)
		Menu menu("Main menu", &setting, 255, 255, 255);
		menu.ShowHeader(false);
		menu.SetCenter(true);
		menu.SetVerticalSpace(20);
		menu.AddButtonChild("New game",false,255,255,255, &Settings::OnClickNewGame);
		menu.AddButtonChild("Load game",false,255,255,255, &Settings::OnClickLoadGame);
		menu.AddChild("Options", true);
		menu.GetChild(2)->SetVerticalSpace(20);
		menu.GetChild(2)->AddChild("Graphics",true);
		menu.GetChild(2)->GetChild(0)->AddChild("FPS Setting");
		menu.GetChild(2)->GetChild(0)->AddChild("Resolution");
		menu.GetChild(2)->AddChild("Sounds",true);
		menu.GetChild(2)->GetChild(1)->AddChild("Master Volume");
		menu.GetChild(2)->GetChild(1)->AddSliderChild(256,10,true,155,155,155,&SetNewVolume,&gSettings);
		((SliderMenuItem*)(menu.GetChild(2)->GetChild(1)->GetChild(1)))->SetStatus((int)(gSettings._volume*256));
		menu.GetChild(2)->GetChild(1)->AddChild("SFX-Music");
		menu.GetChild(2)->GetChild(1)->AddSliderChild(256,10,true,30,200,30,&SetNewProportion,&gSettings);
		((SliderMenuItem*)(menu.GetChild(2)->GetChild(1)->GetChild(3)))->SetStatus((int)(gSettings._sfxMusicProportion*256));
		menu.GetChild(2)->AddChild("Keys");
		menu.AddButtonChild("Exit",false,255,255,255, &Settings::OnClickExitGame);

		Menu newLevelMenu("Level completed", &setting);
		newLevelMenu.SetCenter(true);
		newLevelMenu.SetVerticalSpace(20);
		newLevelMenu.AddChild("Congratulations");
		newLevelMenu.AddChild("");
		newLevelMenu.AddChild("What do you want to do?");
		std::vector<std::string> opt; opt.push_back("Main menu"); opt.push_back("Restart"); opt.push_back("Next level");
		newLevelMenu.AddOptionChild(opt, "       ",false,255,255,255,&Settings::NewLevelOptions);

		Menu gameOverMenu("Game Over!", &setting);
		gameOverMenu.SetCenter(true);
		gameOverMenu.SetVerticalSpace(20);
		gameOverMenu.AddChild("Your journey has ended. You want to restart?");
		std::vector<std::string> opts; opts.push_back("Yes"); opts.push_back("No"); opts.push_back("Quit");
		gameOverMenu.AddOptionChild(opts, "    ", false, 255, 255, 255, &Settings::GameOverOptions);

		Menu inGameMenu("Pause",&setting,255,0,0);
		inGameMenu.SetCenter(true);
		inGameMenu.SetVerticalSpace(20);
		inGameMenu.AddButtonChild("Resume" ,true,255,255,255,&Settings::OnClickResume);
		inGameMenu.AddChild("Show statistics" ,true,255,255,255);
			inGameMenu.GetChild(1)->AddChild("Current level: ");
			inGameMenu.GetChild(1)->AddChild("Remaining Lives: ");
			inGameMenu.GetChild(1)->AddChild("Progression: ");
			inGameMenu.GetChild(1)->AddChild("Enemies killed: ");
			inGameMenu.GetChild(1)->AddChild("Game completion: ");
			inGameMenu.GetChild(1)->AddChild("Total distance drawn: ");
		inGameMenu.AddChild("Options", true);
			inGameMenu.GetChild(2)->SetVerticalSpace(20);
			inGameMenu.GetChild(2)->AddChild("Graphics",true);
			inGameMenu.GetChild(2)->GetChild(0)->AddChild("FPS Setting");
			inGameMenu.GetChild(2)->GetChild(0)->AddChild("Resolution");
			inGameMenu.GetChild(2)->AddChild("Sounds",true);
				inGameMenu.GetChild(2)->GetChild(1)->AddChild("Master Volume");
				inGameMenu.GetChild(2)->GetChild(1)->AddSliderChild(256,10,true,155,155,155,&SetNewVolume,&gSettings);
				((SliderMenuItem*)(menu.GetChild(2)->GetChild(1)->GetChild(1)))->SetStatus((int)(gSettings._volume*256));
				inGameMenu.GetChild(2)->GetChild(1)->AddChild("SFX-Music");
				inGameMenu.GetChild(2)->GetChild(1)->AddSliderChild(256,10,true,30,200,30,&SetNewProportion,&gSettings);
				((SliderMenuItem*)(menu.GetChild(2)->GetChild(1)->GetChild(3)))->SetStatus((int)(gSettings._sfxMusicProportion*256));
			inGameMenu.GetChild(2)->AddChild("Keys");
		inGameMenu.AddChild("Quit",true,255,0,0);
			inGameMenu.GetChild(3)->AddButtonChild("Exit to main menu",true,0,255,0, &Settings::OnClickNewGame);
			inGameMenu.GetChild(3)->AddButtonChild("Exit game",true,255,255,255, &Settings::OnClickExitGame);

		int NewLevelID = 0;
		int LevelCounter = 0;
		bool actionButtonPressed = false;
		//((OptionMenuItem*)newLevelMenu.GetChild(3))->GetOption(1)->Enabled = false;

		while (gameRunning)
		{
			while (SDL_PollEvent(&sEvent))
			{
				if (sEvent.type==SDL_QUIT || setting.GetResult() == MRExitGame){
					gameRunning=false;
					setting.Finish();
				}
				if (sEvent.type == SDL_VIDEORESIZE ) {screen.CreateWindowSurface( sEvent.resize.w,sEvent.resize.h);}
				switch(gameStates.CurrentState())
				{
				case GSIntro:
					if (sEvent.type == SDL_KEYDOWN||sEvent.type == SDL_MOUSEBUTTONDOWN)
					{
						logoPositionY=20;
						introCount=256;
						graphics.gameLogo.SetTransparency(256);
					}
				case GSMenuMain:
					if(sEvent.type == SDL_KEYDOWN){
						if(sEvent.key.keysym.sym == SDLK_ESCAPE) 
						{gameStates.BackState();menu.Reset();}
					}
						menu.HandleEvent(sEvent);
						break;
				case GSPause:
					{
						if(sEvent.type == SDL_KEYDOWN){
							if(sEvent.key.keysym.sym == SDLK_ESCAPE) 
							{gameStates.BackState();inGameMenu.Reset();}
						}
						inGameMenu.HandleEvent(sEvent);
						break;
					}
				case GSGame:
					if(sEvent.type == SDL_KEYDOWN) {
						if(sEvent.key.keysym.sym == SDLK_ESCAPE) {gameStates.PushState(GSPause);}
						else if(sEvent.key.keysym.sym == SDLK_s||sEvent.key.keysym.sym == SDLK_DOWN) {actionButtonPressed=true;}
					}
					if(sEvent.type == SDL_KEYUP){
						if(sEvent.key.keysym.sym == SDLK_s||sEvent.key.keysym.sym == SDLK_DOWN)
						{actionButtonPressed=false;}
					}
					player.HandleEvent(sEvent);
					map.HandleEvent(sEvent);
					break;
				case GSMenuNewLevel:
					newLevelMenu.HandleEvent(sEvent);
					break;
				case GSGame_Over:
					gameOverMenu.HandleEvent(sEvent);
					break;
				}
			}

			if(clock() > Timer + 500) Timer = clock();
			if(gameStates.CurrentState() == GSNone) gameStates.PushState(GSMenuMain);
			if(gameStates.CurrentState() == GSGame && player.Health <= 0)
			{
				gameStates.PushState(GSGame_Over);
				sounds.forest.SetVolumeModifier(0.1f);
				sounds.death.Play(false);
			}
			screen.ClearWindow();
			float musicPercentage=2*gSettings._sfxMusicProportion;
			if (musicPercentage>1.0){musicPercentage=1.0;}
			float sfxPercentage=2-2*gSettings._sfxMusicProportion;
			if (sfxPercentage>1.0){sfxPercentage=1.0;}
			musicHandler.SetGlobalVolume((int)(gSettings._volume*musicPercentage*128));
			sfxHandler.SetGlobalVolume((int)(gSettings._volume*sfxPercentage*128));
			switch(gameStates.CurrentState())
			{
			case GSIntro:
				if(introCount > 255){
					logoPositionY -= 5;
					if(logoPositionY <= 20){ logoPositionY = 20; gameStates.NewState(GSMenuMain); }
					Timer = clock();
					graphics.gameLogo.Draw(screen, screen.GetWidth()/2 - graphics.gameLogo.GetWidth()/2, (unsigned int)logoPositionY);
				}
				else {
					graphics.gameLogo.SetTransparency(introCount);
					logoPositionY = (float)screen.GetHeight()/2 - (float)graphics.gameLogo.GetHeight()/2;
					Timer = clock();
					graphics.gameLogo.Draw(screen, screen.GetWidth()/2 - graphics.gameLogo.GetWidth()/2, (unsigned int)logoPositionY);
				}
				introCount+=2;
				break;
			case GSMenuMain:
				if(setting.GetResult() == MRNewGame){
					musicHandler.SetNewMusic(&sounds.forest);
					levels.count = 0;
					LevelCounter = 0;
					map.Reset();
					map.NewMap(levels.levels[0]);
					enemies.PopulateEnemies(&map, &graphics);
					player.Reset(map.GetSpawnLocation(), true);
					gameStates.NewState(GSGame);
					setting.Finish();
				}else if (setting.GetResult()==MRLoadGame)
				{
					Loader load;
					if (load.StartAndCheck("Save1.sav"))
					{
						int newMapId;
						load.LoadCheckpoint(LevelCounter,newMapId);
						if(levels.maxCount <= newMapId || newMapId < 0)	newMapId = 0;
						levels.count = newMapId;
						load.LoadMap(map);
						load.LoadPlayer(player);
						load.Close();
						map.NewMap(levels.levels[newMapId]);
						enemies.PopulateEnemies(&map, &graphics);
						gameStates.NewState(GSGame);
						musicHandler.SetNewMusic(&sounds.forest);
						player.Reset(map.GetSpawnLocation(), false);
					}
					setting.Finish();
				}
				musicHandler.Update();
				Timer = clock();
				graphics.gameLogo.Draw(screen, screen.GetWidth()/2 - graphics.gameLogo.GetWidth()/2, (unsigned int)logoPositionY);
				menu.Open(screen, graphics.another, Point2D(50, logoPositionY + graphics.gameLogo.GetHeight()));
				break;
			case GSPause:
				{
					if(setting.GetResult() == MRResume){
						gameStates.BackState();
						inGameMenu.Reset();
						setting.Finish();
					}else if(setting.GetResult() == MRLoadGame)
					{
						Loader load;
						if (load.StartAndCheck("tempOldSave.sav"))
						{
							int newMapId;
							load.LoadCheckpoint(LevelCounter,newMapId);
							if(levels.maxCount <= newMapId || newMapId < 0)	newMapId = 0;
							levels.count = newMapId;
							load.LoadMap(map);
							load.LoadPlayer(player);
							load.Close();
							map.NewMap(levels.levels[newMapId]);
							enemies.PopulateEnemies(&map, &graphics);
							gameStates.NewState(GSGame);
							musicHandler.SetNewMusic(&sounds.forest);
							player.Reset(map.GetSpawnLocation(), false);
							Saver save;
							save.StartAndOpen();
							save.SaveCheckpoint(LevelCounter,levels.count);
							save.SaveMap(map);
							save.SavePlayer(player);
							save.EndAndClose("Save1.sav");
						}
						if (load.StartAndCheck("tempSave.sav"))
						{
							int newMapId;
							load.LoadCheckpoint(LevelCounter,newMapId);
							if(levels.maxCount <= newMapId || newMapId < 0)	newMapId = 0;
							levels.count = newMapId;
							load.LoadMap(map);
							load.LoadPlayer(player);
							load.Close();
							map.NewMap(levels.levels[newMapId]);
							enemies.PopulateEnemies(&map, &graphics);
							gameStates.NewState(GSGame);
							musicHandler.SetNewMusic(&sounds.forest);
							player.Reset(map.GetSpawnLocation(), false);
							Saver save;
							save.StartAndOpen();
							save.SaveCheckpoint(LevelCounter,levels.count);
							save.SaveMap(map);
							save.SavePlayer(player);
							save.EndAndClose("Save1.sav");
						}
						if (load.StartAndCheck("Save1.sav"))
						{
							int newMapId;
							load.LoadCheckpoint(LevelCounter,newMapId);
							if(levels.maxCount <= newMapId || newMapId < 0)	newMapId = 0;
							levels.count = newMapId;
							load.LoadMap(map);
							load.LoadPlayer(player);
							load.Close();
							map.NewMap(levels.levels[newMapId]);
							enemies.PopulateEnemies(&map, &graphics);
							gameStates.NewState(GSGame);
							musicHandler.SetNewMusic(&sounds.forest);
							player.Reset(map.GetSpawnLocation(), false);
						}
						setting.Finish();
					}else if (setting.GetResult() == MRNewGame)
					{
						gameStates.NewState(GSMenuMain);
						musicHandler.SetNewMusic(&sounds.titleScreen);
						setting.Finish();

					}
					
					musicHandler.Update();

					Timer = clock();
					map.DrawBackground(screen, &graphics);
					map.Draw(screen, LevelCounter);
					player.DrawHealthBar(screen, 1, 5, 5, 100, 20, &graphics.another);
					player.DrawInkBar(screen, 1, 5, 35, 100, 20, &graphics.another);
					inGameMenu.Open(screen, graphics.another, Point2D(0, 50));
					break;
				}

			case GSGame:
				if(gameStates.CurrentState() != GSMenuNewLevel && actionButtonPressed){
					if(map.NewMapEnabled(player.GetBoundR(), NewLevelID))
						gameStates.PushState(GSMenuNewLevel);
					actionButtonPressed=false;
				}
				player.Update(&map, screen.GetWidth(), screen.GetHeight(),sounds, Timer);
				enemies.Update(&map, &player,sounds, Timer);
				map.Update(player.GetBoundR(-map.GetMapPosition().X, -map.GetMapPosition().Y),player.InkPool);
				musicHandler.Update();
				Timer = clock();
				map.DrawBackground(screen, &graphics);
				map.Draw(screen, LevelCounter);
				enemies.Draw(screen, map.GetMapPosition());
				player.Draw(screen, map.GetMapPosition());
				player.DrawHealthBar(screen, 1, 5, 5, 100, 20, &graphics.another);
				player.DrawInkBar(screen, 1, 5, 35, 100, 20, &graphics.another);
				break;

			case GSMenuNewLevel:{
 				if(levels.count > LevelCounter) LevelCounter++;
				if(NewLevelID < 0) levels.count++;
				else if(NewLevelID >= levels.maxCount) levels.count = levels.maxCount-1;
				else levels.count = NewLevelID;

				map.NewMap(levels.levels[levels.count]);
				enemies.PopulateEnemies(&map, &graphics);
				player.Reset(map.GetSpawnLocation(), false);
				gameStates.BackState();
				sounds.bell.Play(false);
				Saver saver;
				saver.StartAndOpen();
				saver.SaveCheckpoint(LevelCounter,levels.count);
				saver.SaveMap(map);
				saver.SavePlayer(player);
				saver.EndAndClose("Save1.sav");
				break;
								}
			case GSGame_Over:
				musicHandler.Update();
				Timer = clock();
				gameOverMenu.Open(screen, graphics.another, Point2D(0, 50));
				if(setting.GetResult() != MRExitGame && setting.GetResult() != MRNone) {
					if(setting.GetResult() == MRMainMenu)
					{
						musicHandler.SetNewMusic(&sounds.titleScreen);
						sounds.forest.SetVolumeModifier(0.4f);
						gameStates.NewState(GSMenuMain);
					}
					else if(setting.GetResult() == MRNewGame){
						levels.count = 1;
						map.NewMap(levels.levels[0]);
						enemies.PopulateEnemies(&map, &graphics);
						player.Reset(map.GetSpawnLocation(), false);
						player.Health  =(float) 100;
						player.InvulnerableTime = 0;
						sounds.forest.SetVolumeModifier(0.4f);
						gameStates.NewState(GSGame);
					}
					setting.Finish();
				}
				break;
			}
			screen.UpdateWindow();
			fps.Delay();
		}
	}
	ClearSDL();
	return 0;
};
Ejemplo n.º 2
0
/** @brief Open the frame file and construct the image of the frame
  */
bool WindowBox::BuildFrame()
{
  // only bother if we have a frame template
  if (!FrameVisible) {
    return false;
  }
  FrameSurface.Init(Size.W, Size.H);

  Surface spritePage;
  if (!spritePage.LoadImage(FRAMES_DIR + SLASH + FrameName + ".png")) {
    LOG(FrameName + " - frame image missing");
    FrameVisible = false;
    return false;
  } else if (spritePage.W != GRID * 4) {
    const real scale = (real)GRID * (real)4 / (real)spritePage.W;
    spritePage.Zoom(scale, scale);
    LOG("frame image size incorrect, scaling to fit");
  }

  // sprite image layout
  // 00C 01M 02E 03C   corner middle edge corner
  // 04M 05M 06I 07M   middle middle icon middle
  // 08E 09D 10U 11E   edge    down   up   edge
  // 12C 13M 14E 15C   corner middle edge corner

  Rect src(GRID, GRID);
  Rect dst(GRID, GRID);

  // create the base frame
  for (szt i = 0, colS = Size.W / GRID; i < colS; ++i) {
    for (szt j = 0, rowS = Size.H / GRID; j < rowS; ++j) {
      szt index;
      if (j == 0) {
        if (i == 0) {
          index = 0;
        } else if (i == colS / 2 && colS > 8) {
          index = 1;
        } else if (i < colS - 1) {
          index = 2;
        } else {
          index = 3;
        }
      } else if (j < rowS - 1) {
        if (i == 0) {
          if (j == rowS / 2 && rowS > 8) {
            index = 4;
          } else {
            index = 8;
          }
        } else if (i < colS - 1) {
          index = 5;
        } else {
          if (j == rowS / 2 && rowS > 8) {
            index = 7;
          } else {
            index = 11;
          }
        }
      } else {
        if (i == 0) {
          index = 12;
        } else if (i == colS / 2 && colS > 8) {
          index = 13;
        } else if (i < colS - 1) {
          index = 14;
        } else {
          index = 15;
        }
      }
      src.X = GRID * (index % 4);
      src.Y = GRID * (index / 4);
      dst.X = GRID * i;
      dst.Y = GRID * j;
      spritePage.SetClip(src);
      spritePage.Draw(FrameSurface, dst);
    }
  }

  // create icons
  FrameUp.Init(GRID, GRID);
  FrameIcon.Init(GRID, GRID);
  FrameDown.Init(GRID, GRID);
  src.X = GRID * 2;
  src.Y = GRID * 2;
  spritePage.SetClip(src);
  spritePage.Draw(FrameUp);
  src.X = GRID * 2;
  src.Y = GRID * 1;
  spritePage.SetClip(src);
  spritePage.Draw(FrameIcon);
  src.X = GRID * 1;
  src.Y = GRID * 2;
  spritePage.SetClip(src);
  spritePage.Draw(FrameDown);

  // set up icon locations
  UpDst.W = UpDst.H = GRID;
  UpDst.X = Size.X + Size.W - 2 * GRID;
  UpDst.Y = Size.Y;
  DownDst.W = DownDst.H = GRID;
  DownDst.X = UpDst.X;
  DownDst.Y = Size.Y + Size.H - GRID;
  IconDst.W = IconDst.H = GRID;
  IconDst.X = Size.X + Size.W - GRID;
  IconDst.Y = Size.Y + GRID;

  return true;
}