Progresos con las rampas

This commit is contained in:
2022-09-06 20:37:39 +02:00
parent 066a9ab811
commit 9af135100c
7 changed files with 89 additions and 38 deletions

View File

@@ -4,19 +4,19 @@
<layer id="1" name="Capa de patrones 1" width="32" height="16"> <layer id="1" name="Capa de patrones 1" width="32" height="16">
<data encoding="csv"> <data encoding="csv">
26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26, 26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,
26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26, 26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,183,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,
26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26, 26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,183,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,
26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26, 26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,183,0,0,0,0,0,0,0,0,0,0,0,0,0,26,
26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26, 26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,183,0,0,0,0,0,0,0,0,0,0,0,0,26,
26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26, 26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,167,66,66,66,66,187,0,0,0,0,164,65,65,0,0,0,26,
26,0,0,0,0,0,0,0,0,0,46,46,46,46,46,46,46,46,46,46,0,0,0,0,0,0,0,0,0,0,0,26, 26,0,0,0,0,0,0,0,0,0,0,0,0,0,162,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,
26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26, 26,0,0,0,0,0,0,0,0,0,0,0,0,162,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,
26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26, 26,0,0,0,0,0,0,0,0,0,0,0,162,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,
26,0,0,0,0,0,0,0,0,161,212,212,212,212,212,212,212,212,212,212,181,0,0,0,0,0,0,0,0,0,0,26, 26,0,0,0,0,0,0,0,0,161,212,212,212,212,212,212,212,0,212,212,181,0,0,0,0,0,0,0,0,0,0,26,
26,0,0,0,0,0,0,0,161,0,0,0,0,0,0,0,0,0,0,0,0,181,0,0,0,0,0,0,0,0,0,26, 26,0,0,0,0,0,0,0,161,0,0,0,0,0,0,0,0,0,0,0,0,181,0,0,0,0,0,0,0,0,0,26,
26,0,0,0,0,0,0,161,0,0,0,0,0,0,0,0,0,0,0,0,0,0,181,0,0,0,0,0,0,0,0,26, 26,0,0,0,0,0,0,161,0,0,0,0,0,0,0,0,0,269,0,0,0,0,181,0,0,0,0,0,0,0,0,26,
26,0,0,0,0,0,161,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,181,0,0,0,0,0,0,0,0, 26,0,0,0,0,0,161,0,0,0,0,0,0,0,0,0,0,269,0,0,0,0,0,181,0,0,0,0,0,0,0,0,
26,0,0,0,0,161,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,181,0,0,0,0,0,0,0, 26,0,0,0,0,161,0,0,0,0,0,0,0,0,0,0,0,289,0,0,0,0,0,0,181,0,0,0,0,0,0,0,
26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26, 26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,
26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26 26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26
</data> </data>

View File

