コード例 #1
0
ファイル: main.cpp プロジェクト: wmolicki/tetris
int main(int args, char** argc)
{
	try
	{
		Window::Init("FPS");
	}
	catch (const std::runtime_error &g)
	{
		std::cout << g.what() << std::endl;
		Window::Quit();
		return -1;
	}
	Timer timer;
	int frame = 0;
		
	//setting a position to draw image in
	SDL_Texture *img = Window::LoadImage("../img/squares.png");

	//set up board
	CBoard Gameboard;
	SDL_Rect pos = {Window::mBox.w / 2 - (5*TILE_SIZE),
		Window::mBox.h - (17*TILE_SIZE),TILE_SIZE*16,TILE_SIZE*10};
	//Gameboard.Init(10,16,pos);
	Gameboard.LoadForMenus();
	
	bool quit = false;
	
	SDL_Event e;

	CTetromino piece;
	CTetromino *tetrapiece;
	tetrapiece = &piece;

	int fpsCount = 0;
	
	//main loop
	timer.Start();

	while(!quit)
	{
		//read input, handle it
		while(SDL_PollEvent(&e))
		{
			switch (e.type)
			{
			case SDL_QUIT:
				quit = true;
				break;
			case SDL_KEYDOWN:
				
				switch (e.key.keysym.sym)
				{
				case SDLK_UP:
					if (Gameboard.GameState == MENUS)
					{
						Gameboard.SelectorPos -= SELECTOR_JUMP;
					}
					break;
				case SDLK_DOWN:
					if (Gameboard.GameState == GAME)
					{
						if (piece.can_move_down() && Gameboard.is_clear_down(tetrapiece))
						{
							//grays out old piece position
							Gameboard.GrayOutOldPosition(tetrapiece);
							//moves coordinates
							piece.MoveDown();
							//updates piece
							moves += 10;	
						}
						else
						{
							Gameboard.landed = true;
						}
					}
					else if (Gameboard.GameState == MENUS)
					{
						Gameboard.SelectorPos += SELECTOR_JUMP;
					}
					break;
				case SDLK_LEFT:
					if (Gameboard.GameState == GAME)
					{
						if (piece.can_move_left() && Gameboard.is_clear_left(tetrapiece))
						{
							Gameboard.GrayOutOldPosition(tetrapiece);
							piece.MoveLeft();
							moves -=1;
						}
					}
					break;
				case SDLK_RIGHT:
					if (Gameboard.GameState == GAME)
					{
						if (piece.can_move_right() && Gameboard.is_clear_right(tetrapiece))
						{
							Gameboard.GrayOutOldPosition(tetrapiece);
							piece.MoveRight();
							moves += 1;
						}
					}
					break;
				case SDLK_r:
					if (Gameboard.GameState == GAME)
					{
						Gameboard.GrayOutOldPosition(tetrapiece);
						Gameboard.RotateTetromino(tetrapiece, moves, CLOCKWISE);
					}
					break;
				case SDLK_c:
					if (Gameboard.GameState == GAME)
					{
						Gameboard.GrayOutOldPosition(tetrapiece);
						Gameboard.RotateTetromino(tetrapiece, moves, COUNTERCLOCKWISE);
					}
					break;
				case SDLK_RETURN:
					if (Gameboard.GameState == MENUS)
					{
						if (Gameboard.SelectorPos == 0)
						{
							Gameboard.GameState = GAME;
							Gameboard.Init(10,16,pos);
						}
						else if (Gameboard.SelectorPos == 3*SELECTOR_JUMP)
						{
							quit = true;
						}
						else if (Gameboard.SelectorPos == 2*SELECTOR_JUMP)
						{
							Gameboard.GameState = HISCORES;
						}
						else if(Gameboard.SelectorPos == 1*SELECTOR_JUMP)
						{
							Gameboard.GameState = OPTIONS;
						}
					}
					
					break;
				case SDLK_ESCAPE:
					Gameboard.LoadForMenus();
					Gameboard.GameState = MENUS;
					break;
				}
				break;
			case SDL_KEYUP:
				switch (e.key.keysym.sym)
				{
					case SDLK_RIGHT:
						break;
					case SDLK_LEFT:
						break;
					case SDLK_UP:
						break;
					case SDLK_DOWN:
						break;
				}
				break;
			}
		}
		//render the scene
		//std::cout << moving_tile << std::endl;
		Window::Clear();
		switch (Gameboard.GameState)
		{
			case MENUS:
			{
				Gameboard.DrawMenus(Window::mRenderer, Window::font);
				break;
			}
			case GAME:
			{
				if (Gameboard.landed)
				{
					Gameboard.landed = true;

					Gameboard.MarkLanded();
					Gameboard.EatLine();

					Gameboard.CreateTetromino(tetrapiece);
					Gameboard.GetNewPieceOnBoard(tetrapiece);
					moves = 0;
				}
				Gameboard.Update(tetrapiece);

				Gameboard.DrawBoard(Window::mRenderer);
				Gameboard.DrawScore(Window::mRenderer, Window::font);
				break;
			}
			case GAMEOVER:			
			{
				//TODO: this should run only once
				//Gameboard.landed = true;
				
				Gameboard.DrawGameOverScreen(Window::mRenderer, Window::font);
				Gameboard.DrawHiscores(Window::mRenderer, Window::font);
				break;
			}
			case HISCORES:		
			{
				Gameboard.DrawHiscores(Window::mRenderer, Window::font);
				//std::cout << "drawn";
				break;
			}
		};
		Window::Present();

		frame += 1; // increment rendered frames
		if (frame > 62)
			SDL_Delay(17);
		if (timer.Ticks() > 1000)
		{
			if (Gameboard.GameState == GAME)
			{
				if (piece.can_move_down() && Gameboard.is_clear_down(tetrapiece))
				{
					Gameboard.GrayOutOldPosition(tetrapiece);
					piece.MoveDown();
					moves += 10;
				}
				else
				{
					Gameboard.landed = true;
				}
			}

			fpsCount = frame;
			
			timer.Restart();
			Window::ChangeWindowTitle("FPS: " + std::to_string(fpsCount));
			frame = 0;
		}
	}

	//SDL CLEANUP and QUIT
	
	SDL_DestroyTexture(img);
	
	Window::Quit();
	return 0;
}