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;