@@ -21,11 +21,10 @@ Game::Game(SDL_Renderer *renderer, Screen *screen, Asset *asset, Input *input, D
// Crea los objetos // Crea los objetos
scoreboard = new ScoreBoard(renderer, asset, &playerLives, &itemsPicked, &clock); scoreboard = new ScoreBoard(renderer, asset, &playerLives, &itemsPicked, &clock);
itemTracker = new ItemTracker(); itemTracker = new ItemTracker();
room = new Room(asset->get(currentRoom), renderer, screen, asset, itemTracker, &itemsPicked); room = new Room(asset->get(currentRoom), renderer, screen, asset, itemTracker, &itemsPicked, debug);
player = new Player(spawnPoint, asset->get("player01.png"), asset->get("player01.ani"), renderer, asset, input, room, debug); player = new Player(spawnPoint, asset->get("player01.png"), asset->get("player01.ani"), renderer, asset, input, room, debug);
eventHandler = new SDL_Event(); eventHandler = new SDL_Event();
text = new Text(asset->get("smb2.png"), asset->get("smb2.txt"), renderer); text = new Text(asset->get("smb2.png"), asset->get("smb2.txt"), renderer);
debugText = new Text(asset->get("debug.png"), asset->get("debug.txt"), renderer);
music = JA_LoadMusic(asset->get("game.ogg").c_str()); music = JA_LoadMusic(asset->get("game.ogg").c_str());
// Inicializa el resto de variables // Inicializa el resto de variables
@@ -51,25 +50,11 @@ Game::~Game()
// Libera la memoria de los objetos // Libera la memoria de los objetos
delete scoreboard; delete scoreboard;
scoreboard = nullptr;
delete itemTracker; delete itemTracker;
itemTracker = nullptr;
delete room; delete room;
room = nullptr;
delete player; delete player;
player = nullptr;
delete eventHandler; delete eventHandler;
eventHandler = nullptr;
delete text; delete text;
text = nullptr;
delete debugText;
debugText = nullptr;
} }
// Comprueba los eventos de la cola // Comprueba los eventos de la cola
@@ -273,7 +258,7 @@ bool Game::changeRoom(std::string file)
room = nullptr; room = nullptr;
// Crea un objeto habitación nuevo a partir del fichero // Crea un objeto habitación nuevo a partir del fichero
room = new Room(asset->get(file), renderer, screen, asset, itemTracker, &itemsPicked); room = new Room(asset->get(file), renderer, screen, asset, itemTracker, &itemsPicked, debug);
// Pasa la nueva habitación al jugador // Pasa la nueva habitación al jugador
player->setRoom(room); player->setRoom(room);
@@ -331,7 +316,7 @@ void Game::killPlayer()
delete player; delete player;
// Crea la nueva habitación y el nuevo jugador // Crea la nueva habitación y el nuevo jugador
room = new Room(asset->get(currentRoom), renderer, screen, asset, itemTracker, &itemsPicked); room = new Room(asset->get(currentRoom), renderer, screen, asset, itemTracker, &itemsPicked, debug);
player = new Player(spawnPoint, asset->get("player01.png"), asset->get("player01.ani"), renderer, asset, input, room, debug); player = new Player(spawnPoint, asset->get("player01.png"), asset->get("player01.ani"), renderer, asset, input, room, debug);
} }

View File

@@ -31,17 +31,16 @@ private:
Asset *asset; // Objeto con la ruta a todos los ficheros de recursos Asset *asset; // Objeto con la ruta a todos los ficheros de recursos
Input *input; // Objeto pata gestionar la entrada Input *input; // Objeto pata gestionar la entrada
Text *text; // Objeto para los textos del juego Text *text; // Objeto para los textos del juego
Text *debugText; // Objeto para los textos de debug del juego
ScoreBoard *scoreboard; // Objeto encargado de gestionar el marcador ScoreBoard *scoreboard; // Objeto encargado de gestionar el marcador
JA_Music music; // Musica que suena durante el juego JA_Music music; // Musica que suena durante el juego
Debug *debug; Debug *debug; // Objeto para gestionar la información de debug
bool musicEnabled; // Indica si ha de sonar la musica durante el juego bool musicEnabled; // Indica si ha de sonar la musica durante el juego
int ticks; // Contador de ticks para ajustar la velocidad del programa int ticks; // Contador de ticks para ajustar la velocidad del programa
int ticksSpeed; // Velocidad a la que se repiten los bucles del programa int ticksSpeed; // Velocidad a la que se repiten los bucles del programa
section_t section; // Seccion actual dentro del juego section_t section; // Seccion actual dentro del juego
std::string currentRoom; // Fichero de la habitación actual std::string currentRoom; // Fichero de la habitación actual
player_t spawnPoint; // Lugar de la habitación donde aparece el jugador player_t spawnPoint; // Lugar de la habitación donde aparece el jugador
bool debugEnabled; // Indica si el modo debug está activo bool debugEnabled; // Indica si el modo debug está activo
int playerLives; // Lleva la cuenta de ls vidas restantes del jugador int playerLives; // Lleva la cuenta de ls vidas restantes del jugador
int itemsPicked; // Lleva la cuenta de los objetos recogidos int itemsPicked; // Lleva la cuenta de los objetos recogidos
Uint32 clock; // Cuenta el tiempo que dura la partida Uint32 clock; // Cuenta el tiempo que dura la partida

