First commit
This commit is contained in:
commit
b722577a98
46
.gitignore
vendored
Normal file
46
.gitignore
vendored
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
# CMake ignore...
|
||||||
|
CMakeCache.txt
|
||||||
|
CMakeFiles
|
||||||
|
Makefile
|
||||||
|
cmake_install.cmake
|
||||||
|
install_manifest.txt
|
||||||
|
|
||||||
|
# Compiled Object files
|
||||||
|
*.slo
|
||||||
|
*.lo
|
||||||
|
*.o
|
||||||
|
*.obj
|
||||||
|
|
||||||
|
# Precompiled Headers
|
||||||
|
*.gch
|
||||||
|
*.pch
|
||||||
|
|
||||||
|
# Compiled Dynamic libraries
|
||||||
|
*.so
|
||||||
|
*.dylib
|
||||||
|
*.dll
|
||||||
|
|
||||||
|
# Fortran module files
|
||||||
|
*.mod
|
||||||
|
|
||||||
|
# Compiled Static libraries
|
||||||
|
*.lai
|
||||||
|
*.la
|
||||||
|
*.a
|
||||||
|
*.lib
|
||||||
|
|
||||||
|
# Executables
|
||||||
|
*.exe
|
||||||
|
*.out
|
||||||
|
*.app
|
||||||
|
|
||||||
|
# backup
|
||||||
|
*~
|
||||||
|
|
||||||
|
# score
|
||||||
|
.score
|
||||||
|
|
||||||
|
# unsuported build
|
||||||
|
windows*
|
||||||
|
|
||||||
|
build/tetris
|
53
.kdev4/Tetris.kdev4
Normal file
53
.kdev4/Tetris.kdev4
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
[Buildset]
|
||||||
|
BuildItems=@Variant(\x00\x00\x00\t\x00\x00\x00\x00\x01\x00\x00\x00\x0b\x00\x00\x00\x00\x01\x00\x00\x00\x0c\x00T\x00e\x00t\x00r\x00i\x00s)
|
||||||
|
|
||||||
|
[CMake]
|
||||||
|
Build Directory Count=1
|
||||||
|
CMakeDir=/usr/share/cmake-3.0/Modules
|
||||||
|
Current Build Directory Index=0
|
||||||
|
ProjectRootRelative=./
|
||||||
|
|
||||||
|
[CMake][CMake Build Directory 0]
|
||||||
|
Build Directory Path=file:///home/juraj/projects/Tetris/build
|
||||||
|
Build Type=Debug
|
||||||
|
CMake Binary=file:///usr/bin/cmake
|
||||||
|
Environment Profile=
|
||||||
|
Extra Arguments=
|
||||||
|
Install Directory=file:///usr/local
|
||||||
|
|
||||||
|
[Defines And Includes][Compiler]
|
||||||
|
Name=GCC
|
||||||
|
Path=gcc
|
||||||
|
Type=GCC
|
||||||
|
|
||||||
|
[Launch]
|
||||||
|
Launch Configurations=Launch Configuration 0
|
||||||
|
|
||||||
|
[Launch][Launch Configuration 0]
|
||||||
|
Configured Launch Modes=execute
|
||||||
|
Configured Launchers=nativeAppLauncher
|
||||||
|
Name=Tetris
|
||||||
|
Type=Native Application
|
||||||
|
|
||||||
|
[Launch][Launch Configuration 0][Data]
|
||||||
|
Arguments=
|
||||||
|
Debugger Shell=
|
||||||
|
Dependencies=@Variant(\x00\x00\x00\t\x00\x00\x00\x00\x00)
|
||||||
|
Dependency Action=Nothing
|
||||||
|
Display Demangle Names=true
|
||||||
|
Display Static Members=true
|
||||||
|
EnvironmentGroup=default
|
||||||
|
Executable=
|
||||||
|
External Terminal=xterm -hold -e %exe
|
||||||
|
GDB Path=
|
||||||
|
Project Target=Tetris,tetris
|
||||||
|
Remote GDB Config Script=
|
||||||
|
Remote GDB Run Script=
|
||||||
|
Remote GDB Shell Script=
|
||||||
|
Start With=ApplicationOutput
|
||||||
|
Use External Terminal=true
|
||||||
|
Working Directory=
|
||||||
|
isExecutable=false
|
||||||
|
|
||||||
|
[SourceFileTemplates]
|
||||||
|
LastUsedTemplate=/home/juraj/.kde/share/apps/kdevfiletemplates/template_descriptions/cpp_basic.desktop
|
20
.kdev4/_custom.kdev4
Normal file
20
.kdev4/_custom.kdev4
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
[Containments][1]
|
||||||
|
ActionPluginsSource=Global
|
||||||
|
activity=tetris
|
||||||
|
activityId=
|
||||||
|
desktop=-1
|
||||||
|
formfactor=0
|
||||||
|
geometry=0,0,1098,581
|
||||||
|
immutability=1
|
||||||
|
lastDesktop=-1
|
||||||
|
lastScreen=0
|
||||||
|
location=0
|
||||||
|
orientation=2
|
||||||
|
plugin=newspaper
|
||||||
|
screen=0
|
||||||
|
zvalue=0
|
||||||
|
|
||||||
|
[Project]
|
||||||
|
Manager=KDevCMakeManager
|
||||||
|
Name=tetris
|
||||||
|
VersionControl=
|
57
.kdev4/tetris.kdev4
Normal file
57
.kdev4/tetris.kdev4
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
[Buildset]
|
||||||
|
BuildItems=@Variant(\x00\x00\x00\t\x00\x00\x00\x00\x00)
|
||||||
|
|
||||||
|
[CMake]
|
||||||
|
Build Directory Count=2
|
||||||
|
CMakeDir=/usr/share/cmake-2.8/Modules
|
||||||
|
Current Build Directory Index=0
|
||||||
|
ProjectRootRelative=./
|
||||||
|
|
||||||
|
[CMake][CMake Build Directory 0]
|
||||||
|
Build Directory Path=file:///home/juraj/projects/tetris/build
|
||||||
|
Build Type=
|
||||||
|
CMake Binary=file:///usr/bin/cmake
|
||||||
|
Environment Profile=default
|
||||||
|
Extra Arguments=
|
||||||
|
Install Directory=file:///usr/local
|
||||||
|
|
||||||
|
[CMake][CMake Build Directory 1]
|
||||||
|
Build Directory Path=file:///home/juraj/projects/tetris/releare
|
||||||
|
Build Type=Release
|
||||||
|
CMake Binary=file:///usr/bin/cmake
|
||||||
|
Environment Profile=Release
|
||||||
|
Extra Arguments=
|
||||||
|
Install Directory=file:///usr/local
|
||||||
|
|
||||||
|
[Launch]
|
||||||
|
Launch Configurations=Launch Configuration 0
|
||||||
|
|
||||||
|
[Launch][Launch Configuration 0]
|
||||||
|
Configured Launch Modes=execute
|
||||||
|
Configured Launchers=nativeAppLauncher
|
||||||
|
Name=Tetris
|
||||||
|
Type=Native Application
|
||||||
|
|
||||||
|
[Launch][Launch Configuration 0][Data]
|
||||||
|
Arguments=
|
||||||
|
Debugger Shell=
|
||||||
|
Dependencies=@Variant(\x00\x00\x00\t\x00\x00\x00\x00\x00)
|
||||||
|
Dependency Action=Nothing
|
||||||
|
Display Demangle Names=true
|
||||||
|
Display Static Members=true
|
||||||
|
EnvironmentGroup=default
|
||||||
|
Executable=
|
||||||
|
External Terminal=xterm -hold -e %exe
|
||||||
|
GDB Path=
|
||||||
|
Project Target=tetris,tetris
|
||||||
|
Remote GDB Config Script=
|
||||||
|
Remote GDB Run Script=
|
||||||
|
Remote GDB Shell Script=
|
||||||
|
Start With=GdbConsole
|
||||||
|
Use External Terminal=true
|
||||||
|
Working Directory=
|
||||||
|
isExecutable=false
|
||||||
|
|
||||||
|
[MakeBuilder]
|
||||||
|
Number Of Jobs=3
|
||||||
|
Su Command=2
|
27
CMakeLists.txt
Normal file
27
CMakeLists.txt
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
cmake_minimum_required(VERSION 2.8)
|
||||||
|
|
||||||
|
project(tetris)
|
||||||
|
|
||||||
|
add_executable(
|
||||||
|
tetris
|
||||||
|
scoreitem.cpp
|
||||||
|
scorestate.cpp
|
||||||
|
stringinput.cpp
|
||||||
|
part.cpp
|
||||||
|
main.cpp
|
||||||
|
global.cpp
|
||||||
|
map.cpp
|
||||||
|
resource.cpp
|
||||||
|
game.cpp
|
||||||
|
pausestate.cpp
|
||||||
|
playstate.cpp
|
||||||
|
menustate.cpp
|
||||||
|
menuitem.cpp
|
||||||
|
menu.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(tetris SDL SDL_ttf)
|
||||||
|
|
||||||
|
set(CMAKE_CXX_FLAGS "-Wextra -ftabstop=4 -march=native -std=gnu++11 -fshow-column -ftabstop=4 -frounding-math -pipe")
|
||||||
|
|
||||||
|
install(TARGETS tetris RUNTIME DESTINATION bin)
|
4
Tetris.kdev4
Normal file
4
Tetris.kdev4
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
[Project]
|
||||||
|
Name=Tetris
|
||||||
|
Manager=KDevCMakeManager
|
||||||
|
VersionControl=
|
BIN
build/data-latin.ttf
Normal file
BIN
build/data-latin.ttf
Normal file
Binary file not shown.
BIN
build/handelgotd.ttf
Normal file
BIN
build/handelgotd.ttf
Normal file
Binary file not shown.
228
game.cpp
Normal file
228
game.cpp
Normal file
@ -0,0 +1,228 @@
|
|||||||
|
#include "game.hpp"
|
||||||
|
#include "gamestate.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
game::game()
|
||||||
|
{ }
|
||||||
|
|
||||||
|
game::~game()
|
||||||
|
{ }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool game::Init()
|
||||||
|
{
|
||||||
|
if ( SDL_Init ( SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_AUDIO ) == -1 )
|
||||||
|
{
|
||||||
|
cerr << "[ERROR] Cannot init SDL" << endl;
|
||||||
|
|
||||||
|
m_bRunning = false;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_EnableUNICODE ( SDL_ENABLE );
|
||||||
|
|
||||||
|
|
||||||
|
SDL_WM_SetCaption ( "[SG]Tetris", NULL );
|
||||||
|
|
||||||
|
m_pScreen = SDL_SetVideoMode ( WIDTH * SIZE + 130, HEIGHT * SIZE, 32, SDL_HWSURFACE | SDL_DOUBLEBUF );
|
||||||
|
|
||||||
|
if ( m_pScreen == NULL )
|
||||||
|
{
|
||||||
|
cerr << "[ERROR] Cannot setup screen" << endl;
|
||||||
|
|
||||||
|
m_bRunning = false;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if ( TTF_Init() )
|
||||||
|
{
|
||||||
|
cerr << "[ERROR] Cannot init SDL_ttf" << endl;
|
||||||
|
|
||||||
|
m_bRunning = false;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
m_bRunning = Load();
|
||||||
|
m_bGameOver = false;
|
||||||
|
tick = 0;
|
||||||
|
|
||||||
|
return m_bRunning;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool game::Load()
|
||||||
|
{
|
||||||
|
fontMenu = TTF_OpenFont ( "data-latin.ttf", 38 );
|
||||||
|
|
||||||
|
if ( fontMenu == NULL )
|
||||||
|
{
|
||||||
|
cerr << "[ERROR] Cannot load font 'data-latin.ttf'" << endl;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fontGame = TTF_OpenFont ( "handelgotd.ttf", 30 );
|
||||||
|
|
||||||
|
if ( fontGame == NULL )
|
||||||
|
{
|
||||||
|
cerr << "[ERROR] Cannot load font 'handelgotd.ttf'" << endl;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void game::ChangeState ( GameState * state )
|
||||||
|
{
|
||||||
|
// cleanup the current state
|
||||||
|
if ( !states.empty() )
|
||||||
|
{
|
||||||
|
states.back()->Clean();
|
||||||
|
states.pop_back();
|
||||||
|
}
|
||||||
|
|
||||||
|
// store and init the new state
|
||||||
|
states.push_back ( state );
|
||||||
|
states.back()->Init();
|
||||||
|
}
|
||||||
|
|
||||||
|
void game::PushState ( GameState * state )
|
||||||
|
{
|
||||||
|
// pause current state
|
||||||
|
if ( !states.empty() )
|
||||||
|
{
|
||||||
|
states.back()->Pause();
|
||||||
|
}
|
||||||
|
|
||||||
|
// store and init the new state
|
||||||
|
states.push_back ( state );
|
||||||
|
states.back()->Init();
|
||||||
|
}
|
||||||
|
|
||||||
|
void game::PopState()
|
||||||
|
{
|
||||||
|
// cleanup the current state
|
||||||
|
if ( !states.empty() )
|
||||||
|
{
|
||||||
|
states.back()->Clean();
|
||||||
|
states.pop_back();
|
||||||
|
}
|
||||||
|
|
||||||
|
// resume previous state
|
||||||
|
if ( !states.empty() )
|
||||||
|
{
|
||||||
|
states.back()->Resume();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void game::DelStateF()
|
||||||
|
{
|
||||||
|
// cleanup the first state
|
||||||
|
if ( !states.empty() )
|
||||||
|
{
|
||||||
|
states.front()->Clean();
|
||||||
|
states.erase(states.begin());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# ifdef DEBUG
|
||||||
|
int game::CountStates()
|
||||||
|
{
|
||||||
|
return states.size();
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
|
||||||
|
void game::HandleEvents()
|
||||||
|
{
|
||||||
|
states.back()->HandleEvents ( this );
|
||||||
|
}
|
||||||
|
|
||||||
|
void game::Update()
|
||||||
|
{
|
||||||
|
states.back()->Update ( this );
|
||||||
|
}
|
||||||
|
|
||||||
|
void game::Draw()
|
||||||
|
{
|
||||||
|
states.back()->Draw ( this );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SDL_Surface * game::GetScreen()
|
||||||
|
{
|
||||||
|
return m_pScreen;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool game::Running()
|
||||||
|
{
|
||||||
|
return m_bRunning;
|
||||||
|
}
|
||||||
|
|
||||||
|
void game::Clean()
|
||||||
|
{
|
||||||
|
# ifdef DEBUG
|
||||||
|
cout << "Cleanning..." << endl;
|
||||||
|
# endif
|
||||||
|
|
||||||
|
TTF_CloseFont ( fontMenu );
|
||||||
|
|
||||||
|
TTF_Quit();
|
||||||
|
SDL_Quit();
|
||||||
|
}
|
||||||
|
|
||||||
|
void game::Quit()
|
||||||
|
{
|
||||||
|
m_bRunning = false;
|
||||||
|
|
||||||
|
# ifdef DEBUG
|
||||||
|
cout << "Shutting down..." << endl;
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void game::ReduceFPS()
|
||||||
|
{
|
||||||
|
if ( 1000 / FPS > ( SDL_GetTicks() - start ) )
|
||||||
|
{
|
||||||
|
SDL_Delay ( 1000 / FPS - ( SDL_GetTicks() - start ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void game::UpdateFPS()
|
||||||
|
{
|
||||||
|
if ( tick <= FPS )
|
||||||
|
{
|
||||||
|
tick += 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tick = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Uint32 game::GetStart()
|
||||||
|
{
|
||||||
|
return start;
|
||||||
|
}
|
||||||
|
|
||||||
|
void game::SetStart ( Uint32 start )
|
||||||
|
{
|
||||||
|
this->start = start;
|
||||||
|
}
|
||||||
|
|
||||||
|
TTF_Font * game::GetfontGame()
|
||||||
|
{
|
||||||
|
return fontGame;
|
||||||
|
}
|
||||||
|
|
||||||
|
TTF_Font * game::GetfontMenu()
|
||||||
|
{
|
||||||
|
return fontMenu;
|
||||||
|
}
|
73
game.hpp
Normal file
73
game.hpp
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
#ifndef GAME_HPP_INCLUDED
|
||||||
|
#define GAME_HPP_INCLUDED
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <vector>
|
||||||
|
#include <SDL/SDL.h>
|
||||||
|
#include <SDL/SDL_ttf.h>
|
||||||
|
|
||||||
|
#include "map.hpp"
|
||||||
|
#include "part.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
|
||||||
|
class GameState;
|
||||||
|
|
||||||
|
class game
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
game();
|
||||||
|
~game();
|
||||||
|
|
||||||
|
bool Init();
|
||||||
|
bool Load();
|
||||||
|
|
||||||
|
void ChangeState ( GameState * state );
|
||||||
|
void PushState ( GameState * state );
|
||||||
|
void PopState();
|
||||||
|
void DelStateF();
|
||||||
|
|
||||||
|
# ifdef DEBUG
|
||||||
|
int CountStates();
|
||||||
|
# endif
|
||||||
|
|
||||||
|
|
||||||
|
void HandleEvents();
|
||||||
|
void Update();
|
||||||
|
void Draw();
|
||||||
|
|
||||||
|
SDL_Surface * GetScreen();
|
||||||
|
Uint32 GetStart();
|
||||||
|
|
||||||
|
TTF_Font * GetfontMenu();
|
||||||
|
TTF_Font * GetfontGame();
|
||||||
|
|
||||||
|
void SetStart ( Uint32 start );
|
||||||
|
void SetRunning ( bool m_bRunning );
|
||||||
|
|
||||||
|
void Clean();
|
||||||
|
|
||||||
|
bool Running();
|
||||||
|
void Quit();
|
||||||
|
|
||||||
|
void ReduceFPS();
|
||||||
|
void UpdateFPS();
|
||||||
|
|
||||||
|
private:
|
||||||
|
SDL_Surface * m_pScreen;
|
||||||
|
vector <GameState *> states;
|
||||||
|
|
||||||
|
bool m_bRunning;
|
||||||
|
bool m_bGameOver;
|
||||||
|
|
||||||
|
TTF_Font * fontMenu;
|
||||||
|
TTF_Font * fontGame;
|
||||||
|
|
||||||
|
Uint32 start;
|
||||||
|
int tick;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
32
gamestate.hpp
Normal file
32
gamestate.hpp
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
#ifndef GAME_STATE_HPP_INCLUDED
|
||||||
|
#define GAME_STATE_HPP_INCLUDED
|
||||||
|
|
||||||
|
#include "game.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
class GameState
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual void Init() = 0;
|
||||||
|
virtual void Clean() = 0;
|
||||||
|
|
||||||
|
virtual void Pause() = 0;
|
||||||
|
virtual void Resume() = 0;
|
||||||
|
|
||||||
|
virtual void HandleEvents ( game * Game ) = 0;
|
||||||
|
virtual void Update ( game * Game ) = 0;
|
||||||
|
virtual void Draw ( game * Game ) = 0;
|
||||||
|
|
||||||
|
void ChangeState ( game * Game, GameState * state )
|
||||||
|
{
|
||||||
|
Game->ChangeState ( state );
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
GameState() { }
|
||||||
|
|
||||||
|
bool FirstRun;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
29
global.cpp
Normal file
29
global.cpp
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
#include "global.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
void drawQuad ( SDL_Surface * screen, short int x, short int y, int color )
|
||||||
|
{
|
||||||
|
SDL_Rect rect = {x, y, SIZE, SIZE};
|
||||||
|
|
||||||
|
SDL_FillRect ( screen, &rect, color );
|
||||||
|
}
|
||||||
|
|
||||||
|
void apply_surface ( int x, int y, SDL_Surface * source, SDL_Surface * destination, SDL_Rect * clip )
|
||||||
|
{
|
||||||
|
//Holds offsets
|
||||||
|
SDL_Rect offset;
|
||||||
|
|
||||||
|
//Get offsets
|
||||||
|
offset.x = x;
|
||||||
|
offset.y = y;
|
||||||
|
|
||||||
|
//Blit
|
||||||
|
SDL_BlitSurface ( source, clip, destination, &offset );
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_Color make_color ( Uint8 r, Uint8 g, Uint8 b )
|
||||||
|
{
|
||||||
|
SDL_Color color = {r, g, b};
|
||||||
|
|
||||||
|
return color;
|
||||||
|
}
|
19
global.hpp
Normal file
19
global.hpp
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
#ifndef GLOBAL_HPP_INCLUDED
|
||||||
|
#define GLOBAL_HPP_INCLUDED
|
||||||
|
|
||||||
|
#include <SDL/SDL.h>
|
||||||
|
#include <SDL/SDL_ttf.h>
|
||||||
|
#include <sstream>
|
||||||
|
#include <cstdio>
|
||||||
|
|
||||||
|
#include "resource.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void drawQuad ( SDL_Surface* screen, short int x, short int y, int color );
|
||||||
|
void apply_surface ( int x, int y, SDL_Surface * source, SDL_Surface * destination, SDL_Rect * clip = NULL );
|
||||||
|
SDL_Color make_color ( Uint8 r, Uint8 g, Uint8 b );
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
44
main.cpp
Normal file
44
main.cpp
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
#include <iostream>
|
||||||
|
#include <ctime>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <SDL/SDL.h>
|
||||||
|
|
||||||
|
#include "resource.hpp"
|
||||||
|
#include "global.hpp"
|
||||||
|
#include "game.hpp"
|
||||||
|
|
||||||
|
#include "states.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
|
||||||
|
int main ( int argc, char ** argv )
|
||||||
|
{
|
||||||
|
srand ( time ( NULL ) );
|
||||||
|
|
||||||
|
game Game;
|
||||||
|
|
||||||
|
if ( !Game.Init() )
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Game.ChangeState ( MenuState::Instance() );
|
||||||
|
|
||||||
|
while ( Game.Running() )
|
||||||
|
{
|
||||||
|
Game.SetStart ( SDL_GetTicks() );
|
||||||
|
|
||||||
|
Game.HandleEvents();
|
||||||
|
Game.Update();
|
||||||
|
Game.Draw();
|
||||||
|
|
||||||
|
Game.ReduceFPS();
|
||||||
|
}
|
||||||
|
|
||||||
|
Game.Clean();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
140
map.cpp
Normal file
140
map.cpp
Normal file
@ -0,0 +1,140 @@
|
|||||||
|
#include "map.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
map::map()
|
||||||
|
{
|
||||||
|
reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
void map::reset()
|
||||||
|
{
|
||||||
|
for (int y = 0; y < HEIGHT; y++)
|
||||||
|
{
|
||||||
|
for (int x = 0; x < WIDTH; x++)
|
||||||
|
{
|
||||||
|
data[y][x] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool map::isCollision(part Part, bool strict)
|
||||||
|
{
|
||||||
|
for (int y = 0; y < 4; y++)
|
||||||
|
{
|
||||||
|
for (int x = 0; x < 4; x++)
|
||||||
|
{
|
||||||
|
if (strict)
|
||||||
|
{
|
||||||
|
if ( (Part.getPosY() + y >= 0) &&
|
||||||
|
( ( data[Part.getPosY() + y][Part.getPosX() + x] && Part.getElement(x, y) ) ||
|
||||||
|
( Part.getElement(x, y) && Part.getPosX() + x >= WIDTH)) )
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( (Part.getPosY() + y >= 0) &&
|
||||||
|
( ( data[Part.getPosY() + y + 1][Part.getPosX() + x] && Part.getElement(x, y) ) ||
|
||||||
|
( Part.getElement(x, y) && Part.getPosY() + y >= HEIGHT - 1)) )
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void map::addPart(part Part)
|
||||||
|
{
|
||||||
|
for (int y = 0; y < 4; y++)
|
||||||
|
{
|
||||||
|
for (int x = 0; x < 4; x++)
|
||||||
|
{
|
||||||
|
if (Part.getElement(x, y))
|
||||||
|
data[Part.getPosY() + y][Part.getPosX() + x] = Part.getColor() + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void map::applyGravity(int h)
|
||||||
|
{
|
||||||
|
int tmp = 0;
|
||||||
|
|
||||||
|
for (int y = h; y > -1; y--)
|
||||||
|
{
|
||||||
|
for (int x = 0; x < WIDTH; x++)
|
||||||
|
{
|
||||||
|
if (y < (HEIGHT - 1) && data[y + 1][x] == 0 && data[y][x])
|
||||||
|
{
|
||||||
|
tmp = data[y + 1][x];
|
||||||
|
data[y + 1][x] = data[y][x];
|
||||||
|
data[y][x] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int map::destroyLines()
|
||||||
|
{
|
||||||
|
int pocet = 0;
|
||||||
|
|
||||||
|
for (int y = 0; y < HEIGHT; y++)
|
||||||
|
{
|
||||||
|
bool good = true;
|
||||||
|
|
||||||
|
for (int x = 0; x < WIDTH; x++)
|
||||||
|
{
|
||||||
|
if (!data[y][x])
|
||||||
|
{
|
||||||
|
good = false;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (good)
|
||||||
|
{
|
||||||
|
for (int x = 0; x < WIDTH; x++)
|
||||||
|
{
|
||||||
|
data[y][x] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
applyGravity(y);
|
||||||
|
pocet++;
|
||||||
|
|
||||||
|
y = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return pocet;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool map::isFull()
|
||||||
|
{
|
||||||
|
for (int x = 0; x < WIDTH; x++)
|
||||||
|
{
|
||||||
|
if (data[0][x])
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void map::draw(SDL_Surface *screen)
|
||||||
|
{
|
||||||
|
for(int i = 0; i < HEIGHT; i++)
|
||||||
|
{
|
||||||
|
for(int m = 0; m < WIDTH; m++)
|
||||||
|
{
|
||||||
|
if(data[i][m])
|
||||||
|
{
|
||||||
|
drawQuad(screen, m * SIZE, i * SIZE, colors[data[i][m] - 1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
29
map.hpp
Normal file
29
map.hpp
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
#ifndef MAP_HPP_INCLUDED
|
||||||
|
#define MAP_HPP_INCLUDED
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <SDL/SDL.h>
|
||||||
|
|
||||||
|
#include "resource.hpp"
|
||||||
|
#include "part.hpp"
|
||||||
|
#include "global.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
class map
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
int data[HEIGHT][WIDTH];
|
||||||
|
|
||||||
|
public:
|
||||||
|
map();
|
||||||
|
|
||||||
|
void reset();
|
||||||
|
bool isCollision ( part Part, bool strict = false );
|
||||||
|
void addPart ( part Part );
|
||||||
|
void applyGravity ( int h );
|
||||||
|
int destroyLines();
|
||||||
|
bool isFull();
|
||||||
|
void draw ( SDL_Surface * screen );
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
68
menu.cpp
Normal file
68
menu.cpp
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
#include "menu.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
Menu::Menu()
|
||||||
|
{
|
||||||
|
select = 0;
|
||||||
|
|
||||||
|
# ifdef DEBUG
|
||||||
|
cout << "First item selected" << endl;
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
|
||||||
|
Menu::~Menu()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void Menu::addItem(const char* nazov, void (* action)(game*))
|
||||||
|
{
|
||||||
|
MenuItem item = MenuItem(nazov, action);
|
||||||
|
|
||||||
|
polozky.push_back(item);
|
||||||
|
|
||||||
|
# ifdef DEBUG
|
||||||
|
cout << "Item was added" << endl;
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void Menu::Execute(game* Game)
|
||||||
|
{
|
||||||
|
polozky[select].Execute(Game);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Menu::Draw(game* Game)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
for (vector<MenuItem>::iterator it = polozky.begin(); it != polozky.end(); it++)
|
||||||
|
{
|
||||||
|
it->draw(Game, 100, (i * 50 + 50), (i == select));
|
||||||
|
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Menu::Down(game* Game)
|
||||||
|
{
|
||||||
|
if (polozky.size() > (select + 1))
|
||||||
|
{
|
||||||
|
select++;
|
||||||
|
|
||||||
|
# ifdef DEBUG
|
||||||
|
cout << "Next item" << endl;
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Menu::Up(game* Game)
|
||||||
|
{
|
||||||
|
if (select > 0)
|
||||||
|
{
|
||||||
|
# ifdef DEBUG
|
||||||
|
cout << "Previous item" << endl;
|
||||||
|
# endif
|
||||||
|
|
||||||
|
select--;
|
||||||
|
}
|
||||||
|
}
|
34
menu.hpp
Normal file
34
menu.hpp
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
#ifndef MENU_HPP_INCLUDED
|
||||||
|
#define MENU_HPP_INCLUDED
|
||||||
|
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include "game.hpp"
|
||||||
|
#include "menuitem.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
|
||||||
|
class Menu
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Menu();
|
||||||
|
~Menu();
|
||||||
|
|
||||||
|
void addItem ( const char * nazov, void ( * action ) ( game * ) );
|
||||||
|
void Execute ( game * Game );
|
||||||
|
void Draw ( game * Game );
|
||||||
|
|
||||||
|
void Down ( game * Game );
|
||||||
|
void Up ( game * Game );
|
||||||
|
|
||||||
|
private:
|
||||||
|
vector <MenuItem> polozky;
|
||||||
|
int select;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
39
menuitem.cpp
Normal file
39
menuitem.cpp
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
#include "menuitem.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
MenuItem::MenuItem(const char* nazov, void (* action)(game*))
|
||||||
|
{
|
||||||
|
this->nazov = nazov;
|
||||||
|
this->action = action;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MenuItem::Execute(game* Game)
|
||||||
|
{
|
||||||
|
# ifdef DEBUG
|
||||||
|
cout << "Executing..." << endl;
|
||||||
|
# endif
|
||||||
|
|
||||||
|
action(Game);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MenuItem::draw(game* Game, int x, int y, bool active)
|
||||||
|
{
|
||||||
|
SDL_Color textColor;
|
||||||
|
|
||||||
|
if (active)
|
||||||
|
{
|
||||||
|
textColor = make_color(123, 123, 255);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
textColor = make_color(255, 255, 255);
|
||||||
|
}
|
||||||
|
|
||||||
|
message = TTF_RenderText_Solid( Game->GetfontMenu(), nazov, textColor);
|
||||||
|
|
||||||
|
apply_surface(x, y, message, Game->GetScreen());
|
||||||
|
|
||||||
|
|
||||||
|
SDL_FreeSurface(message);
|
||||||
|
}
|
||||||
|
|
34
menuitem.hpp
Normal file
34
menuitem.hpp
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
#ifndef MENUITEM_HPP_INCLUDED
|
||||||
|
#define MENUITEM_HPP_INCLUDED
|
||||||
|
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <SDL/SDL.h>
|
||||||
|
#include <SDL/SDL_ttf.h>
|
||||||
|
|
||||||
|
#include "global.hpp"
|
||||||
|
#include "game.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
|
||||||
|
class MenuItem
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
MenuItem ( const char * nazov, void ( * action ) ( game * ) );
|
||||||
|
|
||||||
|
void Execute ( game * Game );
|
||||||
|
void draw ( game * Game, int x, int y, bool active = false );
|
||||||
|
|
||||||
|
private:
|
||||||
|
void ( * action ) ( game * );
|
||||||
|
|
||||||
|
const char * nazov;
|
||||||
|
SDL_Surface * message;
|
||||||
|
|
||||||
|
SDL_Color text_color;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
127
menustate.cpp
Normal file
127
menustate.cpp
Normal file
@ -0,0 +1,127 @@
|
|||||||
|
#include "states.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
MenuState MenuState::m_MenuState;
|
||||||
|
|
||||||
|
void MenuState::Init()
|
||||||
|
{
|
||||||
|
menu = new Menu();
|
||||||
|
|
||||||
|
menu->addItem("Play", play);
|
||||||
|
menu->addItem("High Score", score);
|
||||||
|
|
||||||
|
# ifdef DEBUG
|
||||||
|
menu->addItem("Debug Info", Debug_Info);
|
||||||
|
# endif
|
||||||
|
|
||||||
|
menu->addItem("Exit", quit);
|
||||||
|
|
||||||
|
# ifdef DEBUG
|
||||||
|
std::cout << "MenuState Init Successful" << std::endl;
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void MenuState::Clean()
|
||||||
|
{
|
||||||
|
delete menu;
|
||||||
|
|
||||||
|
# ifdef DEBUG
|
||||||
|
std::cout << "MenuState Clean Successful" << std::endl;
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void MenuState::Pause()
|
||||||
|
{
|
||||||
|
# ifdef DEBUG
|
||||||
|
std::cout << "MenuState Paused" << std::endl;
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void MenuState::Resume()
|
||||||
|
{
|
||||||
|
# ifdef DEBUG
|
||||||
|
std::cout << "MenuState Resumed" << std::endl;
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void MenuState::HandleEvents(game* Game)
|
||||||
|
{
|
||||||
|
SDL_Event event;
|
||||||
|
|
||||||
|
while (SDL_PollEvent(&event))
|
||||||
|
{
|
||||||
|
switch (event.type)
|
||||||
|
{
|
||||||
|
case SDL_QUIT:
|
||||||
|
Game->Quit();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SDL_KEYDOWN:
|
||||||
|
switch (event.key.keysym.sym)
|
||||||
|
{
|
||||||
|
case SDLK_ESCAPE:
|
||||||
|
{
|
||||||
|
Game->Quit();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SDLK_DOWN:
|
||||||
|
menu->Down(Game);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SDLK_UP:
|
||||||
|
menu->Up(Game);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SDLK_SPACE:
|
||||||
|
menu->Execute(Game);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SDLK_RETURN:
|
||||||
|
menu->Execute(Game);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MenuState::Update(game* Game)
|
||||||
|
{
|
||||||
|
SDL_FillRect(Game->GetScreen(), NULL, 0x000000);
|
||||||
|
}
|
||||||
|
|
||||||
|
// We have to change the way we get the screen in this function
|
||||||
|
void MenuState::Draw(game* Game)
|
||||||
|
{
|
||||||
|
menu->Draw(Game);
|
||||||
|
|
||||||
|
SDL_Flip(Game->GetScreen());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void MenuState::play(game* Game)
|
||||||
|
{
|
||||||
|
Game->ChangeState(PlayState::Instance());
|
||||||
|
}
|
||||||
|
|
||||||
|
void MenuState::score(game* Game)
|
||||||
|
{
|
||||||
|
Game->PushState(ScoreState::Instance());
|
||||||
|
}
|
||||||
|
|
||||||
|
void MenuState::quit(game* Game)
|
||||||
|
{
|
||||||
|
Game->Quit();
|
||||||
|
}
|
||||||
|
|
||||||
|
# ifdef DEBUG
|
||||||
|
void MenuState::Debug_Info(game* Game)
|
||||||
|
{
|
||||||
|
std::cout << "\n\n=== DEBUG INFO ===\n" << std::endl;
|
||||||
|
|
||||||
|
std::cout << "Number of States: " << Game->CountStates() << std::endl;
|
||||||
|
|
||||||
|
std::cout << "\n=== Debug Info ===\n\n" << endl;
|
||||||
|
}
|
||||||
|
# endif
|
52
menustate.hpp
Normal file
52
menustate.hpp
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
#ifndef MENU_STATE_HPP_INCLUDED
|
||||||
|
#define MENU_STATE_HPP_INCLUDED
|
||||||
|
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <SDL/SDL.h>
|
||||||
|
|
||||||
|
#include "game.hpp"
|
||||||
|
#include "gamestate.hpp"
|
||||||
|
#include "menuitem.hpp"
|
||||||
|
#include "menu.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
class MenuState : public GameState
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
void Init();
|
||||||
|
void Clean();
|
||||||
|
|
||||||
|
void Pause();
|
||||||
|
void Resume();
|
||||||
|
|
||||||
|
void HandleEvents ( game * Game );
|
||||||
|
void Update ( game * Game );
|
||||||
|
void Draw ( game * Game );
|
||||||
|
|
||||||
|
// Implement Singleton Pattern
|
||||||
|
static MenuState * Instance()
|
||||||
|
{
|
||||||
|
return &m_MenuState;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void play ( game * Game );
|
||||||
|
static void score ( game * Game );
|
||||||
|
static void quit ( game * Game );
|
||||||
|
|
||||||
|
# ifdef DEBUG
|
||||||
|
static void Debug_Info ( game * Game );
|
||||||
|
# endif
|
||||||
|
|
||||||
|
protected:
|
||||||
|
MenuState() {}
|
||||||
|
|
||||||
|
private:
|
||||||
|
static MenuState m_MenuState;
|
||||||
|
|
||||||
|
Menu * menu;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
132
part.cpp
Normal file
132
part.cpp
Normal file
@ -0,0 +1,132 @@
|
|||||||
|
#include "part.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
part::part()
|
||||||
|
{
|
||||||
|
posX = WIDTH / 2 - 1;
|
||||||
|
posY = -4;
|
||||||
|
|
||||||
|
generate();
|
||||||
|
}
|
||||||
|
|
||||||
|
void part::fillData()
|
||||||
|
{
|
||||||
|
for (int i = 0; i < 4; i++)
|
||||||
|
{
|
||||||
|
for (int j = 0; j < 4; j++)
|
||||||
|
{
|
||||||
|
data[i][j] = Shapes[shapeIndex][i][j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void part::generate()
|
||||||
|
{
|
||||||
|
int g;
|
||||||
|
|
||||||
|
g = (rand() % 7) * 4;
|
||||||
|
|
||||||
|
shapeIndex = (ShapeIndexes)g;
|
||||||
|
color = g / 4;
|
||||||
|
|
||||||
|
fillData();
|
||||||
|
}
|
||||||
|
|
||||||
|
void part::move(int x, int y)
|
||||||
|
{
|
||||||
|
if (isValid(x, y))
|
||||||
|
{
|
||||||
|
posX += x;
|
||||||
|
posY += y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void part::rotate()
|
||||||
|
{
|
||||||
|
int coIndex;
|
||||||
|
|
||||||
|
coIndex = shapeIndex;
|
||||||
|
|
||||||
|
shapeIndex = ((shapeIndex + 1) % 4 == 0 ? shapeIndex - 3 : shapeIndex + 1);
|
||||||
|
|
||||||
|
fillData();
|
||||||
|
|
||||||
|
if (!isValid())
|
||||||
|
{
|
||||||
|
shapeIndex = coIndex;
|
||||||
|
|
||||||
|
fillData();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool part::isValid(int xOffset, int yOffset)
|
||||||
|
{
|
||||||
|
for (int y = 0; y < 4; y++)
|
||||||
|
{
|
||||||
|
for (int x = 0; x < 4; x++)
|
||||||
|
{
|
||||||
|
if ( (data[y][x] && (posX + x + xOffset >= WIDTH || posX + xOffset < 0)) || (data[y][x] && (posY + y + yOffset > HEIGHT)) )
|
||||||
|
{
|
||||||
|
# ifdef DEBUG
|
||||||
|
cout << "InValid" << endl;
|
||||||
|
# endif
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# ifdef DEBUG
|
||||||
|
cout << "Valid" << endl;
|
||||||
|
# endif
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void part::draw(SDL_Surface *screen)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < 4 ;i++)
|
||||||
|
{
|
||||||
|
for (int m = 0; m < 4; m++)
|
||||||
|
{
|
||||||
|
if (data[i][m])
|
||||||
|
{
|
||||||
|
drawQuad(screen, (m + posX) * SIZE, (i + posY) * SIZE, colors[color]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void part::draw ( int startX, int startY, SDL_Surface * screen )
|
||||||
|
{
|
||||||
|
for (int i = 0; i < 4 ;i++)
|
||||||
|
{
|
||||||
|
for (int m = 0; m < 4; m++)
|
||||||
|
{
|
||||||
|
if (data[i][m])
|
||||||
|
{
|
||||||
|
drawQuad(screen, (m + posX) * SIZE + startX, (i + posY) * SIZE + startY, colors[color]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int part::getPosX()
|
||||||
|
{
|
||||||
|
return posX;
|
||||||
|
}
|
||||||
|
|
||||||
|
int part::getPosY()
|
||||||
|
{
|
||||||
|
return posY;
|
||||||
|
}
|
||||||
|
|
||||||
|
int part::getElement(int x, int y)
|
||||||
|
{
|
||||||
|
return data[y][x];
|
||||||
|
}
|
||||||
|
|
||||||
|
int part::getColor()
|
||||||
|
{
|
||||||
|
return color;
|
||||||
|
}
|
45
part.hpp
Normal file
45
part.hpp
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
#ifndef PART_HPP_INCLUDED
|
||||||
|
#define PART_HPP_INCLUDED
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <SDL/SDL.h>
|
||||||
|
|
||||||
|
#include "resource.hpp"
|
||||||
|
#include "global.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
|
||||||
|
class part
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
int shapeIndex;
|
||||||
|
int posX;
|
||||||
|
int posY;
|
||||||
|
|
||||||
|
void fillData();
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
int data[4][4];
|
||||||
|
int color;
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
part();
|
||||||
|
|
||||||
|
void generate();
|
||||||
|
void move ( int x, int y );
|
||||||
|
void rotate();
|
||||||
|
bool isValid ( int xOffset = 0, int yOffset = 0 );
|
||||||
|
void draw ( SDL_Surface * screen );
|
||||||
|
void draw ( int startX, int startY, SDL_Surface * screen );
|
||||||
|
|
||||||
|
int getPosX();
|
||||||
|
int getPosY();
|
||||||
|
int getElement ( int x, int y );
|
||||||
|
int getColor();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
110
pausestate.cpp
Normal file
110
pausestate.cpp
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
#include "states.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
PauseState PauseState::m_PauseState;
|
||||||
|
|
||||||
|
void PauseState::Init()
|
||||||
|
{
|
||||||
|
menu = new Menu();
|
||||||
|
|
||||||
|
menu->addItem("Resume", resume);
|
||||||
|
menu->addItem("To menu", go_to_menu);
|
||||||
|
menu->addItem("Exit", quit);
|
||||||
|
|
||||||
|
# ifdef DEBUG
|
||||||
|
std::cout << "PauseState Init Successful" << std::endl;
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void PauseState::Clean()
|
||||||
|
{
|
||||||
|
delete menu;
|
||||||
|
|
||||||
|
# ifdef DEBUG
|
||||||
|
std::cout << "PauseState Clean Successful" << std::endl;
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void PauseState::Pause()
|
||||||
|
{
|
||||||
|
# ifdef DEBUG
|
||||||
|
std::cout << "PauseState Paused" << std::endl;
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void PauseState::Resume()
|
||||||
|
{
|
||||||
|
# ifdef DEBUG
|
||||||
|
std::cout << "PauseState Resumed" << std::endl;
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void PauseState::HandleEvents(game* Game)
|
||||||
|
{
|
||||||
|
SDL_Event event;
|
||||||
|
|
||||||
|
while (SDL_PollEvent(&event))
|
||||||
|
{
|
||||||
|
switch (event.type)
|
||||||
|
{
|
||||||
|
case SDL_QUIT:
|
||||||
|
Game->Quit();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SDL_KEYDOWN:
|
||||||
|
switch (event.key.keysym.sym)
|
||||||
|
{
|
||||||
|
case SDLK_ESCAPE:
|
||||||
|
Game->PopState();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SDLK_DOWN:
|
||||||
|
menu->Down(Game);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SDLK_UP:
|
||||||
|
menu->Up(Game);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SDLK_SPACE:
|
||||||
|
menu->Execute(Game);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SDLK_RETURN:
|
||||||
|
menu->Execute(Game);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void PauseState::Update(game* Game)
|
||||||
|
{
|
||||||
|
SDL_FillRect(Game->GetScreen(), NULL, 0x000000);
|
||||||
|
}
|
||||||
|
|
||||||
|
// We have to change the way we get the screen in this function
|
||||||
|
void PauseState::Draw(game* Game)
|
||||||
|
{
|
||||||
|
menu->Draw(Game);
|
||||||
|
|
||||||
|
SDL_Flip(Game->GetScreen());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void PauseState::resume(game* Game)
|
||||||
|
{
|
||||||
|
Game->PopState();
|
||||||
|
}
|
||||||
|
|
||||||
|
void PauseState::go_to_menu(game* Game)
|
||||||
|
{
|
||||||
|
Game->DelStateF();
|
||||||
|
Game->ChangeState(MenuState::Instance());
|
||||||
|
}
|
||||||
|
|
||||||
|
void PauseState::quit(game* Game)
|
||||||
|
{
|
||||||
|
Game->Quit();
|
||||||
|
}
|
48
pausestate.hpp
Normal file
48
pausestate.hpp
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
#ifndef PAUSE_STATE_HPP_INCLUDED
|
||||||
|
#define PAUSE_STATE_HPP_INCLUDED
|
||||||
|
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <SDL/SDL.h>
|
||||||
|
|
||||||
|
#include "game.hpp"
|
||||||
|
#include "gamestate.hpp"
|
||||||
|
#include "menuitem.hpp"
|
||||||
|
#include "menu.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
class PauseState : public GameState
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
void Init();
|
||||||
|
void Clean();
|
||||||
|
|
||||||
|
void Pause();
|
||||||
|
void Resume();
|
||||||
|
|
||||||
|
void HandleEvents ( game * Game );
|
||||||
|
void Update ( game * Game );
|
||||||
|
void Draw ( game * Game );
|
||||||
|
|
||||||
|
// Implement Singleton Pattern
|
||||||
|
static PauseState * Instance()
|
||||||
|
{
|
||||||
|
return &m_PauseState;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void resume ( game * Game );
|
||||||
|
static void go_to_menu ( game * Game );
|
||||||
|
static void quit ( game * Game );
|
||||||
|
|
||||||
|
protected:
|
||||||
|
PauseState() {}
|
||||||
|
|
||||||
|
private:
|
||||||
|
static PauseState m_PauseState;
|
||||||
|
|
||||||
|
Menu * menu;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
359
playstate.cpp
Normal file
359
playstate.cpp
Normal file
@ -0,0 +1,359 @@
|
|||||||
|
# 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();
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
switch ( event.type )
|
||||||
|
{
|
||||||
|
case SDL_KEYDOWN:
|
||||||
|
switch ( event.key.keysym.sym )
|
||||||
|
{
|
||||||
|
case SDLK_ESCAPE:
|
||||||
|
{
|
||||||
|
//Game->SetRunning(false);
|
||||||
|
Game->PushState ( PauseState::Instance() );
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
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 - 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SDLK_RETURN:
|
||||||
|
{
|
||||||
|
# ifdef DEBUG
|
||||||
|
std::cout << "continue" << std::endl;
|
||||||
|
# endif
|
||||||
|
|
||||||
|
//Game->m_bGameOver = false;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void PlayState::Update ( game* Game )
|
||||||
|
{
|
||||||
|
if ( Map.isFull() )
|
||||||
|
{
|
||||||
|
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 ( Map.isCollision ( Part ) && tick + 1 == ( FPS / ( ( level > 30 ) ? 30 : level ) ) )
|
||||||
|
{
|
||||||
|
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);
|
||||||
|
}
|
68
playstate.hpp
Normal file
68
playstate.hpp
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
# ifndef PLAY_STATE_HPP_INCLUDED
|
||||||
|
# define PLAY_STATE_HPP_INCLUDED
|
||||||
|
|
||||||
|
# include <SDL/SDL.h>
|
||||||
|
# include <iostream>
|
||||||
|
# include <string>
|
||||||
|
# include <fstream>
|
||||||
|
|
||||||
|
# include "game.hpp"
|
||||||
|
# include "gamestate.hpp"
|
||||||
|
# include "resource.hpp"
|
||||||
|
# include "part.hpp"
|
||||||
|
# include "map.hpp"
|
||||||
|
# include "stringinput.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
class PlayState : public GameState
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
void Init();
|
||||||
|
void Clean();
|
||||||
|
|
||||||
|
void Pause();
|
||||||
|
void Resume();
|
||||||
|
|
||||||
|
void HandleEvents ( game * Game );
|
||||||
|
void Update ( game * Game );
|
||||||
|
void Draw ( game * Game );
|
||||||
|
|
||||||
|
// Implement Singleton Pattern
|
||||||
|
static PlayState * Instance()
|
||||||
|
{
|
||||||
|
return &m_PlayState;
|
||||||
|
}
|
||||||
|
|
||||||
|
friend void PlayInfo ( PlayState * Info, game * Game );
|
||||||
|
|
||||||
|
protected:
|
||||||
|
PlayState() {}
|
||||||
|
|
||||||
|
private:
|
||||||
|
void Save(string Name, int Lines);
|
||||||
|
|
||||||
|
static PlayState m_PlayState;
|
||||||
|
|
||||||
|
map Map;
|
||||||
|
part Part;
|
||||||
|
part Next;
|
||||||
|
|
||||||
|
int score;
|
||||||
|
int level;
|
||||||
|
int lines;
|
||||||
|
|
||||||
|
int tick;
|
||||||
|
|
||||||
|
bool nameEntered;
|
||||||
|
bool nameEntering;
|
||||||
|
|
||||||
|
SDL_Surface * message;
|
||||||
|
SDL_Color textColor;
|
||||||
|
|
||||||
|
StringInput name;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
void PlayInfo ( PlayState * Info, game * Game );
|
||||||
|
|
||||||
|
# endif
|
21
resource.cpp
Normal file
21
resource.cpp
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
#include "resource.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
int colors[7] =
|
||||||
|
{
|
||||||
|
0xFF0000,
|
||||||
|
0x00FF00,
|
||||||
|
0x0000FF,
|
||||||
|
0xFF00FF,
|
||||||
|
0x00FFFF,
|
||||||
|
0xFFFF00,
|
||||||
|
0xFF8000
|
||||||
|
};
|
||||||
|
|
||||||
|
int points[4] =
|
||||||
|
{
|
||||||
|
40,
|
||||||
|
100,
|
||||||
|
300,
|
||||||
|
1200
|
||||||
|
};
|
203
resource.hpp
Normal file
203
resource.hpp
Normal file
@ -0,0 +1,203 @@
|
|||||||
|
# ifndef RESOURCE_HPP_INCLUDED
|
||||||
|
# define RESOURCE_HPP_INCLUDED
|
||||||
|
|
||||||
|
|
||||||
|
# define WIDTH 10
|
||||||
|
# define HEIGHT 20
|
||||||
|
# define SIZE 20
|
||||||
|
# define FPS 60
|
||||||
|
|
||||||
|
# define REPAET_DELAY 170
|
||||||
|
|
||||||
|
extern int colors[7];
|
||||||
|
extern int points[4];
|
||||||
|
|
||||||
|
enum ShapeIndexes { I = 0, O = 4, S = 8, Z = 12, T = 16, L = 20, J = 24 };
|
||||||
|
|
||||||
|
/* Šablóny hracích "kociak" */
|
||||||
|
const bool Shapes[][4][4] =
|
||||||
|
{
|
||||||
|
/* I */
|
||||||
|
{
|
||||||
|
{1, 0, 0, 0},
|
||||||
|
{1, 0, 0, 0},
|
||||||
|
{1, 0, 0, 0},
|
||||||
|
{1, 0, 0, 0}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{1, 1, 1, 1}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{1, 0, 0, 0},
|
||||||
|
{1, 0, 0, 0},
|
||||||
|
{1, 0, 0, 0},
|
||||||
|
{1, 0, 0, 0}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{1, 1, 1, 1}
|
||||||
|
},
|
||||||
|
|
||||||
|
/* O - kocka */
|
||||||
|
{
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{1, 1, 0, 0},
|
||||||
|
{1, 1, 0, 0}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{1, 1, 0, 0},
|
||||||
|
{1, 1, 0, 0}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{1, 1, 0, 0},
|
||||||
|
{1, 1, 0, 0}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{1, 1, 0, 0},
|
||||||
|
{1, 1, 0, 0}
|
||||||
|
},
|
||||||
|
|
||||||
|
/* S */
|
||||||
|
{
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{0, 1, 1, 0},
|
||||||
|
{1, 1, 0, 0}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{1, 0, 0, 0},
|
||||||
|
{1, 1, 0, 0},
|
||||||
|
{0, 1, 0, 0}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{0, 1, 1, 0},
|
||||||
|
{1, 1, 0, 0}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{1, 0, 0, 0},
|
||||||
|
{1, 1, 0, 0},
|
||||||
|
{0, 1, 0, 0}
|
||||||
|
},
|
||||||
|
|
||||||
|
/* Z */
|
||||||
|
{
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{1, 1, 0, 0},
|
||||||
|
{0, 1, 1, 0}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{0, 1, 0, 0},
|
||||||
|
{1, 1, 0, 0},
|
||||||
|
{1, 0, 0, 0}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{1, 1, 0, 0},
|
||||||
|
{0, 1, 1, 0}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{0, 1, 0, 0},
|
||||||
|
{1, 1, 0, 0},
|
||||||
|
{1, 0, 0, 0}
|
||||||
|
},
|
||||||
|
|
||||||
|
/* T */
|
||||||
|
{
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{0, 1, 0, 0},
|
||||||
|
{1, 1, 1, 0}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{1, 0, 0, 0},
|
||||||
|
{1, 1, 0, 0},
|
||||||
|
{1, 0, 0, 0}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{1, 1, 1, 0},
|
||||||
|
{0, 1, 0, 0}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{0, 1, 0, 0},
|
||||||
|
{1, 1, 0, 0},
|
||||||
|
{0, 1, 0, 0}
|
||||||
|
},
|
||||||
|
|
||||||
|
/* L */
|
||||||
|
{
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{1, 0, 0, 0},
|
||||||
|
{1, 0, 0, 0},
|
||||||
|
{1, 1, 0, 0}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{1, 1, 1, 0},
|
||||||
|
{1, 0, 0, 0}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{1, 1, 0, 0},
|
||||||
|
{0, 1, 0, 0},
|
||||||
|
{0, 1, 0, 0}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{0, 0, 1, 0},
|
||||||
|
{1, 1, 1, 0}
|
||||||
|
},
|
||||||
|
|
||||||
|
/* J */
|
||||||
|
{
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{0, 1, 0, 0},
|
||||||
|
{0, 1, 0, 0},
|
||||||
|
{1, 1, 0, 0}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{1, 0, 0, 0},
|
||||||
|
{1, 1, 1, 0}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{1, 1, 0, 0},
|
||||||
|
{1, 0, 0, 0},
|
||||||
|
{1, 0, 0, 0}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{1, 1, 1, 0},
|
||||||
|
{0, 0, 1, 0}
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
35
scoreitem.cpp
Normal file
35
scoreitem.cpp
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
#include "scoreitem.hpp"
|
||||||
|
|
||||||
|
ScoreItem::ScoreItem ( string Name, int Lines )
|
||||||
|
{
|
||||||
|
this->Name = Name;
|
||||||
|
this->Lines = Lines;
|
||||||
|
|
||||||
|
message = NULL;
|
||||||
|
|
||||||
|
textColor = make_color(255, 255, 255);
|
||||||
|
}
|
||||||
|
|
||||||
|
ScoreItem::~ScoreItem()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScoreItem::Draw ( game * Game, int y )
|
||||||
|
{
|
||||||
|
char temp[10];
|
||||||
|
|
||||||
|
message = TTF_RenderText_Solid( Game->GetfontMenu(), Name.c_str(), textColor);
|
||||||
|
apply_surface(105, y, message, Game->GetScreen());
|
||||||
|
|
||||||
|
std::sprintf ( temp, "%d", Lines);
|
||||||
|
message = TTF_RenderText_Solid( Game->GetfontMenu(), temp, textColor);
|
||||||
|
apply_surface(15, y, message, Game->GetScreen());
|
||||||
|
|
||||||
|
SDL_FreeSurface(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
int ScoreItem::GetLines()
|
||||||
|
{
|
||||||
|
return Lines;
|
||||||
|
}
|
32
scoreitem.hpp
Normal file
32
scoreitem.hpp
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
#ifndef SCOREITEM_H
|
||||||
|
#define SCOREITEM_H
|
||||||
|
|
||||||
|
# include <iostream>
|
||||||
|
# include <SDL/SDL.h>
|
||||||
|
# include <SDL/SDL_ttf.h>
|
||||||
|
|
||||||
|
# include "game.hpp"
|
||||||
|
# include "global.hpp"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
|
||||||
|
class ScoreItem
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ScoreItem ( string Name, int Lines );
|
||||||
|
~ScoreItem();
|
||||||
|
|
||||||
|
int GetLines();
|
||||||
|
|
||||||
|
void Draw( game * Game, int y );
|
||||||
|
|
||||||
|
private:
|
||||||
|
string Name;
|
||||||
|
int Lines;
|
||||||
|
|
||||||
|
SDL_Surface * message;
|
||||||
|
SDL_Color textColor;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // SCOREITEM_H
|
108
scorestate.cpp
Normal file
108
scorestate.cpp
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
#include "scorestate.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
bool operator< (ScoreItem First, ScoreItem Second )
|
||||||
|
{
|
||||||
|
return (First.GetLines() > Second.GetLines());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ScoreState ScoreState::m_ScoreState;
|
||||||
|
|
||||||
|
void ScoreState::Draw ( game * Game )
|
||||||
|
{
|
||||||
|
for (int i = 0; i < (Items.size() > 10 ? 10 : (int) Items.size()); i++)
|
||||||
|
{
|
||||||
|
Items[i].Draw(Game, i * 35);
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_Flip(Game->GetScreen());
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScoreState::Update ( game * Game )
|
||||||
|
{
|
||||||
|
SDL_FillRect(Game->GetScreen(), NULL, 0x000000);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScoreState::HandleEvents ( game * Game )
|
||||||
|
{
|
||||||
|
SDL_Event event;
|
||||||
|
|
||||||
|
while (SDL_PollEvent(&event))
|
||||||
|
{
|
||||||
|
switch (event.type)
|
||||||
|
{
|
||||||
|
case SDL_QUIT:
|
||||||
|
Game->Quit();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SDL_KEYDOWN:
|
||||||
|
switch (event.key.keysym.sym)
|
||||||
|
{
|
||||||
|
case SDLK_ESCAPE:
|
||||||
|
Game->PopState();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScoreState::Resume()
|
||||||
|
{
|
||||||
|
# ifdef DEBUG
|
||||||
|
std::cout << "ScoreState Resumed" << std::endl;
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScoreState::Pause()
|
||||||
|
{
|
||||||
|
# ifdef DEBUG
|
||||||
|
std::cout << "ScoreState Paused" << std::endl;
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScoreState::Clean()
|
||||||
|
{
|
||||||
|
Items.clear();
|
||||||
|
|
||||||
|
# ifdef DEBUG
|
||||||
|
std::cout << "ScoreState Clean Successful" << std::endl;
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScoreState::Init()
|
||||||
|
{
|
||||||
|
Load();
|
||||||
|
|
||||||
|
sort(Items.begin(), Items.end());
|
||||||
|
|
||||||
|
# ifdef DEBUG
|
||||||
|
std::cout << "ScoreState Init Successful" << std::endl;
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScoreState::Load()
|
||||||
|
{
|
||||||
|
ifstream file;
|
||||||
|
string Name;
|
||||||
|
int Lines;
|
||||||
|
|
||||||
|
file.open(".score");
|
||||||
|
|
||||||
|
if (file.is_open())
|
||||||
|
{
|
||||||
|
while (!file.eof())
|
||||||
|
{
|
||||||
|
file >> Name;
|
||||||
|
file >> Lines;
|
||||||
|
|
||||||
|
if (!file.eof())
|
||||||
|
Items.push_back(ScoreItem(Name, Lines));
|
||||||
|
}
|
||||||
|
|
||||||
|
file.close();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
cerr << "Cannot open file '.score'" << endl;
|
||||||
|
}
|
46
scorestate.hpp
Normal file
46
scorestate.hpp
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
#ifndef SCORESTATE_H
|
||||||
|
#define SCORESTATE_H
|
||||||
|
|
||||||
|
# include <iostream>
|
||||||
|
# include <vector>
|
||||||
|
# include <algorithm>
|
||||||
|
# include <fstream>
|
||||||
|
|
||||||
|
# include "gamestate.hpp"
|
||||||
|
# include "scoreitem.hpp"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
|
||||||
|
class ScoreState : public GameState
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
void Init();
|
||||||
|
void Clean();
|
||||||
|
|
||||||
|
void Pause();
|
||||||
|
void Resume();
|
||||||
|
|
||||||
|
void HandleEvents ( game * Game );
|
||||||
|
void Update ( game * Game );
|
||||||
|
void Draw ( game * Game );
|
||||||
|
|
||||||
|
// Implement Singleton Pattern
|
||||||
|
static ScoreState * Instance()
|
||||||
|
{
|
||||||
|
return &m_ScoreState;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
ScoreState() {}
|
||||||
|
|
||||||
|
private:
|
||||||
|
void Load();
|
||||||
|
|
||||||
|
static ScoreState m_ScoreState;
|
||||||
|
|
||||||
|
vector<ScoreItem> Items;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // SCORESTATE_H
|
4
states.hpp
Normal file
4
states.hpp
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
# include "playstate.hpp"
|
||||||
|
# include "menustate.hpp"
|
||||||
|
# include "pausestate.hpp"
|
||||||
|
# include "scorestate.hpp"
|
99
stringinput.cpp
Normal file
99
stringinput.cpp
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
#include "stringinput.hpp"
|
||||||
|
|
||||||
|
StringInput::StringInput()
|
||||||
|
{
|
||||||
|
str = "";
|
||||||
|
text = NULL;
|
||||||
|
textColor = make_color ( 255, 255, 255 );
|
||||||
|
}
|
||||||
|
|
||||||
|
StringInput::~StringInput()
|
||||||
|
{
|
||||||
|
SDL_FreeSurface ( text );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void StringInput::handle_input ( game * Game, SDL_Event *event)
|
||||||
|
{
|
||||||
|
//If a key was pressed
|
||||||
|
if ( event->type == SDL_KEYDOWN )
|
||||||
|
{
|
||||||
|
//Keep a copy of the current version of the string
|
||||||
|
string temp = str;
|
||||||
|
|
||||||
|
//If the string less than maximum size
|
||||||
|
if ( str.length() <= 11 )
|
||||||
|
{
|
||||||
|
//If the key is a number
|
||||||
|
if ( ( event->key.keysym.unicode >= ( Uint16 ) '0' ) && ( event->key.keysym.unicode <= ( Uint16 ) '9' ) )
|
||||||
|
{
|
||||||
|
//Append the character
|
||||||
|
str += ( char ) event->key.keysym.unicode;
|
||||||
|
}
|
||||||
|
else if ( ( event->key.keysym.unicode == ( Uint16 ) '-' ) )
|
||||||
|
{
|
||||||
|
//Append the character
|
||||||
|
str += ( char ) event->key.keysym.unicode;
|
||||||
|
}
|
||||||
|
//If the key is a uppercase letter
|
||||||
|
else if ( ( event->key.keysym.unicode >= ( Uint16 ) 'A' ) && ( event->key.keysym.unicode <= ( Uint16 ) 'Z' ) )
|
||||||
|
{
|
||||||
|
//Append the character
|
||||||
|
str += ( char ) event->key.keysym.unicode;
|
||||||
|
}
|
||||||
|
//If the key is a lowercase letter
|
||||||
|
else if ( ( event->key.keysym.unicode >= ( Uint16 ) 'a' ) && ( event->key.keysym.unicode <= ( Uint16 ) 'z' ) )
|
||||||
|
{
|
||||||
|
//Append the character
|
||||||
|
str += ( char ) event->key.keysym.unicode;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
cout << str << endl;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//If backspace was pressed and the string isn't blank
|
||||||
|
if ( ( event->key.keysym.sym == SDLK_BACKSPACE ) && ( str.length() != 0 ) )
|
||||||
|
{
|
||||||
|
//Remove a character from the end
|
||||||
|
str.erase ( str.length() - 1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
//If the string was changed
|
||||||
|
if ( str != temp )
|
||||||
|
{
|
||||||
|
//Free the old surface
|
||||||
|
SDL_FreeSurface ( text );
|
||||||
|
|
||||||
|
//Render a new text surface
|
||||||
|
text = TTF_RenderText_Solid ( Game->GetfontGame(), str.c_str(), textColor );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void StringInput::show_centered ( game * Game )
|
||||||
|
{
|
||||||
|
//If the surface isn't blank
|
||||||
|
if ( text != NULL )
|
||||||
|
{
|
||||||
|
//Show the name
|
||||||
|
apply_surface ( 50, 85, text, Game->GetScreen() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
string StringInput::GetStr()
|
||||||
|
{
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void StringInput::Clear()
|
||||||
|
{
|
||||||
|
str = "";
|
||||||
|
|
||||||
|
SDL_FreeSurface ( text );
|
||||||
|
text = NULL;
|
||||||
|
}
|
35
stringinput.hpp
Normal file
35
stringinput.hpp
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
#ifndef STRINGINPUT_H
|
||||||
|
#define STRINGINPUT_H
|
||||||
|
|
||||||
|
# include <iostream>
|
||||||
|
# include <string>
|
||||||
|
# include <SDL/SDL.h>
|
||||||
|
# include <SDL/SDL_ttf.h>
|
||||||
|
|
||||||
|
# include "game.hpp"
|
||||||
|
# include "global.hpp"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
|
||||||
|
class StringInput
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
StringInput();
|
||||||
|
~StringInput();
|
||||||
|
|
||||||
|
string GetStr();
|
||||||
|
|
||||||
|
void handle_input( game * Game, SDL_Event * event );
|
||||||
|
void show_centered( game * Game );
|
||||||
|
|
||||||
|
void Clear();
|
||||||
|
|
||||||
|
private:
|
||||||
|
string str;
|
||||||
|
|
||||||
|
SDL_Surface *text;
|
||||||
|
SDL_Color textColor;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // STRINGINPUT_H
|
Loading…
Reference in New Issue
Block a user