Initial commit
This commit is contained in:
25
CMakeLists.txt
Normal file
25
CMakeLists.txt
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.16)
|
||||||
|
project(CelebratingTetris LANGUAGES CXX)
|
||||||
|
|
||||||
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
|
||||||
|
option(BUILD_SHARED_LIBS "Build shared libraries" OFF)
|
||||||
|
|
||||||
|
include(FetchContent)
|
||||||
|
FetchContent_Declare(SFML
|
||||||
|
GIT_REPOSITORY https://github.com/SFML/SFML.git
|
||||||
|
GIT_TAG 2.6.x)
|
||||||
|
FetchContent_MakeAvailable(SFML)
|
||||||
|
|
||||||
|
add_executable(CelebratingTetris src/main.cpp src/Board.cpp src/Game.cpp)
|
||||||
|
target_link_libraries(CelebratingTetris PRIVATE sfml-graphics)
|
||||||
|
target_compile_features(CelebratingTetris PRIVATE cxx_std_17)
|
||||||
|
|
||||||
|
if(WIN32)
|
||||||
|
add_custom_command(
|
||||||
|
TARGET CelebratingTetris
|
||||||
|
COMMENT "Copy OpenAL DLL"
|
||||||
|
PRE_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${SFML_SOURCE_DIR}/extlibs/bin/$<IF:$<EQUAL:${CMAKE_SIZEOF_VOID_P},8>,x64,x86>/openal32.dll $<TARGET_FILE_DIR:CelebratingTetris>
|
||||||
|
VERBATIM)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
install(TARGETS CelebratingTetris)
|
||||||
27
Makefile
Normal file
27
Makefile
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
|
||||||
|
|
||||||
|
SRCS = ./src/main.cpp \
|
||||||
|
./src/Board.cpp \
|
||||||
|
./src/Game.cpp
|
||||||
|
|
||||||
|
NAME = CelebratingTetris
|
||||||
|
|
||||||
|
FLAGS = -lsfml-graphics -lsfml-window -lsfml-system
|
||||||
|
|
||||||
|
OBJS = $(SRCS:.cpp=.o)
|
||||||
|
|
||||||
|
COMPILER = clang++
|
||||||
|
|
||||||
|
all: $(NAME)
|
||||||
|
|
||||||
|
$(NAME): $(OBJS)
|
||||||
|
$(COMPILER) -o $(NAME) $(FLAGS) $(OBJS)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -fr $(OBJS)
|
||||||
|
|
||||||
|
fclean: clean
|
||||||
|
rm -fr $(NAME)
|
||||||
|
|
||||||
|
re: fclean all
|
||||||
|
|
||||||
24
README.md
Normal file
24
README.md
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
# Celebrating Tetris
|
||||||
|
|
||||||
|
This is a little trial to see if I could make a tetris game within 24 hours.
|
||||||
|
|
||||||
|
Linux dependencies :
|
||||||
|
* libxrandr-dev
|
||||||
|
* libxcursor-dev
|
||||||
|
* libudev-dev
|
||||||
|
* libfreetype-dev
|
||||||
|
* libopenal-dev
|
||||||
|
* libflac-dev
|
||||||
|
* libvorbis-dev
|
||||||
|
* libgl1-mesa-dev
|
||||||
|
* libegl1-mesa-dev
|
||||||
|
|
||||||
|
## Building
|
||||||
|
|
||||||
|
```bash
|
||||||
|
mkdir build
|
||||||
|
cd build
|
||||||
|
cmake ..
|
||||||
|
make
|
||||||
|
./build/CelebratingTetris
|
||||||
|
```
|
||||||
22
includes/Board.hpp
Normal file
22
includes/Board.hpp
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
// Celebrating tetris by Ley 2024
|
||||||
|
|
||||||
|
#include "./Game.hpp"
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
class Board {
|
||||||
|
public:
|
||||||
|
Board();
|
||||||
|
~Board();
|
||||||
|
void Draw(sf::RenderWindow &win);
|
||||||
|
void Clear();
|
||||||
|
int DoesFit(const Tetrominos::Names name, const int rot,
|
||||||
|
const sf::Vector2<int> pos);
|
||||||
|
void PlaceTetromino(const Tetrominos::Names name, const int rot,
|
||||||
|
const sf::Vector2<int> pos);
|
||||||
|
void CheckLines();
|
||||||
|
protected:
|
||||||
|
int isInBoard(const sf::Vector2<int> pos);
|
||||||
|
private:
|
||||||
|
int buffer_[10][20];
|
||||||
|
};
|
||||||
14
includes/Game.hpp
Normal file
14
includes/Game.hpp
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
// Celebrating tetris by Ley 2024
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
// SMFL headers
|
||||||
|
#include <SFML/Graphics.hpp>
|
||||||
|
#include <SFML/System.hpp>
|
||||||
|
|
||||||
|
// Cxx headers
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
#include "./Tetrominos.hpp"
|
||||||
|
|
||||||
|
sf::Color getTetrominoColor(const Tetrominos::Names &name);
|
||||||
212
includes/Tetrominos.hpp
Normal file
212
includes/Tetrominos.hpp
Normal file
@@ -0,0 +1,212 @@
|
|||||||
|
// Celebrating tetris by Ley 2024
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <SFML/Graphics/Color.hpp>
|
||||||
|
|
||||||
|
struct Tetrominos {
|
||||||
|
enum Names {
|
||||||
|
I,
|
||||||
|
J,
|
||||||
|
L,
|
||||||
|
O,
|
||||||
|
S,
|
||||||
|
T,
|
||||||
|
Z,
|
||||||
|
None
|
||||||
|
};
|
||||||
|
|
||||||
|
// [shape name][rot pos][y][z]
|
||||||
|
constexpr static int shapes[8][4][4][4] = {
|
||||||
|
{ // I
|
||||||
|
{
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{1, 1, 1, 1},
|
||||||
|
{0, 0, 0, 0}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{0, 0, 1, 0},
|
||||||
|
{0, 0, 1, 0},
|
||||||
|
{0, 0, 1, 0},
|
||||||
|
{0, 0, 1, 0}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{1, 1, 1, 1},
|
||||||
|
{0, 0, 0, 0}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{0, 0, 1, 0},
|
||||||
|
{0, 0, 1, 0},
|
||||||
|
{0, 0, 1, 0},
|
||||||
|
{0, 0, 1, 0}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ // J
|
||||||
|
{
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{0, 1, 1, 1},
|
||||||
|
{0, 0, 0, 1}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{0, 0, 1, 0},
|
||||||
|
{0, 0, 1, 0},
|
||||||
|
{0, 1, 1, 0}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{0, 1, 0, 0},
|
||||||
|
{0, 1, 1, 1},
|
||||||
|
{0, 0, 0, 0}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{0, 0, 1, 1},
|
||||||
|
{0, 0, 1, 0},
|
||||||
|
{0, 0, 1, 0}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ // L
|
||||||
|
{
|
||||||
|
{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, 1},
|
||||||
|
{0, 1, 1, 1},
|
||||||
|
{0, 0, 0, 0}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{0, 0, 1, 0},
|
||||||
|
{0, 0, 1, 0},
|
||||||
|
{0, 0, 1, 1}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ // 0
|
||||||
|
{
|
||||||
|
{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, 0, 0},
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{0, 0, 1, 1},
|
||||||
|
{0, 0, 1, 1}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ // S
|
||||||
|
{
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{0, 0, 1, 1},
|
||||||
|
{0, 1, 1, 0}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{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, 1, 1},
|
||||||
|
{0, 1, 1, 0}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{0, 0, 1, 0},
|
||||||
|
{0, 0, 1, 1},
|
||||||
|
{0, 0, 0, 1}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ // T
|
||||||
|
{
|
||||||
|
{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, 0, 0, 0},
|
||||||
|
{0, 0, 1, 0},
|
||||||
|
{0, 1, 1, 1},
|
||||||
|
{0, 0, 0, 0}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{0, 0, 1, 0},
|
||||||
|
{0, 0, 1, 1},
|
||||||
|
{0, 0, 1, 0}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ // Z
|
||||||
|
{
|
||||||
|
{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, 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}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ // None
|
||||||
|
{
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
{0, 0, 0, 0}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
103
src/Board.cpp
Normal file
103
src/Board.cpp
Normal file
@@ -0,0 +1,103 @@
|
|||||||
|
// Celebrating tetris by Ley 2024
|
||||||
|
|
||||||
|
#include "../includes/Board.hpp"
|
||||||
|
|
||||||
|
Board::Board() {
|
||||||
|
Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
Board::~Board() {
|
||||||
|
}
|
||||||
|
|
||||||
|
void Board::Draw(sf::RenderWindow &win) {
|
||||||
|
sf::RectangleShape board({320.f, 640.f});
|
||||||
|
board.setOutlineThickness(4.f);
|
||||||
|
board.setOutlineColor({});
|
||||||
|
sf::RectangleShape cell({28.f, 28.f});
|
||||||
|
cell.setOutlineThickness(4.f);
|
||||||
|
cell.setOutlineColor({});
|
||||||
|
|
||||||
|
// Draw board
|
||||||
|
board.setFillColor(sf::Color());
|
||||||
|
board.setPosition(16.f, 16.f);
|
||||||
|
win.draw(board);
|
||||||
|
|
||||||
|
// Draw cells
|
||||||
|
for (int y = 0; y < 20; y++) {
|
||||||
|
for (int x = 0; x < 10; x++) {
|
||||||
|
cell.setFillColor(getTetrominoColor(static_cast<Tetrominos::Names>(buffer_[x][y])));
|
||||||
|
cell.setPosition(x * 34.f + 16.f, y * 34.f + 16.f);
|
||||||
|
win.draw(cell);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Board::Clear() {
|
||||||
|
for (int i = 0; i < 10; i++) {
|
||||||
|
for (int j = 0; j < 20; j++) {
|
||||||
|
buffer_[i][j] = Tetrominos::Names::None;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int Board::isInBoard(const sf::Vector2<int> pos) {
|
||||||
|
if (pos.y >= 20) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (pos.x < 0 || pos.x >= 10) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Board::DoesFit(const Tetrominos::Names name, const int rot,
|
||||||
|
const sf::Vector2<int> pos) {
|
||||||
|
for (int y = 0; y < 4; y++) {
|
||||||
|
for (int x = 0; x < 4; x++) {
|
||||||
|
if (Tetrominos::shapes[name][rot][y][x] == 1) {
|
||||||
|
if (y + pos.y >= 0) {
|
||||||
|
if (isInBoard({x + pos.x, y + pos.y})) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (buffer_[x + pos.x][y + pos.y] != Tetrominos::Names::None){
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Board::PlaceTetromino(const Tetrominos::Names name, const int rot,
|
||||||
|
const sf::Vector2<int> pos) {
|
||||||
|
for (int y = 0; y < 4; y++) {
|
||||||
|
for (int x = 0; x < 4; x++) {
|
||||||
|
if (Tetrominos::shapes[name][rot][y][x] == 1) {
|
||||||
|
buffer_[x + pos.x][y + pos.y] = name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Board::CheckLines() {
|
||||||
|
bool is_line;
|
||||||
|
for (int j = 0; j < 20; j++) {
|
||||||
|
is_line = true;
|
||||||
|
for (int i = 0; i < 10; i++) {
|
||||||
|
if (buffer_[i][j] == Tetrominos::Names::None) {
|
||||||
|
is_line = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (is_line) {
|
||||||
|
for (int y = j; y > 0; y--) {
|
||||||
|
for (int x = 0; x < 10; x++) {
|
||||||
|
buffer_[x][y] = buffer_[x][y - 1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
CheckLines();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
35
src/Game.cpp
Normal file
35
src/Game.cpp
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
// Celebrating tetris by Ley 2024
|
||||||
|
|
||||||
|
#include "../includes/Game.hpp"
|
||||||
|
|
||||||
|
sf::Color getTetrominoColor(const Tetrominos::Names &name) {
|
||||||
|
switch (name) {
|
||||||
|
case Tetrominos::Names::I:
|
||||||
|
return(sf::Color::Cyan);
|
||||||
|
break;
|
||||||
|
case Tetrominos::Names::J:
|
||||||
|
return(sf::Color::Blue);
|
||||||
|
break;
|
||||||
|
case Tetrominos::Names::L:
|
||||||
|
return(sf::Color(255, 127, 0, 255));
|
||||||
|
break;
|
||||||
|
case Tetrominos::Names::O:
|
||||||
|
return(sf::Color::Yellow);
|
||||||
|
break;
|
||||||
|
case Tetrominos::Names::S:
|
||||||
|
return(sf::Color::Green);
|
||||||
|
break;
|
||||||
|
case Tetrominos::Names::T:
|
||||||
|
return(sf::Color::Magenta);
|
||||||
|
break;
|
||||||
|
case Tetrominos::Names::Z:
|
||||||
|
return(sf::Color::Red);
|
||||||
|
break;
|
||||||
|
case Tetrominos::Names::None:
|
||||||
|
return(sf::Color::Black);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
};
|
||||||
|
return sf::Color::Black;
|
||||||
|
}
|
||||||
206
src/main.cpp
Normal file
206
src/main.cpp
Normal file
@@ -0,0 +1,206 @@
|
|||||||
|
// Celebrating tetris by Ley 2024
|
||||||
|
|
||||||
|
#include "../includes/Game.hpp"
|
||||||
|
#include "../includes/Board.hpp"
|
||||||
|
|
||||||
|
#include <ctime>
|
||||||
|
#include <cstdlib>
|
||||||
|
|
||||||
|
|
||||||
|
void draw_tetromino(sf::RenderWindow &window, const Tetrominos::Names &name,
|
||||||
|
const sf::Vector2<float> &pos, int anim) {
|
||||||
|
sf::RectangleShape cell({28.f, 28.f});
|
||||||
|
cell.setOutlineThickness(4.f);
|
||||||
|
cell.setOutlineColor({});
|
||||||
|
|
||||||
|
for (int y = 0; y < 4; y++) {
|
||||||
|
for (int x = 0; x < 4; x++) {
|
||||||
|
if (Tetrominos::shapes[name][anim][y][x] == 1) {
|
||||||
|
cell.setPosition(x * 34.f + (16.f + pos.x * 34.f),
|
||||||
|
y * 34.f + (16.f + pos.y * 34.f));
|
||||||
|
cell.setFillColor(getTetrominoColor(name));
|
||||||
|
window.draw(cell);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int main(int ac, char **av) {
|
||||||
|
(void)ac;
|
||||||
|
sf::Clock clock;
|
||||||
|
sf::Clock input_clock;
|
||||||
|
bool left_rotating = false;
|
||||||
|
bool right_rotating = false;
|
||||||
|
sf::RectangleShape top_hider({400.f, 12.f});
|
||||||
|
sf::RectangleShape pred_box({155.f, 77.f});
|
||||||
|
pred_box.setPosition(365.f, 586.f);
|
||||||
|
sf::RenderWindow window(sf::VideoMode(520, 700), av[0]+2);
|
||||||
|
Board board;
|
||||||
|
top_hider.setFillColor({40, 40, 40, 255});
|
||||||
|
float descending_delay = 500.f;
|
||||||
|
float input_delay = 100.f;
|
||||||
|
sf::Vector2<int> pos = {3, -2};
|
||||||
|
int anim_id = 0;
|
||||||
|
std::srand(std::time(nullptr));
|
||||||
|
int pred_shape = static_cast<Tetrominos::Names>(std::rand() / ((RAND_MAX + 1u) / 7));
|
||||||
|
int shape = static_cast<Tetrominos::Names>(std::rand() / ((RAND_MAX + 1u) / 7));
|
||||||
|
|
||||||
|
while (window.isOpen())
|
||||||
|
{
|
||||||
|
auto ElapsedTime = clock.getElapsedTime();
|
||||||
|
auto KeyElapsedTime = input_clock.getElapsedTime();
|
||||||
|
|
||||||
|
sf::Joystick::update();
|
||||||
|
// Joystick
|
||||||
|
if (sf::Joystick::isConnected(0)) {
|
||||||
|
auto buttonCount = sf::Joystick::getButtonCount(0);
|
||||||
|
for (int i = 0; i <= buttonCount; i++) {
|
||||||
|
std::cout << i << " : " << sf::Joystick::isButtonPressed(0, i) << std::endl;
|
||||||
|
}
|
||||||
|
// Moving
|
||||||
|
if (KeyElapsedTime.asMilliseconds() > input_delay) {
|
||||||
|
// Left & Right
|
||||||
|
if (!(sf::Keyboard::isKeyPressed(sf::Keyboard::A) && sf::Keyboard::isKeyPressed(sf::Keyboard::D))) {
|
||||||
|
if (sf::Keyboard::isKeyPressed(sf::Keyboard::A)) {
|
||||||
|
if (board.DoesFit(static_cast<Tetrominos::Names>(shape), anim_id, {pos.x - 1, pos.y})) {
|
||||||
|
pos.x--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (sf::Keyboard::isKeyPressed(sf::Keyboard::D)) {
|
||||||
|
if (board.DoesFit(static_cast<Tetrominos::Names>(shape), anim_id, {pos.x + 1, pos.y})) {
|
||||||
|
pos.x++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Speeding down
|
||||||
|
if (sf::Keyboard::isKeyPressed(sf::Keyboard::S)) {
|
||||||
|
if (board.DoesFit(static_cast<Tetrominos::Names>(shape), anim_id, {pos.x, pos.y + 1})) {
|
||||||
|
pos.y++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
input_clock.restart();
|
||||||
|
}
|
||||||
|
// Rotating
|
||||||
|
if (!(sf::Keyboard::isKeyPressed(sf::Keyboard::K) && sf::Keyboard::isKeyPressed(sf::Keyboard::L))) {
|
||||||
|
if (sf::Keyboard::isKeyPressed(sf::Keyboard::K) && left_rotating == false) {
|
||||||
|
int next_anim = anim_id - 1;
|
||||||
|
if (next_anim < 0) {
|
||||||
|
next_anim = 3;
|
||||||
|
}
|
||||||
|
if (board.DoesFit(static_cast<Tetrominos::Names>(shape), next_anim, {pos.x, pos.y})) {
|
||||||
|
anim_id = next_anim;
|
||||||
|
}
|
||||||
|
left_rotating = true;
|
||||||
|
}
|
||||||
|
if (sf::Keyboard::isKeyPressed(sf::Keyboard::L) && right_rotating == false) {
|
||||||
|
int next_anim = anim_id + 1;
|
||||||
|
if (next_anim > 3) {
|
||||||
|
next_anim = 0;
|
||||||
|
}
|
||||||
|
if (board.DoesFit(static_cast<Tetrominos::Names>(shape), next_anim, {pos.x, pos.y})) {
|
||||||
|
anim_id = next_anim;
|
||||||
|
}
|
||||||
|
right_rotating = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!sf::Keyboard::isKeyPressed(sf::Keyboard::K) && left_rotating == true) {
|
||||||
|
left_rotating = false;
|
||||||
|
}
|
||||||
|
if (!sf::Keyboard::isKeyPressed(sf::Keyboard::L) && right_rotating == true) {
|
||||||
|
right_rotating = false;
|
||||||
|
}
|
||||||
|
} else { // Keyboard
|
||||||
|
// Moving
|
||||||
|
if (KeyElapsedTime.asMilliseconds() > input_delay) {
|
||||||
|
// Left & Right
|
||||||
|
if (!(sf::Keyboard::isKeyPressed(sf::Keyboard::A) && sf::Keyboard::isKeyPressed(sf::Keyboard::D))) {
|
||||||
|
if (sf::Keyboard::isKeyPressed(sf::Keyboard::A)) {
|
||||||
|
if (board.DoesFit(static_cast<Tetrominos::Names>(shape), anim_id, {pos.x - 1, pos.y})) {
|
||||||
|
pos.x--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (sf::Keyboard::isKeyPressed(sf::Keyboard::D)) {
|
||||||
|
if (board.DoesFit(static_cast<Tetrominos::Names>(shape), anim_id, {pos.x + 1, pos.y})) {
|
||||||
|
pos.x++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Speeding down
|
||||||
|
if (sf::Keyboard::isKeyPressed(sf::Keyboard::S)) {
|
||||||
|
if (board.DoesFit(static_cast<Tetrominos::Names>(shape), anim_id, {pos.x, pos.y + 1})) {
|
||||||
|
pos.y++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
input_clock.restart();
|
||||||
|
}
|
||||||
|
// Rotating
|
||||||
|
if (!(sf::Keyboard::isKeyPressed(sf::Keyboard::K) && sf::Keyboard::isKeyPressed(sf::Keyboard::L))) {
|
||||||
|
if (sf::Keyboard::isKeyPressed(sf::Keyboard::K) && left_rotating == false) {
|
||||||
|
int next_anim = anim_id - 1;
|
||||||
|
if (next_anim < 0) {
|
||||||
|
next_anim = 3;
|
||||||
|
}
|
||||||
|
if (board.DoesFit(static_cast<Tetrominos::Names>(shape), next_anim, {pos.x, pos.y})) {
|
||||||
|
anim_id = next_anim;
|
||||||
|
}
|
||||||
|
left_rotating = true;
|
||||||
|
}
|
||||||
|
if (sf::Keyboard::isKeyPressed(sf::Keyboard::L) && right_rotating == false) {
|
||||||
|
int next_anim = anim_id + 1;
|
||||||
|
if (next_anim > 3) {
|
||||||
|
next_anim = 0;
|
||||||
|
}
|
||||||
|
if (board.DoesFit(static_cast<Tetrominos::Names>(shape), next_anim, {pos.x, pos.y})) {
|
||||||
|
anim_id = next_anim;
|
||||||
|
}
|
||||||
|
right_rotating = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!sf::Keyboard::isKeyPressed(sf::Keyboard::K) && left_rotating == true) {
|
||||||
|
left_rotating = false;
|
||||||
|
}
|
||||||
|
if (!sf::Keyboard::isKeyPressed(sf::Keyboard::L) && right_rotating == true) {
|
||||||
|
right_rotating = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Scrolling down
|
||||||
|
if (ElapsedTime.asMilliseconds() > descending_delay) {
|
||||||
|
if (board.DoesFit(static_cast<Tetrominos::Names>(shape), anim_id,
|
||||||
|
{pos.x, pos.y + 1})) {
|
||||||
|
pos.y++;
|
||||||
|
} else {
|
||||||
|
board.PlaceTetromino(static_cast<Tetrominos::Names>(shape), anim_id, {pos.x, pos.y});
|
||||||
|
board.CheckLines();
|
||||||
|
pos = {3, -2};
|
||||||
|
anim_id = 0;
|
||||||
|
shape = pred_shape;
|
||||||
|
pred_shape = static_cast<Tetrominos::Names>(std::rand() / ((RAND_MAX + 1u) / 7));
|
||||||
|
}
|
||||||
|
//anim_id++;
|
||||||
|
if (anim_id >= 4) {
|
||||||
|
anim_id = 0;
|
||||||
|
}
|
||||||
|
clock.restart();
|
||||||
|
}
|
||||||
|
sf::Event event;
|
||||||
|
while (window.pollEvent(event))
|
||||||
|
{
|
||||||
|
if (event.type == sf::Event::Closed)
|
||||||
|
window.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
// UI
|
||||||
|
window.clear(sf::Color(40, 40, 40, 255));
|
||||||
|
board.Draw(window);
|
||||||
|
window.draw(pred_box);
|
||||||
|
|
||||||
|
// Game
|
||||||
|
draw_tetromino(window, static_cast<Tetrominos::Names>(shape), {static_cast<float>(pos.x), static_cast<float>(pos.y)}, anim_id);
|
||||||
|
window.draw(top_hider);
|
||||||
|
draw_tetromino(window, static_cast<Tetrominos::Names>(pred_shape), {10.5f, 15.f}, 0);
|
||||||
|
window.display();
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user