Add height for cells
This commit is contained in:
		
							parent
							
								
									95143f5d89
								
							
						
					
					
						commit
						9c4914b16b
					
				
							
								
								
									
										22
									
								
								src/cell.cpp
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								src/cell.cpp
									
									
									
									
									
								
							@ -7,7 +7,8 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
Cell::Cell(coordinate cell_row, coordinate cell_col, const sf::Color &color) :
 | 
					Cell::Cell(coordinate cell_row, coordinate cell_col, const sf::Color &color) :
 | 
				
			||||||
    Entity(cell_row, cell_col),
 | 
					    Entity(cell_row, cell_col),
 | 
				
			||||||
    cell_color(color)
 | 
					    cell_color(color),
 | 
				
			||||||
 | 
						height_shift(0) // ground by default
 | 
				
			||||||
{}
 | 
					{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Cell::~Cell()
 | 
					Cell::~Cell()
 | 
				
			||||||
@ -18,6 +19,16 @@ sf::Color Cell::color() const noexcept
 | 
				
			|||||||
    return cell_color;
 | 
					    return cell_color;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Cell::setHeight(coordinate shift_by_y)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						height_shift = shift_by_y;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					coordinate Cell::heightShift() const
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return height_shift;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
///////////////////////////////////////
 | 
					///////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
PassableCell::PassableCell(coordinate cell_row, coordinate cell_col, const sf::Color &color) :
 | 
					PassableCell::PassableCell(coordinate cell_row, coordinate cell_col, const sf::Color &color) :
 | 
				
			||||||
@ -56,7 +67,8 @@ bool WaterCell::onMovingTo(HeroPtr &hero, LevelPtr &level)
 | 
				
			|||||||
///////////////////////////////////////
 | 
					///////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
WallCell::WallCell(coordinate cell_row, coordinate cell_col, const sf::Color &color) :
 | 
					WallCell::WallCell(coordinate cell_row, coordinate cell_col, const sf::Color &color) :
 | 
				
			||||||
    Cell(cell_row, cell_col, color)
 | 
					    Cell(cell_row, cell_col, color),
 | 
				
			||||||
 | 
						height_shift(10) // walls are a bit higher than ground and water
 | 
				
			||||||
{}
 | 
					{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
WallCell::~WallCell()
 | 
					WallCell::~WallCell()
 | 
				
			||||||
@ -74,7 +86,8 @@ bool WallCell::onMovingTo(HeroPtr &hero, LevelPtr &level)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
ChargeCell::ChargeCell(coordinate cell_row, coordinate cell_col, int has_charges, const sf::Color &color) :
 | 
					ChargeCell::ChargeCell(coordinate cell_row, coordinate cell_col, int has_charges, const sf::Color &color) :
 | 
				
			||||||
    Cell(cell_row, cell_col, color),
 | 
					    Cell(cell_row, cell_col, color),
 | 
				
			||||||
    cell_charges(has_charges)
 | 
					    cell_charges(has_charges),
 | 
				
			||||||
 | 
						height_shift(5) // charges are a bit higher than ground and water, but lower than walls
 | 
				
			||||||
{}
 | 
					{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ChargeCell::~ChargeCell()
 | 
					ChargeCell::~ChargeCell()
 | 
				
			||||||
@ -136,7 +149,8 @@ void TeleportCell::setDestination(coordinate new_cell_row, coordinate new_cell_c
 | 
				
			|||||||
///////////////////////////////////////
 | 
					///////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
TriggerCell::TriggerCell(/*std::vector<CellPtr> &&cells_to_change,*/ coordinate cell_row, coordinate cell_col, const sf::Color &color) :
 | 
					TriggerCell::TriggerCell(/*std::vector<CellPtr> &&cells_to_change,*/ coordinate cell_row, coordinate cell_col, const sf::Color &color) :
 | 
				
			||||||
    Cell(cell_row, cell_col, color)
 | 
					    Cell(cell_row, cell_col, color),
 | 
				
			||||||
 | 
						height_shift(5) // triggers are a bit higher than ground and water, but lower than walls
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    //cells = std::move(cells_to_change);
 | 
					    //cells = std::move(cells_to_change);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										20
									
								
								src/cell.h
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								src/cell.h
									
									
									
									
									
								
							@ -50,6 +50,7 @@ class Cell : public Entity
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
protected:
 | 
					protected:
 | 
				
			||||||
    sf::Color cell_color;
 | 
					    sf::Color cell_color;
 | 
				
			||||||
 | 
						coordinate height_shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
    Cell(coordinate cell_row = 0,
 | 
					    Cell(coordinate cell_row = 0,
 | 
				
			||||||
@ -60,6 +61,11 @@ public:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    sf::Color color() const noexcept;
 | 
					    sf::Color color() const noexcept;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
 | 
						/// "shift_by_y" indicates the height of current cell
 | 
				
			||||||
 | 
						/// Height is a shift of y coordinate on the scene, relatively to the ground (which is 0)
 | 
				
			||||||
 | 
						void setHeightShift(coordinate shift_by_y);
 | 
				
			||||||
 | 
						coordinate heightShift() const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /// Determine if Hero can move onto this cell or not
 | 
					    /// Determine if Hero can move onto this cell or not
 | 
				
			||||||
    virtual bool onMovingTo(HeroPtr &hero, LevelPtr &level) = 0;
 | 
					    virtual bool onMovingTo(HeroPtr &hero, LevelPtr &level) = 0;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
@ -67,7 +73,7 @@ public:
 | 
				
			|||||||
///////////////////////////////////////
 | 
					///////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// Any cell where Hero is free to move
 | 
					/// Any cell where Hero is free to move
 | 
				
			||||||
class PassableCell : public Cell
 | 
					class PassableCell final : public Cell
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
    PassableCell(coordinate cell_row = 0,
 | 
					    PassableCell(coordinate cell_row = 0,
 | 
				
			||||||
@ -82,7 +88,7 @@ public:
 | 
				
			|||||||
///////////////////////////////////////
 | 
					///////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// A cell which requires Hero to spend a charge for bridge to move on
 | 
					/// A cell which requires Hero to spend a charge for bridge to move on
 | 
				
			||||||
class WaterCell : public Cell
 | 
					class WaterCell final : public Cell
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
    WaterCell(coordinate cell_row = 0,
 | 
					    WaterCell(coordinate cell_row = 0,
 | 
				
			||||||
@ -97,7 +103,7 @@ public:
 | 
				
			|||||||
///////////////////////////////////////
 | 
					///////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// A cell which is impossible to move on
 | 
					/// A cell which is impossible to move on
 | 
				
			||||||
class WallCell : public Cell
 | 
					class WallCell final : public Cell
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
    WallCell(coordinate cell_row = 0,
 | 
					    WallCell(coordinate cell_row = 0,
 | 
				
			||||||
@ -112,7 +118,7 @@ public:
 | 
				
			|||||||
///////////////////////////////////////
 | 
					///////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// A cell which gives hero a charge
 | 
					/// A cell which gives hero a charge
 | 
				
			||||||
class ChargeCell : public Cell
 | 
					class ChargeCell final : public Cell
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
private:
 | 
					private:
 | 
				
			||||||
    int cell_charges;
 | 
					    int cell_charges;
 | 
				
			||||||
@ -131,7 +137,7 @@ public:
 | 
				
			|||||||
///////////////////////////////////////
 | 
					///////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// A cell which moves hero to next level
 | 
					/// A cell which moves hero to next level
 | 
				
			||||||
class ExitCell : public Cell
 | 
					class ExitCell final : public Cell
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
    ExitCell(coordinate cell_row = 0,
 | 
					    ExitCell(coordinate cell_row = 0,
 | 
				
			||||||
@ -146,7 +152,7 @@ public:
 | 
				
			|||||||
///////////////////////////////////////
 | 
					///////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// A cell which teleports hero to following coordinates
 | 
					/// A cell which teleports hero to following coordinates
 | 
				
			||||||
class TeleportCell : public Cell
 | 
					class TeleportCell final : public Cell
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
private:
 | 
					private:
 | 
				
			||||||
    coordinate new_row, new_col;
 | 
					    coordinate new_row, new_col;
 | 
				
			||||||
@ -168,7 +174,7 @@ public:
 | 
				
			|||||||
///////////////////////////////////////
 | 
					///////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// A cell which replaces and changes other map cells when activated
 | 
					/// A cell which replaces and changes other map cells when activated
 | 
				
			||||||
class TriggerCell : public Cell
 | 
					class TriggerCell final : public Cell
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
private:
 | 
					private:
 | 
				
			||||||
	// Vector of cells to place on map
 | 
						// Vector of cells to place on map
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										45
									
								
								src/game.cpp
									
									
									
									
									
								
							
							
						
						
									
										45
									
								
								src/game.cpp
									
									
									
									
									
								
							@ -113,7 +113,7 @@ void Game::renderMap()
 | 
				
			|||||||
    const Map &map = level->mapArray();
 | 
					    const Map &map = level->mapArray();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    float painter_x = 0, painter_y = 0;
 | 
					    float painter_x = 0, painter_y = 0;
 | 
				
			||||||
    float shift = 0;
 | 
					    float horizontal_shift = 0, vertical_shift = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Brush for cell sprites
 | 
					    // Brush for cell sprites
 | 
				
			||||||
    sf::ConvexShape convex_brush;
 | 
					    sf::ConvexShape convex_brush;
 | 
				
			||||||
@ -143,28 +143,57 @@ void Game::renderMap()
 | 
				
			|||||||
    // Draw map from 2D array
 | 
					    // Draw map from 2D array
 | 
				
			||||||
    for (coordinate x = 0; x < level->width(); ++x)
 | 
					    for (coordinate x = 0; x < level->width(); ++x)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        shift = static_cast<float>(level->width()) * cell_deviation;
 | 
					        horizontal_shift = static_cast<float>(level->width()) * cell_deviation;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        for (coordinate y = 0; y < level->height(); ++y)
 | 
					        for (coordinate y = 0; y < level->height(); ++y)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            convex_brush.setPosition(shift + painter_x, painter_y);
 | 
								vertical_shift = static_cast<float>(map[y][x]->heightShift());
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								// If cell has any height value, we should draw walls for it
 | 
				
			||||||
 | 
								if (vertical_shift > 0)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									// Brush for vertical walls
 | 
				
			||||||
 | 
									sf::ConvexShape convex_wall_brush;
 | 
				
			||||||
 | 
									convex_wall_brush.setPointCount(6);
 | 
				
			||||||
 | 
									convex_wall_brush.setPoint(0, sf::Vector2f(cell_deviation + cell_width, 0.f));
 | 
				
			||||||
 | 
									convex_wall_brush.setPoint(1, sf::Vector2f(cell_deviation + cell_width, vertical_shift));
 | 
				
			||||||
 | 
									convex_wall_brush.setPoint(2, sf::Vector2f(cell_width, cell_height + vertical_shift));
 | 
				
			||||||
 | 
									convex_wall_brush.setPoint(3, sf::Vector2f(0.f, cell_height + vertical_shift));
 | 
				
			||||||
 | 
									convex_wall_brush.setPoint(4, sf::Vector2f(0.f, cell_height));
 | 
				
			||||||
 | 
									convex_wall_brush.setPoint(5, sf::Vector2f(cell_width, cell_height));
 | 
				
			||||||
 | 
									convex_wall_brush.setOutlineThickness(0);
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
									sf::Color wall_color = convex_wall_brush.getFillColor() - sf::Color(50, 50, 50);
 | 
				
			||||||
 | 
									convex_wall_brush.setFillColor(wall_color);
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
									convex_wall_brush.setPosition(painter_x, painter_y);
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
									main_window.draw(convex_wall_brush);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								// Draw the top surface of the cell itself
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								float final_x = painter_x + horizontal_shift;
 | 
				
			||||||
 | 
								float final_y = painter_y - vertical_shift;
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
					            convex_brush.setPosition(final_x, final_y);
 | 
				
			||||||
            convex_brush.setFillColor(map[y][x]->color());
 | 
					            convex_brush.setFillColor(map[y][x]->color());
 | 
				
			||||||
			
 | 
								
 | 
				
			||||||
            main_window.draw(convex_brush);
 | 
								main_window.draw(convex_brush);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (hero_row == y && hero_col == x)
 | 
					            if (hero_row == y && hero_col == x)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                // Place the hero sprite
 | 
					                // Draw the hero sprite
 | 
				
			||||||
                convex_brush.setFillColor(palette::White);
 | 
					                convex_brush.setFillColor(palette::White);
 | 
				
			||||||
                main_window.draw(convex_brush);
 | 
					                main_window.draw(convex_brush);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            // Move painter to next cell of row
 | 
					            // Move painter to next cell of current column
 | 
				
			||||||
            painter_y += cell_height;
 | 
					            painter_y += cell_height;
 | 
				
			||||||
            shift -= cell_deviation;
 | 
					            horizontal_shift -= cell_deviation;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Move painter to next row of the map
 | 
					        // Move painter to next column
 | 
				
			||||||
        painter_y  = 0;
 | 
					        painter_y  = 0;
 | 
				
			||||||
        painter_x += cell_width;
 | 
					        painter_x += cell_width;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user