Ya se pueden pillar los items. Falta llevar el control de los iterms conseguidos

This commit is contained in:
2022-07-12 19:33:09 +02:00
parent f8db0e3a90
commit 6152dc4255
12 changed files with 140 additions and 51 deletions

View File

@@ -12,27 +12,27 @@ room1.tmx
[enemy] [enemy]
tileset=enemy01.png tileset=enemy01.png
x=8 x=1
y=0 y=0
vx=0 vx=0
vy=0.3 vy=0.3
x1=8 x1=1
x2=8
y1=0 y1=0
y2=48 x2=1
y2=6
color=red color=red
[enemy-end] [enemy-end]
[enemy] [enemy]
tileset=enemy01.png tileset=enemy01.png
x=40 x=5
y=72 y=9
vx=0.3 vx=0.6
vy=0 vy=0
x1=40 x1=5
x2=184 y1=9
y1=72 x2=22
y2=72 y2=9
color=yellow color=yellow
[enemy-end] [enemy-end]

View File

@@ -12,13 +12,20 @@ room2.tmx
[enemy] [enemy]
tileset=enemy01.png tileset=enemy01.png
x=120 x=14
y=8 y=0
vx=0 vx=0
vy=1 vy=1
x1=120 x1=14
x2=120 y1=0
y1=8 x2=14
y2=104 y2=13
color=purple color=purple
[enemy-end] [enemy-end]
[item]
tileset=items.png
tile=0
x=19
y=6
[item-end]

View File

@@ -9,7 +9,7 @@
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,
0,0,0,0,0,0,0,0,0,0,0,203,203,203,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23, 0,0,0,0,0,0,0,0,0,0,0,203,203,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,23,23,23,23,0,0,0,0,0,0,0,0,0,23, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,23,23,23,23,0,0,0,0,0,0,0,0,0,23,
23,23,23,23,23,23,0,0,0,203,0,0,0,0,0,0,0,0,0,263,0,0,0,0,203,203,0,0,0,0,0,23, 23,23,23,23,23,23,0,0,0,203,0,0,0,0,0,0,0,0,0,263,0,0,0,0,203,203,0,0,0,0,0,23,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,263,0,0,0,0,0,0,0,0,0,0,0,23, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,263,0,0,0,0,0,0,0,0,0,0,0,23,

View File

@@ -98,6 +98,7 @@ void Director::init(Uint8 name)
mInput->bindKey(INPUT_ACCEPT, SDL_SCANCODE_RETURN); mInput->bindKey(INPUT_ACCEPT, SDL_SCANCODE_RETURN);
mInput->bindKey(INPUT_CANCEL, SDL_SCANCODE_ESCAPE); mInput->bindKey(INPUT_CANCEL, SDL_SCANCODE_ESCAPE);
mInput->bindKey(INPUT_BUTTON_1, SDL_SCANCODE_SPACE); mInput->bindKey(INPUT_BUTTON_1, SDL_SCANCODE_SPACE);
mInput->bindKey(INPUT_BUTTON_2, SDL_SCANCODE_D);
mInput->bindKey(INPUT_BUTTON_PAUSE, SDL_SCANCODE_ESCAPE); mInput->bindKey(INPUT_BUTTON_PAUSE, SDL_SCANCODE_ESCAPE);
mInput->bindKey(INPUT_BUTTON_ESCAPE, SDL_SCANCODE_ESCAPE); mInput->bindKey(INPUT_BUTTON_ESCAPE, SDL_SCANCODE_ESCAPE);

View File