View File

@@ -242,18 +242,37 @@ void Player::move()
else else
{ {
tile_e slope = checkSlopes(); tile_e slope = checkSlopes();
debug->add("SLOPE = " + std::to_string(slope)); tile_e slope2 = checkSlopes2();
debug->add("SLOPE = " + std::to_string(slope));
debug->add("SLOPE2 = " + std::to_string(slope2));
if (slope != t_empty) if (slope != t_empty)
{ // Cuesta hacia la derecha { // Cuesta hacia la derecha
if (slope == t_slope_r) if (slope == t_slope_r)
{ // Recoloca { // Recoloca
y = -h + room->getSlopeHeight(feet[1], t_slope_r); y = -h + room->getSlopeHeight(feet[1], t_slope_r);
debug->add("feet[1] = " + std::to_string(feet[1].y));
} }
// Cuesta hacia la izquierda // Cuesta hacia la izquierda
if (slope == t_slope_l) if (slope == t_slope_l)
{ // Recoloca { // Recoloca
y = -h + room->getSlopeHeight(feet[0], t_slope_l); y = -h + room->getSlopeHeight(feet[0], t_slope_l);
debug->add("feet[0] = " + std::to_string(feet[0].y));
}
}
else if (slope2 != t_empty)
{ // Cuesta hacia la derecha
if (slope2 == t_slope_r)
{ // Recoloca
y = -h + room->getSlopeHeight(underFeet[1], t_slope_r);
debug->add("ufeet[1] = " + std::to_string(underFeet[1].y));
}
// Cuesta hacia la izquierda
if (slope2 == t_slope_l)
{ // Recoloca
y = -h + room->getSlopeHeight(underFeet[0], t_slope_l);
debug->add("ufeet[0] = " + std::to_string(underFeet[0].y));
} }
} }
} }
@@ -295,7 +314,7 @@ void Player::move()
vy = 0.0f; vy = 0.0f;
// Si ademas ha habido un cambio de tile recoloca al jugador // Si ademas ha habido un cambio de tile recoloca al jugador
if (tile_change) if (tile_change && !checkSlopes2())
{ {
y = ((int)y - ((int)y % tileSize)); y = ((int)y - ((int)y % tileSize));
} }
@@ -428,6 +447,44 @@ tile_e Player::checkSlopes()
return t_empty; return t_empty;
} }
// Comprueba si el jugador está en una rampa
tile_e Player::checkSlopes2()
{
// Actualiza los puntos de colisión
updateFeet();
bool slope_l = false;
bool slope_r = false;
bool wall = false;
bool passable = false;
// Comprueba si ha colisionado con una rampa
for (auto f : underFeet)
{
slope_l |= (room->getTile(f) == t_slope_l);
slope_r |= (room->getTile(f) == t_slope_r);
wall |= (room->getTile(f) == t_wall);
passable |= (room->getTile(f) == t_passable);
}
if (wall || passable)
{
return t_empty;
}
if (slope_l)
{
return t_slope_l;
}
if (slope_r)
{
return t_slope_r;
}
return t_empty;
}
// Obtiene algunos parametros del jugador // Obtiene algunos parametros del jugador
player_t Player::getSpawnParams() player_t Player::getSpawnParams()
{ {

View File

@@ -95,6 +95,9 @@ public:
// Comprueba si el jugador está en una rampa // Comprueba si el jugador está en una rampa
tile_e checkSlopes(); tile_e checkSlopes();
// Comprueba si el jugador está en una rampa
tile_e checkSlopes2();
// Actualiza los puntos de colisión // Actualiza los puntos de colisión
void updateColliderPoints(); void updateColliderPoints();

View File

@@ -4,7 +4,7 @@
#include <sstream> #include <sstream>
// Constructor // Constructor
Room::Room(std::string file_path, SDL_Renderer *renderer, Screen *screen, Asset *asset, ItemTracker *itemTracker, int *items) Room::Room(std::string file_path, SDL_Renderer *renderer, Screen *screen, Asset *asset, ItemTracker *itemTracker, int *items, Debug *debug)
{ {
// Copia los punteros a objetos // Copia los punteros a objetos
this->renderer = renderer; this->renderer = renderer;
@@ -12,6 +12,7 @@ Room::Room(std::string file_path, SDL_Renderer *renderer, Screen *screen, Asset
this->screen = screen; this->screen = screen;
this->itemTracker = itemTracker; this->itemTracker = itemTracker;
this->itemsPicked = items; this->itemsPicked = items;
this->debug = debug;
// Crea los objetos // Crea los objetos
load(file_path); load(file_path);
@@ -602,21 +603,25 @@ int Room::getSlopeHeight(SDL_Point p, tile_e slope)
// Calcula la base del tile // Calcula la base del tile
int base = ((p.y / tileSize) * tileSize) + tileSize; int base = ((p.y / tileSize) * tileSize) + tileSize;
printf("base %i\n", base); printf("base %i\n", base);
debug->add("BASE = " + std::to_string(base));
// Calcula cuanto se ha entrado en el tile horizontalmente // Calcula cuanto se ha entrado en el tile horizontalmente
const int pos = (p.x % tileSize); // esto da un valor entre 0 y 7 const int pos = (p.x % tileSize); // esto da un valor entre 0 y 7
printf("pos %i\n", base); printf("pos %i\n", base);
debug->add("POS = " + std::to_string(pos));
// Se resta a la base la cantidad de pixeles pos en funcion de la rampa // Se resta a la base la cantidad de pixeles pos en funcion de la rampa
if (slope == t_slope_r) if (slope == t_slope_r)
{ {
base -= pos+1; base -= pos + 1;
printf("base_R %i\n", base); printf("base_R %i\n", base);
debug->add("BASE_R = " + std::to_string(base));
} }
else else
{ {
base -= (tileSize - pos); base -= (tileSize - pos);
printf("base_L %i\n", base); printf("base_L %i\n", base);
debug->add("BASE_L = " + std::to_string(base));
} }
return base; return base;

View File

@@ -9,6 +9,7 @@
#include "item_tracker.h" #include "item_tracker.h"
#include "const.h" #include "const.h"
#include "jail_audio.h" #include "jail_audio.h"
#include "debug.h"
#include <string> #include <string>
#include <vector> #include <vector>
@@ -62,6 +63,7 @@ private:
SDL_Texture *mapTexture; // Textura para dibujar el mapa de la habitación SDL_Texture *mapTexture; // Textura para dibujar el mapa de la habitación
JA_Sound itemSound; // Sonido producido al coger un objeto JA_Sound itemSound; // Sonido producido al coger un objeto
int *itemsPicked; // Puntero a la cantidad de items recogidos que lleva el juego int *itemsPicked; // Puntero a la cantidad de items recogidos que lleva el juego
Debug *debug; // Objeto para gestionar la información de debug
int tileSize; // Ancho del tile en pixels int tileSize; // Ancho del tile en pixels
int mapWidth; // Ancho del mapa en tiles int mapWidth; // Ancho del mapa en tiles
@@ -85,7 +87,7 @@ private:
public: public:
// Constructor // Constructor
Room(std::string file_path, SDL_Renderer *renderer, Screen *screen, Asset *asset, ItemTracker *item_tracker, int *items); Room(std::string file_path, SDL_Renderer *renderer, Screen *screen, Asset *asset, ItemTracker *item_tracker, int *items, Debug *debug);
// Destructor // Destructor
~Room(); ~Room();