diff --git a/data/actors/enemies/bug.ani b/data/actors/enemies/bug.ani
index 43ce4bc..05ed560 100644
--- a/data/actors/enemies/bug.ani
+++ b/data/actors/enemies/bug.ani
@@ -6,5 +6,5 @@ tile_height=16
name=walk
speed=8
loop=yes
-frames=0,1,2,3,4,5,6
+frames=0,1,2,3,4,5
[/animation]
\ No newline at end of file
diff --git a/data/actors/enemies/flying_eye.ani b/data/actors/enemies/flying_eye.ani
index 43ce4bc..05ed560 100644
--- a/data/actors/enemies/flying_eye.ani
+++ b/data/actors/enemies/flying_eye.ani
@@ -6,5 +6,5 @@ tile_height=16
name=walk
speed=8
loop=yes
-frames=0,1,2,3,4,5,6
+frames=0,1,2,3,4,5
[/animation]
\ No newline at end of file
diff --git a/data/actors/enemies/flying_eye_horn.ani b/data/actors/enemies/flying_eye_horn.ani
index 43ce4bc..83ca312 100644
--- a/data/actors/enemies/flying_eye_horn.ani
+++ b/data/actors/enemies/flying_eye_horn.ani
@@ -4,7 +4,7 @@ tile_height=16
[animation]
name=walk
-speed=8
+speed=6
loop=yes
-frames=0,1,2,3,4,5,6
+frames=0,1,2,3,4,5
[/animation]
\ No newline at end of file
diff --git a/data/actors/enemies/walking_eye.ani b/data/actors/enemies/walking_eye.ani
index 43ce4bc..05ed560 100644
--- a/data/actors/enemies/walking_eye.ani
+++ b/data/actors/enemies/walking_eye.ani
@@ -6,5 +6,5 @@ tile_height=16
name=walk
speed=8
loop=yes
-frames=0,1,2,3,4,5,6
+frames=0,1,2,3,4,5
[/animation]
\ No newline at end of file
diff --git a/data/map/01.map b/data/map/01.map
index 3e135fa..533205d 100644
--- a/data/map/01.map
+++ b/data/map/01.map
@@ -7,4 +7,4 @@ room_right=02.map
[tilemap]
01.tmx
-[tilemap-end]
\ No newline at end of file
+[/tilemap]
\ No newline at end of file
diff --git a/data/map/01.tmx b/data/map/01.tmx
index f0873bb..42a816e 100644
--- a/data/map/01.tmx
+++ b/data/map/01.tmx
@@ -5,30 +5,30 @@
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,19,20,0,0,0,0,0,87,88,89,90,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,51,52,0,0,0,0,0,119,120,121,122,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,19,20,0,0,0,0,0,0,0,0,0,0,0,151,152,153,154,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,51,52,0,0,0,0,0,0,0,0,0,0,0,183,184,185,186,0,0,0,0,0,0,
+0,18,19,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,50,51,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,19,20,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,51,52,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,159,160,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,259,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,191,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,259,0,0,0,
0,0,0,0,0,0,0,263,264,0,0,0,0,0,0,0,0,257,258,0,0,0,0,0,0,0,0,0,263,264,0,0,0,0,0,0,259,0,0,0,
0,0,0,0,0,0,0,295,296,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,265,266,0,0,0,0,0,0,259,0,0,0,
0,263,264,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,259,0,0,0,
0,295,296,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,577,578,579,580,581,582,0,0,0,0,0,0,259,0,0,259,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,189,190,0,0,0,0,0,0,0,0,259,0,0,259,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,577,578,579,580,581,582,0,0,0,0,0,0,259,0,0,259,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,577,578,579,580,581,582,0,0,0,0,0,0,259,0,0,259,0,0,0,
-0,0,0,0,239,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,577,578,579,580,581,582,0,265,266,0,0,0,259,0,0,259,0,0,0,
+0,0,0,0,239,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,189,190,0,0,0,265,266,0,0,0,259,0,0,259,0,0,0,
0,0,0,257,258,257,258,0,0,0,0,0,0,0,0,0,0,0,0,0,0,577,578,579,580,581,582,0,0,0,0,0,0,259,0,0,259,0,0,0,
-0,0,0,289,290,289,290,0,0,0,0,577,578,579,580,581,582,0,0,0,0,577,578,579,580,581,582,0,0,0,0,0,0,259,0,0,259,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,577,578,579,580,581,582,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,577,578,579,580,581,582,0,0,0,0,0,0,0,0,0,0,0,0,0,
-263,264,0,0,0,0,0,193,194,0,0,0,0,0,0,0,0,0,0,0,0,0,281,282,277,278,279,280,0,0,0,0,0,0,0,0,0,0,0,0,
-295,296,0,0,0,0,0,225,226,0,0,0,0,0,0,0,0,281,275,275,275,275,313,314,309,310,311,312,0,0,0,0,0,0,0,0,0,0,0,0,
-265,264,263,264,263,264,263,264,263,0,263,264,263,264,263,264,263,264,263,266,266,266,283,284,266,265,266,264,263,264,263,264,263,264,263,264,263,264,263,264,
-295,296,295,296,295,296,295,296,295,0,295,296,295,296,295,296,295,296,295,296,295,296,315,316,298,297,298,296,295,296,295,296,295,296,295,296,295,296,295,296
+0,0,0,289,290,289,290,0,0,0,0,577,578,579,580,581,582,0,0,0,0,0,0,189,190,0,0,0,0,0,0,0,0,259,0,0,259,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,189,190,0,0,0,0,0,0,577,578,579,580,581,582,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,189,190,0,0,0,0,0,0,0,0,189,190,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+263,264,0,0,0,0,0,193,194,0,0,0,0,189,190,0,0,0,0,0,0,0,281,282,277,278,279,280,0,0,0,0,0,0,0,0,0,0,0,0,
+295,296,0,0,0,0,0,225,226,0,0,0,0,189,190,0,0,281,275,275,275,275,313,314,309,310,311,312,0,0,0,0,0,0,0,0,0,0,0,0,
+265,264,263,264,263,264,263,264,263,264,263,264,263,264,263,264,263,264,263,266,266,266,283,284,266,265,266,264,263,264,263,264,263,264,263,264,263,264,263,264,
+295,296,295,296,295,296,295,296,295,265,295,296,295,296,295,296,295,296,295,296,295,296,315,316,298,297,298,296,295,296,295,296,295,296,295,296,295,296,295,296
diff --git a/data/map/02.map b/data/map/02.map
index e47a5a1..064fb40 100644
--- a/data/map/02.map
+++ b/data/map/02.map
@@ -7,4 +7,49 @@ room_right=0
[tilemap]
02.tmx
-[tilemap-end]
\ No newline at end of file
+[/tilemap]
+
+[enemy]
+tileset=walking_eye.png
+animation=walking_eye.ani
+width=16
+height=16
+x=3
+y=17
+vx=0.4
+vy=0
+x1=3
+y1=17
+x2=13
+y2=17
+[/enemy]
+
+[enemy]
+tileset=flying_eye.png
+animation=flying_eye.ani
+width=16
+height=16
+x=18
+y=11
+vx=0
+vy=0.5
+x1=18
+y1=11
+x2=18
+y2=17
+[/enemy]
+
+[enemy]
+tileset=flying_eye_horn.png
+animation=flying_eye_horn.ani
+width=16
+height=16
+x=21
+y=11
+vx=0
+vy=0.7
+x1=21
+y1=11
+x2=21
+y2=17
+[/enemy]
\ No newline at end of file
diff --git a/data/map/02.tmx b/data/map/02.tmx
index 0f00ee9..d4bd985 100644
--- a/data/map/02.tmx
+++ b/data/map/02.tmx
@@ -6,12 +6,12 @@
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,266,266,266,266,266,266,266,266,266,266,266,266,266,266,0,0,297,297,0,297,297,0,297,297,0,297,297,0,297,297,0,297,297,0,297,297,0,0,
0,0,266,0,0,0,0,0,0,0,0,0,0,0,0,266,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,265,0,0,0,0,0,0,0,0,0,0,0,0,265,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,265,265,265,265,265,265,265,265,265,265,265,265,265,265,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,266,0,0,0,0,0,0,0,0,0,0,0,0,266,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,265,0,0,0,0,0,0,0,0,0,0,0,0,265,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,265,265,265,265,265,265,265,265,265,265,265,265,265,265,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,266,0,0,0,0,0,0,0,0,0,0,0,0,266,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,265,0,0,0,0,0,0,0,0,0,0,0,0,265,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,19,20,0,
+0,0,265,265,265,265,265,265,265,265,265,265,265,265,265,265,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,51,52,0,
+0,0,266,0,0,0,0,0,0,0,0,0,0,0,0,266,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,87,88,89,90,0,0,0,0,
+0,0,265,0,0,0,0,0,0,0,0,0,0,0,0,265,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,119,120,121,122,0,0,0,0,
+0,0,265,265,265,265,265,265,265,265,265,265,265,265,265,265,0,18,19,20,0,0,0,0,0,0,0,0,0,0,0,0,151,152,153,154,0,0,0,0,
+0,0,266,0,0,0,0,0,0,0,0,0,0,0,0,266,0,50,51,52,0,0,0,0,0,0,0,0,0,0,0,0,183,184,185,186,0,0,0,0,
0,0,265,0,0,0,0,0,0,0,0,0,0,0,0,265,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,265,265,265,265,265,265,265,265,265,265,265,265,265,265,0,0,297,297,0,297,297,0,297,297,0,297,297,0,297,297,0,297,297,0,297,297,0,0,
0,0,266,0,0,0,0,0,0,0,0,0,0,0,0,266,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
@@ -20,15 +20,15 @@
0,0,266,0,0,0,0,0,0,0,0,0,0,0,0,266,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,265,0,0,0,0,0,0,0,0,0,0,0,0,265,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,265,265,265,265,265,265,265,265,265,265,265,265,265,265,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,266,0,0,0,0,0,0,0,0,0,0,0,0,266,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,265,0,0,0,0,0,0,0,0,0,0,0,0,265,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,266,0,0,0,0,0,0,0,0,0,0,0,0,266,0,0,0,0,0,0,0,0,0,0,0,195,196,0,0,0,0,0,0,0,0,0,0,0,
+0,0,265,0,0,0,0,0,0,0,0,0,0,0,0,265,0,0,0,0,0,0,0,0,0,0,0,227,228,0,0,0,0,0,0,0,0,0,0,0,
0,0,265,265,265,265,265,265,265,265,265,265,265,265,265,265,0,0,297,297,0,297,297,0,297,297,0,297,297,0,297,297,0,297,297,0,297,297,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-263,263,263,263,263,263,263,263,263,263,263,263,263,263,263,263,263,263,263,263,263,264,264,264,264,264,0,0,0,0,264,264,264,264,264,264,264,264,264,264,
-295,295,295,295,295,295,295,295,295,295,295,295,295,295,295,295,295,295,295,295,295,296,296,296,296,296,0,0,0,0,296,296,296,296,296,296,296,296,296,296
+23,24,25,26,27,28,29,30,31,32,23,24,25,26,27,28,29,30,31,32,23,24,25,26,27,28,29,30,31,32,23,24,25,26,27,28,29,30,31,32,
+55,56,57,58,59,60,61,62,63,64,55,56,57,58,59,60,61,62,63,64,55,56,57,58,59,60,61,62,63,64,55,56,57,58,59,60,61,62,63,64,
+263,263,263,263,263,263,263,263,263,263,263,263,263,263,263,263,263,263,263,263,263,264,264,264,264,264,135,136,135,136,264,264,264,264,264,264,264,264,264,264,
+295,295,295,295,295,295,295,295,295,295,295,295,295,295,295,295,295,295,295,295,295,296,296,296,296,296,167,168,167,168,296,296,296,296,296,296,296,296,296,296
diff --git a/data/map/03.map b/data/map/03.map
index b7762da..c655a06 100644
--- a/data/map/03.map
+++ b/data/map/03.map
@@ -7,4 +7,4 @@ room_right=0
[tilemap]
03.tmx
-[tilemap-end]
\ No newline at end of file
+[/tilemap]
\ No newline at end of file
diff --git a/source/enemy.cpp b/source/enemy.cpp
new file mode 100644
index 0000000..c6595c5
--- /dev/null
+++ b/source/enemy.cpp
@@ -0,0 +1,89 @@
+#include "enemy.h"
+#include
+#include
+
+// Constructor
+Enemy::Enemy(enemy_t enemy)
+{
+ // Obten punteros a objetos
+ asset = enemy.asset;
+ renderer = enemy.renderer;
+
+ // Crea objetos
+ texture = new LTexture();
+ loadTextureFromFile(texture, asset->get(enemy.tileset), renderer);
+ sprite = new AnimatedSprite(texture, renderer, asset->get(enemy.animation));
+
+ // Obten el resto de valores
+ x1 = enemy.x1;
+ x2 = enemy.x2;
+ y1 = enemy.y1;
+ y2 = enemy.y2;
+ color = enemy.color;
+ sprite->setPosX(enemy.x);
+ sprite->setPosY(enemy.y);
+ sprite->setVelX(enemy.vx);
+ sprite->setVelY(enemy.vy);
+
+ // Inicializa el sprite con el resto de parametros comunes
+ sprite->setWidth(enemy.w);
+ sprite->setHeight(enemy.h);
+ sprite->setCurrentAnimation("walk");
+ sprite->setFlip(enemy.vx>0?SDL_FLIP_NONE:SDL_FLIP_HORIZONTAL);
+
+ collider = getRect();
+}
+
+// Destructor
+Enemy::~Enemy()
+{
+ texture->unload();
+ delete texture;
+ texture = nullptr;
+
+ delete sprite;
+ sprite = nullptr;
+}
+
+// Pinta el enemigo en pantalla
+void Enemy::render()
+{
+ sprite->render();
+}
+
+// Actualiza las variables del objeto
+void Enemy::update()
+{
+ sprite->update();
+ sprite->animate();
+ checkPath();
+ collider = getRect();
+}
+
+// Comprueba si ha llegado al limite del recorrido para darse media vuelta
+void Enemy::checkPath()
+{
+ if (sprite->getPosX() > x2 || sprite->getPosX() < x1)
+ {
+ sprite->setVelX(sprite->getVelX() * (-1));
+ sprite->flip();
+ }
+
+ if (sprite->getPosY() > y2 || sprite->getPosY() < y1)
+ {
+ sprite->setVelY(sprite->getVelY() * (-1));
+ sprite->flip();
+ }
+}
+
+// Devuelve el rectangulo que contiene al enemigo
+SDL_Rect Enemy::getRect()
+{
+ return sprite->getRect();
+}
+
+// Obtiene el rectangulo de colision del enemigo
+SDL_Rect &Enemy::getCollider()
+{
+ return collider;
+}
\ No newline at end of file
diff --git a/source/enemy.h b/source/enemy.h
new file mode 100644
index 0000000..42e35e7
--- /dev/null
+++ b/source/enemy.h
@@ -0,0 +1,70 @@
+#pragma once
+
+#include
+#include "utils.h"
+#include "asset.h"
+#include "animatedsprite.h"
+#include
+
+#ifndef ENEMY_H
+#define ENEMY_H
+
+// Estructura para pasar los datos de un enemigo
+struct enemy_t
+{
+ SDL_Renderer *renderer; // El renderizador de la ventana
+ Asset *asset; // Objeto con la ruta a todos los ficheros de recursos
+ std::string tileset; // Fichero con los graficos del enemigo
+ std::string animation; // Fichero con las animaciones del enemigo
+ int w; // Anchura del enemigo
+ int h; // Altura del enemigo
+ float x; // Posición inicial en el eje X
+ float y; // Posición inicial en el eje Y
+ float vx; // Velocidad en el eje X
+ float vy; // Velocidad en el eje Y
+ int x1; // Limite izquierdo de la ruta en el eje X
+ int x2; // Limite derecho de la ruta en el eje X
+ int y1; // Limite superior de la ruta en el eje Y
+ int y2; // Limite inferior de la ruta en el eje Y
+ color_t color; // Color del enemigo
+};
+
+// Clase Enemy
+class Enemy
+{
+private:
+ SDL_Renderer *renderer; // El renderizador de la ventana
+ Asset *asset; // Objeto con la ruta a todos los ficheros de recursos
+ LTexture *texture; // Textura con los graficos del enemigo
+ AnimatedSprite *sprite; // Sprite del enemigo
+ color_t color; // Color del enemigo
+ int x1; // Limite izquierdo de la ruta en el eje X
+ int x2; // Limite derecho de la ruta en el eje X
+ int y1; // Limite superior de la ruta en el eje Y
+ int y2; // Limite inferior de la ruta en el eje Y
+ SDL_Rect collider; // Caja de colisión
+
+ // Comprueba si ha llegado al limite del recorrido para darse media vuelta
+ void checkPath();
+
+public:
+ // Constructor
+ Enemy(enemy_t enemy);
+
+ // Destructor
+ ~Enemy();
+
+ // Pinta el enemigo en pantalla
+ void render();
+
+ // Actualiza las variables del objeto
+ void update();
+
+ // Devuelve el rectangulo que contiene al enemigo
+ SDL_Rect getRect();
+
+ // Obtiene el rectangulo de colision del enemigo
+ SDL_Rect &getCollider();
+};
+
+#endif
diff --git a/source/game.cpp b/source/game.cpp
index df6dbbb..dac19c2 100644
--- a/source/game.cpp
+++ b/source/game.cpp
@@ -10,7 +10,7 @@ Game::Game(SDL_Renderer *renderer, Asset *asset, Screen *screen, Input *input)
this->input = input;
eventHandler = new SDL_Event();
- map = new Map(asset->get("02.map"), renderer, asset);
+ map = new Map(asset->get("01.map"), renderer, asset);
player = new Player(renderer, asset, input, map);
debugText = new Text(asset->get("debug.png"), asset->get("debug.txt"), renderer);
}
@@ -76,6 +76,7 @@ void Game::update()
player->update();
checkScreenBorders();
+ map->update();
checkInput();
}
}
diff --git a/source/map.cpp b/source/map.cpp
index e689f8a..497cdcb 100644
--- a/source/map.cpp
+++ b/source/map.cpp
@@ -35,6 +35,12 @@ Map::~Map()
delete texture_tile;
SDL_DestroyTexture(map_texture);
+
+ for (auto enemy : enemy_list)
+ {
+ delete enemy;
+ }
+ enemy_list.clear();
}
// Carga las variables desde un fichero
@@ -95,7 +101,32 @@ bool Map::load(std::string file_path)
}
}
}
- } while (line != "[tilemap-end]");
+ } while (line != "[/tilemap]");
+ }
+
+ // Si la linea contiene el texto [enemy] se realiza el proceso de carga de un enemigo
+ else if (line == "[enemy]")
+ {
+ enemy_t enemy;
+ enemy.asset = asset;
+ enemy.renderer = renderer;
+
+ do
+ {
+ std::getline(file, line);
+
+ // Encuentra la posición del caracter '='
+ int pos = line.find("=");
+ // Procesa las dos subcadenas
+ if (!setEnemy(&enemy, line.substr(0, pos), line.substr(pos + 1, line.length())))
+ {
+ printf("Warning: file %s\n, unknown parameter \"%s\"\n", filename.c_str(), line.substr(0, pos).c_str());
+ success = false;
+ }
+ } while (line != "[/enemy]");
+
+ // Añade el enemigo al vector de enemigos
+ enemy_list.push_back(new Enemy(enemy));
}
// En caso contrario se parsea el fichero para buscar las variables y los valores
@@ -163,6 +194,71 @@ bool Map::setVars(std::string var, std::string value)
return success;
}
+// Asigna variables a una estructura enemy_t
+bool Map::setEnemy(enemy_t *enemy, std::string var, std::string value)
+{
+ // Indicador de éxito en la asignación
+ bool success = true;
+
+ if (var == "tileset")
+ {
+ enemy->tileset = value;
+ }
+ else if (var == "animation")
+ {
+ enemy->animation = value;
+ }
+ else if (var == "width")
+ {
+ enemy->w = std::stof(value);
+ }
+ else if (var == "height")
+ {
+ enemy->h = std::stof(value);
+ }
+ else if (var == "x")
+ {
+ enemy->x = std::stof(value) * tile_size;
+ }
+ else if (var == "y")
+ {
+ enemy->y = std::stof(value) * tile_size;
+ }
+ else if (var == "vx")
+ {
+ enemy->vx = std::stof(value);
+ }
+ else if (var == "vy")
+ {
+ enemy->vy = std::stof(value);
+ }
+ else if (var == "x1")
+ {
+ enemy->x1 = std::stoi(value) * tile_size;
+ }
+ else if (var == "x2")
+ {
+ enemy->x2 = std::stoi(value) * tile_size;
+ }
+ else if (var == "y1")
+ {
+ enemy->y1 = std::stoi(value) * tile_size;
+ }
+ else if (var == "y2")
+ {
+ enemy->y2 = std::stoi(value) * tile_size;
+ }
+ else if (var == "[/enemy]")
+ {
+ }
+ else
+ {
+ success = false;
+ }
+
+ return success;
+}
+
// Crea la textura con el mapeado de la habitación
void Map::fillMapTexture()
{
@@ -208,13 +304,14 @@ void Map::fillMapTexture()
}
// Dibuja el marco del marcador
- SDL_SetRenderDrawColor(renderer, 85, 50, 85, 0xFF);
- SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0xFF);
- SDL_Rect rect = {0, 208, 320, 32};
- SDL_RenderDrawRect(renderer, &rect);
- rect = {1, 209, 318, 30};
- SDL_RenderDrawRect(renderer, &rect);
+ // SDL_SetRenderDrawColor(renderer, 85, 50, 85, 0xFF);
+ // SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0xFF);
+ // SDL_Rect rect = {0, 208, 320, 32};
+ // SDL_RenderDrawRect(renderer, &rect);
+ // rect = {1, 209, 318, 30};
+ // SDL_RenderDrawRect(renderer, &rect);
+ // Vuelve a colocar el renderizador
SDL_SetRenderTarget(renderer, nullptr);
}
@@ -224,24 +321,44 @@ void Map::render()
// Dibuja la textura con el mapa en pantalla
SDL_Rect rect = {0, 0, GAMECANVAS_WIDTH, GAMECANVAS_HEIGHT};
SDL_RenderCopy(renderer, map_texture, &rect, NULL);
+
+ for (auto enemy : enemy_list)
+ {
+ enemy->render();
+ }
+}
+
+// Actualiza todas las variables
+void Map::update()
+{
+ for (auto enemy : enemy_list)
+ {
+ enemy->update();
+ }
}
// Devuelve el tipo de tile que hay en un punto
e_tile_map Map::getTile(SDL_Point p)
{
- const int x = std::max(getPlayArea(b_left), (std::min(p.x, getPlayArea(b_right))));
- const int y = std::max(getPlayArea(b_top), (std::min(p.y, getPlayArea(b_bottom))));
+ // Normalizamos los puntos para que no busque fuera del mapa
+ const int x = std::max(getPlayArea(b_left), (std::min(p.x, getPlayArea(b_right) - 1)));
+ const int y = std::max(getPlayArea(b_top), (std::min(p.y, getPlayArea(b_bottom) - 1)));
+
+ // Calcula el tile
const int tile = tilemap[((y / tile_size) * map_width) + (x / tile_size)];
const int png_width = 32;
+ // Las 8 primeras filas son tiles de fondo
if (tile >= 0 && tile < 8 * png_width)
{
return nothing;
}
+ // De la fila 8 a la 15 hay tiles de muro
else if (tile >= (8 * png_width) && tile < 16 * png_width)
{
return wall;
}
+ // A partir de la fila 16 son tiles atravesables
else
{
return passable;
diff --git a/source/map.h b/source/map.h
index 59029ea..fd08e8a 100644
--- a/source/map.h
+++ b/source/map.h
@@ -4,6 +4,7 @@
#include "utils.h"
#include "asset.h"
#include "const.h"
+#include "enemy.h"
#include
#include
#include
@@ -32,16 +33,17 @@ enum e_border
class Map
{
private:
- Asset *asset; // Objeto con la ruta a todos los ficheros de recursos
- SDL_Renderer *renderer; // El renderizador de la ventana
- std::string room_up; // Identificador de la habitación que se encuentra arriba
- std::string room_down; // Identificador de la habitación que se encuentra abajp
- std::string room_left; // Identificador de la habitación que se encuentra a la izquierda
- std::string room_right; // Identificador de la habitación que se encuentra a la derecha
- std::string tileset_img; // Imagen con los graficos para la habitación
- std::vector tilemap; // Indice de los tiles a dibujar en la habitación
- LTexture *texture_tile; // Textura con los graficos de los tiles habitación
- SDL_Texture *map_texture; // Textura para dibujar el mapa de la habitación
+ Asset *asset; // Objeto con la ruta a todos los ficheros de recursos
+ SDL_Renderer *renderer; // El renderizador de la ventana
+ std::string room_up; // Identificador de la habitación que se encuentra arriba
+ std::string room_down; // Identificador de la habitación que se encuentra abajp
+ std::string room_left; // Identificador de la habitación que se encuentra a la izquierda
+ std::string room_right; // Identificador de la habitación que se encuentra a la derecha
+ std::string tileset_img; // Imagen con los graficos para la habitación
+ std::vector tilemap; // Indice de los tiles a dibujar en la habitación
+ LTexture *texture_tile; // Textura con los graficos de los tiles habitación
+ SDL_Texture *map_texture; // Textura para dibujar el mapa de la habitación
+ std::vector enemy_list; // Listado con los enemigos de la habitación
int tile_size; // Ancho del tile en pixels
int map_width; // Ancho del mapa en tiles
@@ -54,6 +56,9 @@ private:
// Asigna variables a partir de dos cadenas
bool setVars(std::string var, std::string value);
+ // Asigna variables a una estructura enemy_t
+ bool setEnemy(enemy_t *enemy, std::string var, std::string value);
+
// Pinta el mapa de la habitación en la textura
void fillMapTexture();
diff --git a/source/movingsprite.cpp b/source/movingsprite.cpp
index 14fc078..1aa9264 100644
--- a/source/movingsprite.cpp
+++ b/source/movingsprite.cpp
@@ -303,6 +303,12 @@ void MovingSprite::setFlip(SDL_RendererFlip flip)
mFlip = flip;
}
+// Gira el sprite horizontalmente
+void MovingSprite::flip()
+{
+ mFlip = (mFlip==SDL_FLIP_HORIZONTAL)?SDL_FLIP_NONE:SDL_FLIP_HORIZONTAL;
+}
+
// Obtiene el valor de la variable
SDL_RendererFlip MovingSprite::getFlip()
{
diff --git a/source/movingsprite.h b/source/movingsprite.h
index 709f95f..78b23a7 100644
--- a/source/movingsprite.h
+++ b/source/movingsprite.h
@@ -141,6 +141,9 @@ public:
// Establece el valor de la variable
void setFlip(SDL_RendererFlip flip);
+ // Gira el sprite horizontalmente
+ void flip();
+
// Obtiene el valor de la variable
SDL_RendererFlip getFlip();
diff --git a/source/player.cpp b/source/player.cpp
index 5aa91e4..ebf5dac 100644
--- a/source/player.cpp
+++ b/source/player.cpp
@@ -27,7 +27,7 @@ Player::Player(SDL_Renderer *renderer, Asset *asset, Input *input, Map *map)
const SDL_Rect rect = {(int)x, (int)y, 16, 24};
sprite->setPos(rect);
sprite->setCurrentAnimation("stand");
- sprite->setFlip(SDL_FLIP_HORIZONTAL);
+ sprite->setFlip(SDL_FLIP_NONE);
jumpStrenght = 2.0f;
gravity = 0.3f;