summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEkaitz Zarraga <ekaitz@elenq.tech>2022-05-21 21:36:37 +0200
committerEkaitz Zarraga <ekaitz@elenq.tech>2022-05-21 21:36:37 +0200
commit41d2578d3401e38fa8600a533ad5998dc39e7be5 (patch)
tree8199af62e448b1010bab8ec4caca98d7ada860ff
parent3ce5ae75abd2de874b6c33214ea44063f11a0d4d (diff)
add move sideways capability
-rw-r--r--src/command.cpp8
-rw-r--r--src/command.h8
-rw-r--r--src/game.cpp48
-rw-r--r--src/game.h2
-rw-r--r--src/keyboard.cpp13
-rw-r--r--src/keyboard.h2
-rw-r--r--src/piece.cpp6
-rw-r--r--src/piece.h2
8 files changed, 73 insertions, 16 deletions
diff --git a/src/command.cpp b/src/command.cpp
index d0ee45b..efe2987 100644
--- a/src/command.cpp
+++ b/src/command.cpp
@@ -32,3 +32,11 @@ KeyboardDownPressed::~KeyboardDownPressed(){}
void KeyboardDownPressed::execute( GameState &game ){
game.pressDown();
}
+KeyboardLeftPressed::~KeyboardLeftPressed(){}
+void KeyboardLeftPressed::execute( GameState &game ){
+ game.pressLeft();
+}
+KeyboardRightPressed::~KeyboardRightPressed(){}
+void KeyboardRightPressed::execute( GameState &game ){
+ game.pressRight();
+}
diff --git a/src/command.h b/src/command.h
index a40e786..c22e6e5 100644
--- a/src/command.h
+++ b/src/command.h
@@ -36,5 +36,13 @@ class KeyboardDownPressed: public Command {
~KeyboardDownPressed();
void execute( GameState &state ) override;
};
+class KeyboardLeftPressed: public Command {
+ ~KeyboardLeftPressed();
+ void execute( GameState &state ) override;
+};
+class KeyboardRightPressed: public Command {
+ ~KeyboardRightPressed();
+ void execute( GameState &state ) override;
+};
#endif
diff --git a/src/game.cpp b/src/game.cpp
index 1ed8cc0..17000a0 100644
--- a/src/game.cpp
+++ b/src/game.cpp
@@ -51,20 +51,14 @@ void GameState::update( unsigned int dt ){
Piece tmp = piece_;
tmp.advance();
Point* p;
- tmp.initIterator();
-
// Check if there's space to move forward
- bool canadvance;
+ tmp.initIterator();
while ( p = tmp.nextAbsBlockPos() ){
- if ( grid[p->y][p->x] == 0 ){
- canadvance = true;
- } else {
- canadvance = false;
+ if(!cellIsEmpty(p)){
+ return;
}
}
- if ( canadvance ){
- piece_ = tmp;
- }
+ piece_ = tmp;
}
// If timer finished, level up
@@ -106,6 +100,9 @@ void GameState::render(){
renderer_->update();
}
+bool GameState::cellIsEmpty(Point* p){
+ return( grid[p->y][p->x] == 0 );
+}
void GameState::pressRotate(){}
void GameState::pressDown(){
@@ -115,7 +112,30 @@ void GameState::releaseDown(){
yspeed_ = 1;
}
-void GameState::pressLeft(){}
-void GameState::releaseLeft(){}
-void GameState::pressRight(){}
-void GameState::releaseRight(){}
+void GameState::pressLeft(){
+ Piece tmp = piece_;
+ tmp.move_left();
+ Point* p;
+
+ // Check if there's space to move to
+ tmp.initIterator();
+ while ( p = tmp.nextAbsBlockPos() ){
+ if(!cellIsEmpty(p)){
+ return;
+ }
+ }
+ piece_ = tmp;
+}
+void GameState::pressRight(){
+ Piece tmp = piece_;
+ tmp.move_right();
+ Point* p;
+ // Check if there's space to move to
+ tmp.initIterator();
+ while ( p = tmp.nextAbsBlockPos() ){
+ if(!cellIsEmpty(p)){
+ return;
+ }
+ }
+ piece_ = tmp;
+}
diff --git a/src/game.h b/src/game.h
index 8965010..0e6a553 100644
--- a/src/game.h
+++ b/src/game.h
@@ -47,6 +47,8 @@ class GameState{
void update(unsigned int dt);
void render();
+ bool cellIsEmpty(Point* p);
+
void pressRotate();
void pressDown();
void releaseDown();
diff --git a/src/keyboard.cpp b/src/keyboard.cpp
index 1eff1d1..8f5d81c 100644
--- a/src/keyboard.cpp
+++ b/src/keyboard.cpp
@@ -2,13 +2,18 @@
Keyboard::Keyboard(){
nop = new Nop;
- pressedDown = new KeyboardDownPressed;
- releasedDown = new KeyboardDownReleased;
+
+ pressedDown = new KeyboardDownPressed;
+ releasedDown = new KeyboardDownReleased;
+ pressedLeft = new KeyboardLeftPressed;
+ pressedRight = new KeyboardRightPressed;
}
Keyboard::~Keyboard(){
delete nop;
delete pressedDown;
delete releasedDown;
+ delete pressedLeft;
+ delete pressedRight;
}
Command* Keyboard::handleEvent( SDL_Event e ){
@@ -26,6 +31,10 @@ Command* Keyboard::pressed( SDL_Keycode k, Uint16 mod ){
switch(k){
case SDLK_DOWN:
return pressedDown;
+ case SDLK_LEFT:
+ return pressedLeft;
+ case SDLK_RIGHT:
+ return pressedRight;
default:
return nop;
}
diff --git a/src/keyboard.h b/src/keyboard.h
index 561fda2..6853ffc 100644
--- a/src/keyboard.h
+++ b/src/keyboard.h
@@ -18,6 +18,8 @@ class Keyboard{
Command* nop;
Command* pressedDown;
Command* releasedDown;
+ Command* pressedLeft;
+ Command* pressedRight;
};
#endif
diff --git a/src/piece.cpp b/src/piece.cpp
index 51e8dc7..67755f0 100644
--- a/src/piece.cpp
+++ b/src/piece.cpp
@@ -69,3 +69,9 @@ void Piece::rotate(){
void Piece::advance(){
position_.y++;
}
+void Piece::move_left(){
+ position_.x--;
+}
+void Piece::move_right(){
+ position_.x++;
+}
diff --git a/src/piece.h b/src/piece.h
index 53bd112..ee95539 100644
--- a/src/piece.h
+++ b/src/piece.h
@@ -24,6 +24,8 @@ class Piece {
Point getPosition();
void rotate();
void advance();
+ void move_left();
+ void move_right();
void initIterator();
Point* nextAbsBlockPos();