Implementado el cambio de pantalla

This commit is contained in:
2022-08-20 15:41:23 +02:00
parent 7e93b3150f
commit 75c6acdd53
16 changed files with 364 additions and 62 deletions

View File

@@ -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("01.map"), renderer, asset);
map = new Map(asset->get("02.map"), renderer, asset);
player = new Player(renderer, asset, input, map);
debugText = new Text(asset->get("debug.png"), asset->get("debug.txt"), renderer);
}
@@ -75,6 +75,7 @@ void Game::update()
}
player->update();
checkScreenBorders();
checkInput();
}
}
@@ -105,6 +106,8 @@ void Game::checkInput()
if (input->checkInput(INPUT_BUTTON_3, REPEAT_FALSE))
{
delete map;
map = new Map(asset->get("01.map"),renderer, asset);
delete player;
player = new Player(renderer, asset, input, map);
}
@@ -156,4 +159,40 @@ void Game::renderDebugInfo()
text = "state " + std::to_string(player->state);
debugText->write(0, line += 6, text, -1);
text = map->getRoomFileName(b_top) + " " +map->getRoomFileName(b_right) + " " +map->getRoomFileName(b_bottom) + " " +map->getRoomFileName(b_left);
debugText->write(0, line += 6, text, -1);
}
// Cambia el mapa
bool Game::changeMap(std::string file)
{
bool success = false;
// En las habitaciones los limites tienen la cadena del fichero o un 0 en caso de no limitar con nada
if (file != "0")
// Verifica que exista el fichero que se va a cargar
if (asset->get(file) != "")
{
// Elimina la habitación actual
delete map;
// Crea un objeto habitación nuevo a partir del fichero
map = new Map(asset->get(file), renderer, asset);
success = true;
}
return success;
}
// Comprueba si el jugador está en el borde y se ha de cambiar el mapa
void Game::checkScreenBorders()
{
if (player->isOnScreenBorder())
{
if (changeMap(map->getRoomFileName(player->getBorder())))
{
player->setMap(map);
player->switchBorders();
}
}
}

View File

@@ -42,6 +42,12 @@ private:
// Muestra información de depuración
void renderDebugInfo();
// Cambia el mapa
bool changeMap(std::string file);
// Comprueba si el jugador está en el borde y se ha de cambiar el mapa
void checkScreenBorders();
public:
// Constructor
Game(SDL_Renderer *renderer, Asset *asset, Screen *screen, Input *input);

View File

@@ -8,7 +8,7 @@ Map::Map(std::string file, SDL_Renderer *renderer, Asset *asset)
map_width = 40;
map_height = 26;
tileset_width = 32;
// Copia los punteros a objetos
this->asset = asset;
this->renderer = renderer;
@@ -223,9 +223,11 @@ void Map::render()
}
// Devuelve el tipo de tile que hay en un punto
t_tile_map Map::getTile(SDL_Point p)
e_tile_map Map::getTile(SDL_Point p)
{
const int tile = tilemap[((p.y / tile_size) * map_width) + (p.x / tile_size)];
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))));
const int tile = tilemap[((y / tile_size) * map_width) + (x / tile_size)];
const int png_width = 32;
if (tile >= 0 && tile < 8 * png_width)
@@ -240,6 +242,8 @@ t_tile_map Map::getTile(SDL_Point p)
{
return passable;
}
return nothing;
}
// Devuelve el valor de la variable
@@ -252,4 +256,60 @@ int Map::getTileSize()
int Map::getTileIndex(SDL_Point p)
{
return tilemap[((p.y / tile_size) * map_width) + (p.x / tile_size)];
}
// Devuelve el valor de los bordes de la zona de juego
int Map::getPlayArea(e_border border)
{
switch (border)
{
case b_top:
return 0;
break;
case b_left:
return 0;
break;
case b_right:
return tile_size * map_width;
break;
case b_bottom:
return tile_size * map_height;
break;
default:
break;
}
return -1;
}
// Devuelve el nombre del fichero de la habitación en funcion del borde
std::string Map::getRoomFileName(e_border border)
{
switch (border)
{
case b_top:
return room_up;
break;
case b_left:
return room_left;
break;
case b_right:
return room_right;
break;
case b_bottom:
return room_down;
break;
default:
break;
}
return "";
}