@@ -6,6 +6,7 @@ Game::Game(SDL_Window *window, SDL_Renderer *renderer, Asset *asset, Lang *lang,
// Inicia variables // Inicia variables
mCurrentRoom = "01.room"; mCurrentRoom = "01.room";
mSpawnPoint = {2 * 8, 12 * 8, 0, 0, 0, STATUS_STANDING, SDL_FLIP_NONE}; mSpawnPoint = {2 * 8, 12 * 8, 0, 0, 0, STATUS_STANDING, SDL_FLIP_NONE};
mDebug = false;
// Copia los punteros // Copia los punteros
mRenderer = renderer; mRenderer = renderer;
@@ -122,6 +123,7 @@ void Game::update()
checkPlayerAndWalls(); // Debe ir detras del player update, por si se ha metido en algun muro checkPlayerAndWalls(); // Debe ir detras del player update, por si se ha metido en algun muro
checkPlayerOnBorder(); checkPlayerOnBorder();
checkPlayerOnFloor(); checkPlayerOnFloor();
checkPlayerAndItems();
if (checkPlayerAndEnemies()) if (checkPlayerAndEnemies())
{ {
// Destruye la habitacion y el jugador // Destruye la habitacion y el jugador
@@ -132,6 +134,8 @@ void Game::update()
mRoom = new Room(mAsset->get(mCurrentRoom), mRenderer, mAsset); mRoom = new Room(mAsset->get(mCurrentRoom), mRenderer, mAsset);
mPlayer = new Player(mSpawnPoint, mAsset->get("player01.png"), mRenderer, mAsset, mInput, mRoom); mPlayer = new Player(mSpawnPoint, mAsset->get("player01.png"), mRenderer, mAsset, mInput, mRoom);
} }
checkInput();
} }
} }
@@ -156,43 +160,50 @@ void Game::draw()
mText->writeCentered(GAMECANVAS_CENTER_X, 16 * 8, mRoom->getName()); mText->writeCentered(GAMECANVAS_CENTER_X, 16 * 8, mRoom->getName());
// Debug info // Debug info
std::string text; if (mDebug)
text = "status: " + std::to_string(mPlayer->status); {
mText->write(0, 17 * 8, text); std::string text;
text = "status: " + std::to_string(mPlayer->status);
mText->write(0, 17 * 8, text);
text = "foot: " + std::to_string((int)mPlayer->getLeftFoot().y); text = "foot: " + std::to_string((int)mPlayer->getLeftFoot().y);
mText->write(0, 18 * 8, text); mText->write(0, 18 * 8, text);
const int a = (mPlayer->lastPosition.y + 16) / 8; const int a = (mPlayer->lastPosition.y + 16) / 8;
const int b = mPlayer->getLeftFoot().y / 8; const int b = mPlayer->getLeftFoot().y / 8;
text = "tile: " + std::to_string(a) + " - " + std::to_string(b); text = "tile: " + std::to_string(a) + " - " + std::to_string(b);
mText->write(0, 19 * 8, text); mText->write(0, 19 * 8, text);
const bool collision = checkPlayerAndEnemies(); const bool collision = checkPlayerAndEnemies();
text = "collision: " + std::to_string(collision); text = "collision: " + std::to_string(collision);
mText->write(0, 20 * 8, text); mText->write(0, 20 * 8, text);
}
// Actualiza la pantalla // Actualiza la pantalla
mScreen->blit(); mScreen->blit();
} }
// Comprueba la entrada // Comprueba la entrada
/*
void Game::checkInput() void Game::checkInput()
{ {
if (mInput->checkInput(INPUT_UP, REPEAT_FALSE)) /*
changeRoom(mRoom->getRoomUp()); if (mInput->checkInput(INPUT_UP, REPEAT_FALSE))
changeRoom(mRoom->getRoomUp());
if (mInput->checkInput(INPUT_DOWN, REPEAT_FALSE)) if (mInput->checkInput(INPUT_DOWN, REPEAT_FALSE))
changeRoom(mRoom->getRoomDown()); changeRoom(mRoom->getRoomDown());
if (mInput->checkInput(INPUT_LEFT, REPEAT_FALSE)) if (mInput->checkInput(INPUT_LEFT, REPEAT_FALSE))
changeRoom(mRoom->getRoomLeft()); changeRoom(mRoom->getRoomLeft());
if (mInput->checkInput(INPUT_RIGHT, REPEAT_FALSE)) if (mInput->checkInput(INPUT_RIGHT, REPEAT_FALSE))
changeRoom(mRoom->getRoomRight()); changeRoom(mRoom->getRoomRight());
*/
if (mInput->checkInput(INPUT_BUTTON_2, REPEAT_FALSE))
mDebug = !mDebug;
} }
*/
// Cambia de habitación // Cambia de habitación
bool Game::changeRoom(std::string file) bool Game::changeRoom(std::string file)
@@ -246,7 +257,7 @@ void Game::checkPlayerOnFloor()
// En este caso habría que recolocar al jugador en el sitio // En este caso habría que recolocar al jugador en el sitio
// *** PARECE RESUELTO // *** PARECE RESUELTO
const int a = (mPlayer->lastPosition.y + 16) / 8; const int a = (mPlayer->lastPosition.y + 16) / 8;
const int b = mPlayer->getLeftFoot().y / 8; const int b = mPlayer->getLeftFoot().y / 8;
const bool tile_change = a != b; const bool tile_change = a != b;
@@ -318,4 +329,10 @@ void Game::checkPlayerAndWalls()
bool Game::checkPlayerAndEnemies() bool Game::checkPlayerAndEnemies()
{ {
return mRoom->enemyCollision(mPlayer->getCollider()); return mRoom->enemyCollision(mPlayer->getCollider());
}
// Comprueba las colisiones del jugador con los objetos
void Game::checkPlayerAndItems()
{
mRoom->itemCollision(mPlayer->getCollider());
} }

