Make triggers work
This commit is contained in:
parent
0037de691f
commit
b44ac5752d
Binary file not shown.
Binary file not shown.
15
src/cell.cpp
15
src/cell.cpp
|
@ -134,10 +134,10 @@ bool TeleportCell::onMovingTo(HeroPtr &hero, LevelPtr &level)
|
||||||
|
|
||||||
///////////////////////////////////////
|
///////////////////////////////////////
|
||||||
|
|
||||||
TriggerCell::TriggerCell(coordinate cell_x, coordinate cell_y, const std::vector<CellPtr> &cells_to_change, const sf::Color &color) :
|
TriggerCell::TriggerCell(std::vector<CellPtr> &&cells_to_change, coordinate cell_x, coordinate cell_y, const sf::Color &color) :
|
||||||
Cell(cell_x, cell_y, color)
|
Cell(cell_x, cell_y, color)
|
||||||
{
|
{
|
||||||
cells.assign(std::move(cells_to_change));
|
cells = std::move(cells_to_change);
|
||||||
}
|
}
|
||||||
|
|
||||||
TriggerCell::~TriggerCell()
|
TriggerCell::~TriggerCell()
|
||||||
|
@ -150,11 +150,14 @@ bool TriggerCell::onMovingTo(HeroPtr &hero, LevelPtr &level)
|
||||||
Map &map = level->mapArray();
|
Map &map = level->mapArray();
|
||||||
|
|
||||||
// We replace needed cells with the ones that the trigger provides.
|
// We replace needed cells with the ones that the trigger provides.
|
||||||
for (const &cell : cells)
|
for (CellPtr &cell : cells)
|
||||||
map[cell->x()][cell->y()].reset(cell.release());
|
{
|
||||||
|
const coordinate &y = cell->y();
|
||||||
|
const coordinate &x = cell->x();
|
||||||
|
|
||||||
// Trigger works only once.
|
map[x][y].release();
|
||||||
cells.clear();
|
map[x][y] = std::move(cell);
|
||||||
|
}
|
||||||
|
|
||||||
// It's an impassable object, so player can't move to here.
|
// It's an impassable object, so player can't move to here.
|
||||||
return false;
|
return false;
|
||||||
|
|
12
src/cell.h
12
src/cell.h
|
@ -1,12 +1,16 @@
|
||||||
#ifndef CELL_H
|
#ifndef CELL_H
|
||||||
#define CELL_H
|
#define CELL_H
|
||||||
|
|
||||||
#include "entity.h"
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#include <SFML/Graphics/Color.hpp>
|
#include <SFML/Graphics/Color.hpp>
|
||||||
|
|
||||||
|
#include "entity.h"
|
||||||
|
|
||||||
class Hero;
|
class Hero;
|
||||||
class Level;
|
class Level;
|
||||||
|
class Cell;
|
||||||
|
|
||||||
using HeroPtr = std::unique_ptr<Hero>;
|
using HeroPtr = std::unique_ptr<Hero>;
|
||||||
using LevelPtr = std::unique_ptr<Level>;
|
using LevelPtr = std::unique_ptr<Level>;
|
||||||
|
@ -142,9 +146,9 @@ private:
|
||||||
std::vector<CellPtr> cells;
|
std::vector<CellPtr> cells;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
TriggerCell(coordinate cell_x = 0,
|
TriggerCell(std::vector<CellPtr> &&cells_to_change,
|
||||||
coordinate cell_y = 0,
|
coordinate cell_x = 0,
|
||||||
const std::vector<CellPtr> &cells_to_change = std::vector<CellPtr>(), // Pink
|
coordinate cell_y = 0, // Pink
|
||||||
const sf::Color &color = sf::Color(255, 192, 203));
|
const sf::Color &color = sf::Color(255, 192, 203));
|
||||||
|
|
||||||
virtual ~TriggerCell() override;
|
virtual ~TriggerCell() override;
|
||||||
|
|
|
@ -171,6 +171,12 @@ void Game::loadLevel(int level_index)
|
||||||
for (coordinate y = 0; y < side; ++y)
|
for (coordinate y = 0; y < side; ++y)
|
||||||
map[x][y] = std::make_unique<WaterCell>(x, y);
|
map[x][y] = std::make_unique<WaterCell>(x, y);
|
||||||
|
|
||||||
|
std::vector<CellPtr> trigger_cells;
|
||||||
|
|
||||||
|
trigger_cells.emplace_back(std::make_unique<PassableCell>(0, 0));
|
||||||
|
trigger_cells.emplace_back(std::make_unique<PassableCell>(1, 0));
|
||||||
|
trigger_cells.emplace_back(std::make_unique<PassableCell>(0, 1));
|
||||||
|
|
||||||
switch (level_index)
|
switch (level_index)
|
||||||
{
|
{
|
||||||
case 1:
|
case 1:
|
||||||
|
@ -197,6 +203,7 @@ void Game::loadLevel(int level_index)
|
||||||
map[9][6] = std::make_unique<PassableCell>(9, 6);
|
map[9][6] = std::make_unique<PassableCell>(9, 6);
|
||||||
map[8][7] = std::make_unique<ExitCell>(8, 7);
|
map[8][7] = std::make_unique<ExitCell>(8, 7);
|
||||||
map[2][3] = std::make_unique<ChargeCell>(2, 3, 5);
|
map[2][3] = std::make_unique<ChargeCell>(2, 3, 5);
|
||||||
|
map[3][3] = std::make_unique<TriggerCell>(std::move(trigger_cells), 3, 3);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
main_window.close();
|
main_window.close();
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
#ifndef LEVEL_H
|
#ifndef LEVEL_H
|
||||||
#define LEVEL_H
|
#define LEVEL_H
|
||||||
|
|
||||||
#include "cell.h"
|
|
||||||
#include <array>
|
#include <array>
|
||||||
|
#include "cell.h"
|
||||||
|
|
||||||
constexpr coordinate side = 32;
|
constexpr coordinate side = 32;
|
||||||
|
|
||||||
using Row = std::array<std::unique_ptr<Cell>, side>;
|
using Row = std::array<CellPtr, side>;
|
||||||
using Map = std::array<Row, side>;
|
using Map = std::array<Row, side>;
|
||||||
|
|
||||||
/// Abstraction over 2D array to quickly get access to level cells
|
/// Abstraction over 2D array to quickly get access to level cells
|
||||||
|
|
Loading…
Reference in New Issue