Tetris/playstate.cpp

374 lines
6.7 KiB
C++

# include "game.hpp"
# include "states.hpp"
PlayState PlayState::m_PlayState;
void PlayState::Init()
{
Map = map();
Part = part();
Next = part();
level = 0;
lines = 0;
score = 0;
tick = 1;
nameEntered = false;
nameEntering = false;
message = NULL;
textColor = make_color(255, 255, 255);
SDL_EnableKeyRepeat ( REPAET_DELAY, SDL_DEFAULT_REPEAT_INTERVAL );
# ifdef DEBUG
std::cout << "PlayState Init Successful" << std::endl;
# endif
}
void PlayState::Clean()
{
SDL_EnableKeyRepeat ( 0, 0 );
# ifdef DEBUG
std::cout << "PlayState Clean Successful" << std::endl;
# endif
}
void PlayState::Pause()
{
SDL_EnableKeyRepeat ( 0, 0 );
# ifdef DEBUG
std::cout << "PlayState Paused" << std::endl;
# endif
}
void PlayState::Resume()
{
SDL_EnableKeyRepeat ( REPAET_DELAY, SDL_DEFAULT_REPEAT_INTERVAL );
# ifdef DEBUG
std::cout << "PlayState Resumed" << std::endl;
# endif
}
void PlayState::HandleEvents ( game* Game )
{
SDL_Event event;
while ( SDL_PollEvent ( &event ) )
{
if ( event.type == SDL_QUIT)
Game->Quit();
/* Game Over - Write name for score */
if( nameEntering == true && nameEntered == false )
{
//Get user input
name.handle_input(Game, &event);
//If the enter key was pressed
if( ( event.type == SDL_KEYDOWN ) && ( event.key.keysym.sym == SDLK_RETURN ) )
{
//Change the flag
nameEntered = true;
nameEntering = false;
Save(name.GetStr(), lines);
name.Clear();
//Free the old message surface
SDL_FreeSurface( message );
//Change the message
}
name.show_centered(Game);
}
/* Game key logic... */
else
{
switch ( event.type )
{
/* key pressed.... */
case SDL_KEYDOWN:
switch ( event.key.keysym.sym )
{
/* ESCAPE - Pause game (run PauseState) */
case SDLK_ESCAPE:
{
//Game->SetRunning(false);
Game->PushState ( PauseState::Instance() );
}
break;
/* move part to the right */
case SDLK_RIGHT:
{
/* */
part p = Part;
# ifdef DEBUG
std::cout << "move to Right: ";
# endif
Part.move ( 1, 0 );
if ( Map.isCollision ( Part, true ) )
{
# ifdef DEBUG
std::cout << "Collision" << std::endl;
# endif
Part = p;
}
}
break;
case SDLK_LEFT:
{
part p = Part;
# ifdef DEBUG
std::cout << "move to Left: ";
# endif
Part.move ( -1, 0 );
if ( Map.isCollision ( Part, true ) )
{
# ifdef DEBUG
std::cout << "Collision" << std::endl;
# endif
Part = p;
}
}
break;
case SDLK_DOWN:
# ifdef DEBUG
std::cout << "move to Down: ";
# endif
if ( !Map.isCollision ( Part ) )
{
Part.move ( 0, 1 );
}
else
{
# ifdef DEBUG
std::cout << "Collision" << std::endl;
# endif
}
break;
case SDLK_UP:
{
part p = Part;
# ifdef DEBUG
std::cout << "Rotate: ";
# endif
Part.rotate();
if ( Map.isCollision ( Part, true ) )
{
# ifdef DEBUG
std::cout << "Map: Collission" << std::endl;
# endif
Part = p;
}
}
break;
case SDLK_SPACE:
# ifdef DEBUG
std::cout << "move to Bottom" << std::endl;
# endif
while ( !Map.isCollision ( Part ) )
{
Part.move ( 0, 1 );
tick = ( FPS / ( ( level > 30 ) ? 30 : level ) ) - 1;
}
break;
case SDLK_RETURN:
{
# ifdef DEBUG
std::cout << "continue" << std::endl;
# endif
//Game->m_bGameOver = false;
}
break;
}
break;
}
}
}
}
void PlayState::Update ( game* Game )
{
/* kontrola či je plné hracie pole... */
if ( Map.isFull() )
{
/* Start enter name */
nameEntering = true;
if (nameEntered)
{
nameEntering = false;
nameEntered = false;
//text.setString("Score " + intToStr(Map.getScore()) + "\n" + "Press enter");
Map.reset();
lines = 0;
level = 1;
}
}
if (!nameEntering)
{
if ( level == 0 )
{
level = 1;
}
if ( tick % ( FPS / ( ( level > 30 ) ? 30 : level ) ) == 0 && !Map.isCollision ( Part ) )
{
# ifdef DEBUG
std::cout << "move to Down: ";
# endif
Part.move ( 0, 1 );
}
/*
if ( tick % ( FPS / ( ( level > 30 ) ? 30 : level ) ) != 0 && Map.isCollision ( Part ) && tick != ( FPS / ( ( level > 30 ) ? 30 : level ) ) -1 )
std::cout << "DEBUG" << std::endl;
*/
if ( Map.isCollision ( Part ) && ( tick ) == ( FPS / ( ( level > 30 ) ? 30 : level ) ) -1 )
{
int count;
Map.addPart ( Part );
count = Map.destroyLines();
lines += count;
// level = (lines >= 5) ? (lines / 10) : 0;
level = lines / 10 + 1;
# ifdef DEBUG
std::cout << "Lines: " << lines << std::endl;
std::cout << "Level: " << level << std::endl;
# endif
Part = Next;
Next = part();
}
if ( tick < FPS )
{
tick++;
}
else
{
tick = 1;
}
}
}
void PlayState::Draw ( game* Game )
{
if (!nameEntering)
{
SDL_FillRect ( Game->GetScreen(), NULL, 0x000000 );
SDL_Rect rect = {WIDTH * SIZE, 0, 130, HEIGHT * SIZE};
SDL_FillRect ( Game->GetScreen(), &rect, 0x111111 );
Map.draw ( Game->GetScreen() );
Part.draw ( Game->GetScreen() );
Next.draw ( 165, 100, Game->GetScreen() );
PlayInfo(this, Game);
}
else
{
SDL_FillRect ( Game->GetScreen(), NULL, 0x000000 );
message = TTF_RenderText_Solid( Game->GetfontGame(), "Enter Name: ", textColor );
apply_surface(10, 40, message, Game->GetScreen());
name.show_centered(Game);
}
SDL_Flip ( Game->GetScreen() );
}
void PlayState::Save ( string Name, int Lines )
{
ofstream file;
file.open(".score", ios_base::app);
if (file.is_open())
{
file << Name << " " << Lines << endl;
file.close();
}
else
{
cerr << "Cannot open file '.score'" << endl;
}
}
void PlayInfo ( PlayState * Info, game * Game )
{
SDL_Color textColor;
SDL_Surface * message;
char temp[10];
textColor = make_color(255, 255, 255);
message = TTF_RenderText_Solid( Game->GetfontGame(), "Lines", textColor);
apply_surface(220, 150, message, Game->GetScreen());
std::sprintf ( temp, "%d", Info->lines);
message = TTF_RenderText_Solid( Game->GetfontGame(), temp, textColor);
apply_surface(220, 185, message, Game->GetScreen());
message = TTF_RenderText_Solid( Game->GetfontGame(), "Level", textColor);
apply_surface(220, 230, message, Game->GetScreen());
std::sprintf ( temp, "%d", Info->level);
message = TTF_RenderText_Solid( Game->GetfontGame(), temp, textColor);
apply_surface(220, 265, message, Game->GetScreen());
SDL_FreeSurface(message);
}