View File

@@ -39,7 +39,8 @@ private:
section_t mSection; // Seccion actual dentro del juego section_t mSection; // Seccion actual dentro del juego
std::string mCurrentRoom; // Fichero de la habitación actual std::string mCurrentRoom; // Fichero de la habitación actual
player_t mSpawnPoint; // Lugar de la habitación donde aparece el jugador player_t mSpawnPoint; // Lugar de la habitación donde aparece el jugador
bool mDebug; // Indica si el modo debug está activo
// Inicializa las variables // Inicializa las variables
void init(); void init();
@@ -53,7 +54,7 @@ private:
void draw(); void draw();
// Comprueba la entrada y actua // Comprueba la entrada y actua
// void checkInput(); void checkInput();
// Cambia de habitación // Cambia de habitación
bool changeRoom(std::string file); bool changeRoom(std::string file);
@@ -70,6 +71,9 @@ private:
// Comprueba las colisiones del jugador con los enemigos // Comprueba las colisiones del jugador con los enemigos
bool checkPlayerAndEnemies(); bool checkPlayerAndEnemies();
// Comprueba las colisiones del jugador con los objetos
void checkPlayerAndItems();
public: public:
// Constructor // Constructor
Game(SDL_Window *window, SDL_Renderer *renderer, Asset *asset, Lang *lang, Input *input); Game(SDL_Window *window, SDL_Renderer *renderer, Asset *asset, Lang *lang, Input *input);

View File

@@ -18,6 +18,7 @@ Item::Item(item_t item)
// Inicia variables // Inicia variables
sprite->setSpriteClip(item.tile * 8, 0, 8, 8); sprite->setSpriteClip(item.tile * 8, 0, 8, 8);
collider = sprite->getRect();
// Inicializa los colores // Inicializa los colores
color_t c = stringToColor("blue"); color_t c = stringToColor("blue");
@@ -50,13 +51,29 @@ Item::~Item()
sprite = nullptr; sprite = nullptr;
} }
// Pinta el enemigo en pantalla // Pinta el objeto en pantalla
void Item::draw() void Item::draw()
{ {
const int index = (counter / 2) % color.size();
sprite->getTexture()->setColor(color[index].r, color[index].g, color[index].b);
sprite->render(); sprite->render();
sprite->getTexture()->setColor(255, 255, 255);
} }
// Actualiza las variables del objeto // Actualiza las variables del objeto
void Item::update() void Item::update()
{ {
counter++;
} }
// Coge el objeto
void Item::pick()
{
sprite->setEnabled(false);
}
// Obtiene el rectangulo de colision del objeto
SDL_Rect &Item::getCollider()
{
return collider;
}

View File