View File

@@ -12,13 +12,22 @@
#ifndef MAP_H
#define MAP_H
enum t_tile_map
enum e_tile_map
{
nothing,
wall,
passable
};
enum e_border
{
b_none,
b_top,
b_bottom,
b_left,
b_right
};
// The player
class Map
{
@@ -64,13 +73,19 @@ public:
void render();
// Devuelve el tipo de tile que hay en un punto
t_tile_map getTile(SDL_Point p);
e_tile_map getTile(SDL_Point p);
// Devuelve el valor de la variable
int getTileSize();
// Devuelve el indice del tile correspondiente a un punto del mapa
int getTileIndex(SDL_Point p);
// Devuelve el valor de los bordes de la zona de juego
int getPlayArea(e_border border);
// Devuelve el nombre del fichero de la habitación en funcion del borde
std::string getRoomFileName(e_border border);
};
#endif

View File

@@ -302,4 +302,74 @@ bool Player::isOnFloor()
onFloor |= ((map->getTile(f) == wall) || (map->getTile(f) == passable));
}
return onFloor;
}
// Comprueba si está situado en alguno de los cuatro bordes de la habitación
bool Player::isOnScreenBorder()
{
bool success = false;
border = b_none;
if (x < map->getPlayArea(b_left))
{
border = b_left;
success = true;
}
else if (x > map->getPlayArea(b_right) - w)
{
border = b_right;
success = true;
}
else if (y < map->getPlayArea(b_top))
{
border = b_top;
success = true;
}
else if (y > map->getPlayArea(b_bottom) - h)
{
border = b_bottom;
success = true;
}
return success;
}
// Devuelve el valor de la variable
e_border Player::getBorder()
{
return border;
}
// Cambia al jugador de un borde al opuesto. Util para el cambio de pantalla
void Player::switchBorders()
{
switch (border)
{
case b_top:
y = map->getPlayArea(b_bottom) - h;
break;
case b_bottom:
y = map->getPlayArea(b_top);
break;
case b_right:
x = map->getPlayArea(b_left);
break;
case b_left:
x = map->getPlayArea(b_right) - w;
break;
default:
break;
}
border = b_none;
}
// Pasa la referencia del mapa
void Player::setMap(Map *map)
{
this->map = map;
}

View File

@@ -10,7 +10,7 @@
#ifndef PLAYER_H
#define PLAYER_H
enum t_player_state
enum e_state
{
standing,
jumping,
@@ -40,7 +40,8 @@ public:
int lives; // Cantidad de vidas
int w; // Ancho del jugador
int h; // ALto del jugador
t_player_state state; // Estado actual del jugador
e_state state; // Estado actual del jugador
e_border border; // Indica en qué borde de la pantalla está el jugador
SDL_Point lastPosition; // Posición anterior
// Variables que afectan a la inercia del movimiento
@@ -93,6 +94,18 @@ public:
// Dibuja el objeto
void render();
// Comprueba si está situado en alguno de los cuatro bordes de la habitación
bool isOnScreenBorder();
// Devuelve el valor de la variable
e_border getBorder();
// Cambia al jugador de un borde al opuesto. Util para el cambio de pantalla
void switchBorders();
// Pasa la referencia del mapa
void setMap(Map *map);
};
#endif

View File

@@ -140,7 +140,10 @@ bool Prog::setFileList()
// Ficheros binarios
asset->add("/data/map/01.map", data);
asset->add("/data/map/01.tmx", data);
asset->add("/data/map/01_8.tmx", data);
asset->add("/data/map/02.map", data);
asset->add("/data/map/02.tmx", data);
asset->add("/data/map/03.map", data);
asset->add("/data/map/03.tmx", data);
asset->add("/data/config.bin", data, false);
asset->add("/data/gamecontrollerdb.txt", data);
asset->add("/data/animations/player.ani", data);