@@ -34,6 +34,8 @@ private:
SDL_Renderer *renderer; // El renderizador de la ventana SDL_Renderer *renderer; // El renderizador de la ventana
Asset *asset; // Objeto con la ruta a todos los ficheros de recursos Asset *asset; // Objeto con la ruta a todos los ficheros de recursos
std::vector<color_t> color; // Vector con los colores del objeto std::vector<color_t> color; // Vector con los colores del objeto
int counter; // Contador interno
SDL_Rect collider; // Rectangulo de colisión
// Comprueba si ha llegado al limite del recorrido para darse media vuelta // Comprueba si ha llegado al limite del recorrido para darse media vuelta
void checkPath(); void checkPath();
@@ -50,6 +52,12 @@ public:
// Actualiza las variables del objeto // Actualiza las variables del objeto
void update(); void update();
// Coge el item
void pick();
// Obtiene el rectangulo de colision del objeto
SDL_Rect &getCollider();
}; };
#endif #endif

View File

@@ -259,11 +259,11 @@ bool Room::setEnemy(enemy_t *enemy, std::string _var, std::string _value)
} }
else if (_var == "x") else if (_var == "x")
{ {
enemy->x = std::stof(_value); enemy->x = std::stof(_value) * BLOCK;
} }
else if (_var == "y") else if (_var == "y")
{ {
enemy->y = std::stof(_value); enemy->y = std::stof(_value) * BLOCK;
} }
else if (_var == "vx") else if (_var == "vx")
{ {
@@ -275,19 +275,19 @@ bool Room::setEnemy(enemy_t *enemy, std::string _var, std::string _value)
} }
else if (_var == "x1") else if (_var == "x1")
{ {
enemy->x1 = std::stoi(_value); enemy->x1 = std::stoi(_value) * BLOCK;
} }
else if (_var == "x2") else if (_var == "x2")
{ {
enemy->x2 = std::stoi(_value); enemy->x2 = std::stoi(_value) * BLOCK;
} }
else if (_var == "y1") else if (_var == "y1")
{ {
enemy->y1 = std::stoi(_value); enemy->y1 = std::stoi(_value) * BLOCK;
} }
else if (_var == "y2") else if (_var == "y2")
{ {
enemy->y2 = std::stoi(_value); enemy->y2 = std::stoi(_value) * BLOCK;
} }
else if (_var == "color") else if (_var == "color")
{ {
@@ -407,6 +407,11 @@ void Room::update()
{ {
enemy->update(); enemy->update();
} }
for (auto item : item_list)
{
item->update();
}
} }
// Devuelve la cadena del fichero de la habitación contigua segun el borde // Devuelve la cadena del fichero de la habitación contigua segun el borde
@@ -470,5 +475,22 @@ bool Room::enemyCollision(SDL_Rect &rect)
collision |= checkCollision(rect, enemy->getCollider()); collision |= checkCollision(rect, enemy->getCollider());
} }
return collision;
}
// Indica si hay colision con un objeto a partir de un rectangulo
bool Room::itemCollision(SDL_Rect &rect)
{
bool collision = false;
for (auto item : item_list)
{
collision |= checkCollision(rect, item->getCollider());
if (collision)
{
item->pick();
}
}
return collision; return collision;
} }

View File

@@ -96,6 +96,9 @@ public:
// Indica si hay colision con un enemigo a partir de un rectangulo // Indica si hay colision con un enemigo a partir de un rectangulo
bool enemyCollision(SDL_Rect &rect); bool enemyCollision(SDL_Rect &rect);
// Indica si hay colision con un objeto a partir de un rectangulo
bool itemCollision(SDL_Rect &rect);
}; };
#endif #endif

View File

@@ -160,4 +160,11 @@ void Sprite::setEnabled(bool value)
bool Sprite::isEnabled() bool Sprite::isEnabled()
{ {
return mEnabled; return mEnabled;
}
// Devuelve el rectangulo donde está el sprite
SDL_Rect Sprite::getRect()
{
SDL_Rect rect = {getPosX(), getPosY(), getWidth(), getHeight()};
return rect;
} }

View File

@@ -78,6 +78,9 @@ public:
// Comprueba si el objeto está habilitado // Comprueba si el objeto está habilitado
bool isEnabled(); bool isEnabled();
// Devuelve el rectangulo donde está el sprite
SDL_Rect getRect();
}; };
#endif #endif