Started the overlay UI but need to make it possible to add/remove components to it.

master
Zed A. Shaw 3 weeks ago
parent 59d10a4506
commit 70a9420c11
  1. 2
      combat_ui.hpp
  2. 12
      guecs.cpp
  3. 14
      guecs.hpp
  4. 37
      gui.cpp
  5. 5
      gui.hpp
  6. 1
      meson.build
  7. 36
      overlay_ui.cpp
  8. 27
      overlay_ui.hpp

@ -1,5 +1,4 @@
#pragma once #pragma once
#include "panel.hpp"
#include "levelmanager.hpp" #include "levelmanager.hpp"
#include <SFML/Graphics/RenderWindow.hpp> #include <SFML/Graphics/RenderWindow.hpp>
#include <SFML/Graphics/Font.hpp> #include <SFML/Graphics/Font.hpp>
@ -17,7 +16,6 @@ namespace gui {
void render(TexturePack& texture); void render(TexturePack& texture);
void draw(sf::RenderWindow& window); void draw(sf::RenderWindow& window);
void update_level(GameLevel &level) { $level = level; } void update_level(GameLevel &level) { $level = level; }
void click(int x, int y);
void set_damage(float percent); void set_damage(float percent);
}; };
} }

@ -51,17 +51,7 @@ namespace guecs {
}); });
$world.query<lel::Cell, Sprite>([&](auto, auto &cell, auto &sprite) { $world.query<lel::Cell, Sprite>([&](auto, auto &cell, auto &sprite) {
auto sprite_texture = textures.get(sprite.name); sprite.init(cell, textures);
sprite.texture = sprite_texture.texture;
sprite.sprite = make_shared<sf::Sprite>(*sprite.texture);
sprite.sprite->setPosition({
float(cell.x + GUECS_PADDING),
float(cell.y + GUECS_PADDING)});
auto size = sprite.texture->getSize();
sprite.sprite->setScale({
float(cell.w - GUECS_PADDING * 2) / size.x,
float(cell.h - GUECS_PADDING * 2) / size.y});
}); });
} }

@ -56,6 +56,20 @@ namespace guecs {
std::string name; std::string name;
std::shared_ptr<sf::Sprite> sprite = nullptr; std::shared_ptr<sf::Sprite> sprite = nullptr;
std::shared_ptr<sf::Texture> texture = nullptr; std::shared_ptr<sf::Texture> texture = nullptr;
void init(lel::Cell &cell, TexturePack &textures) {
auto sprite_texture = textures.get(name);
texture = sprite_texture.texture;
sprite = make_shared<sf::Sprite>(*texture);
sprite->setPosition({
float(cell.x + GUECS_PADDING),
float(cell.y + GUECS_PADDING)});
auto size = texture->getSize();
sprite->setScale({
float(cell.w - GUECS_PADDING * 2) / size.x,
float(cell.h - GUECS_PADDING * 2) / size.y});
}
}; };
struct Rectangle { struct Rectangle {

@ -18,6 +18,7 @@ namespace gui {
$map_view($level), $map_view($level),
$combat_view($level), $combat_view($level),
$status_view($level), $status_view($level),
$overlay_view($level),
$font{FONT_FILE_NAME}, $font{FONT_FILE_NAME},
$text{$font}, $text{$font},
$rayview($textures, RAY_VIEW_WIDTH, RAY_VIEW_HEIGHT) $rayview($textures, RAY_VIEW_WIDTH, RAY_VIEW_HEIGHT)
@ -53,7 +54,7 @@ namespace gui {
$rayview.position_camera($player.x + 0.5, $player.y + 0.5); $rayview.position_camera($player.x + 0.5, $player.y + 0.5);
$combat_view.render($textures); $combat_view.render($textures);
$overlay_view.render($textures);
$status_view.render($textures); $status_view.render($textures);
$status_view.log("Welcome to the game!"); $status_view.log("Welcome to the game!");
@ -94,17 +95,11 @@ namespace gui {
void FSM::ATTACKING(Event ev) { void FSM::ATTACKING(Event ev) {
using enum Event; using enum Event;
switch(ev) { switch(ev) {
case TICK: case TICK: {
$rotation_count++; System::combat($level);
run_systems();
// just do 10 ticks state(State::IN_COMBAT);
if($rotation_count % 10 == 0) { } break;
System::combat($level);
run_systems();
$rotation = -10.0f;
state(State::IN_COMBAT);
}
break;
case STOP_COMBAT: case STOP_COMBAT:
dbc::log("Exiting ATTACKING STATE"); dbc::log("Exiting ATTACKING STATE");
state(State::IDLE); state(State::IDLE);
@ -186,7 +181,6 @@ namespace gui {
switch(ev) { switch(ev) {
case ATTACK: case ATTACK:
$status_view.log("You attack!"); $status_view.log("You attack!");
$rotation = -30.0f;
state(State::ATTACKING); state(State::ATTACKING);
break; break;
case ROTATE_LEFT: case ROTATE_LEFT:
@ -281,14 +275,6 @@ namespace gui {
$combat_view.set_damage(float(player_combat.hp) / float(player_combat.max_hp)); $combat_view.set_damage(float(player_combat.hp) / float(player_combat.max_hp));
} }
void FSM::draw_weapon() {
return;
auto weapon = $rayview.$textures.sword.sprite;
weapon->setPosition({SCREEN_WIDTH/2, SCREEN_HEIGHT/2});
weapon->setRotation(sf::degrees($rotation));
$window.draw(*weapon);
}
void FSM::draw_stats() { void FSM::draw_stats() {
auto player = $level.world->get_the<Player>(); auto player = $level.world->get_the<Player>();
auto player_combat = $level.world->get<Combat>(player.entity); auto player_combat = $level.world->get<Combat>(player.entity);
@ -316,16 +302,15 @@ namespace gui {
auto player_combat = $level.world->get<Combat>(player.entity); auto player_combat = $level.world->get<Combat>(player.entity);
if(float(player_combat.hp) / float(player_combat.max_hp) < 0.5) { if(float(player_combat.hp) / float(player_combat.max_hp) < 0.5) {
auto blood = $textures.sprite_textures.at("blood_splatter").sprite; $overlay_view.set<guecs::Sprite>("middle", {"blood_splatter"});
blood->setPosition({RAY_VIEW_X,0}); $overlay_view.$gui.init($textures);
blood->setScale({3.0, 3.0});
$window.draw(*blood);
} }
} }
void FSM::draw_gui() { void FSM::draw_gui() {
$status_view.draw($window); $status_view.draw($window);
$combat_view.draw($window); $combat_view.draw($window);
$overlay_view.draw($window);
auto debug = $level.world->get_the<Debug>(); auto debug = $level.world->get_the<Debug>();
if(debug.FPS) draw_stats(); if(debug.FPS) draw_stats();
@ -345,7 +330,6 @@ namespace gui {
draw_gui(); draw_gui();
draw_blood(); draw_blood();
draw_weapon();
} }
$window.display(); $window.display();
@ -420,7 +404,6 @@ namespace gui {
} }
break; break;
case eGUI::ATTACK: case eGUI::ATTACK:
$rotation = 0;
event(Event::ATTACK); event(Event::ATTACK);
break; break;
case eGUI::DEATH: { case eGUI::DEATH: {

@ -9,6 +9,7 @@
#include "map_view.hpp" #include "map_view.hpp"
#include "combat_ui.hpp" #include "combat_ui.hpp"
#include "status_ui.hpp" #include "status_ui.hpp"
#include "overlay_ui.hpp"
namespace gui { namespace gui {
enum class State { enum class State {
@ -43,8 +44,6 @@ namespace gui {
class FSM : public DeadSimpleFSM<State, Event> { class FSM : public DeadSimpleFSM<State, Event> {
public: public:
// ZED: these two will go away soon // ZED: these two will go away soon
int $rotation_count = 0;
float $rotation = -10.0f;
bool $draw_stats = false; bool $draw_stats = false;
Point $player{0,0}; Point $player{0,0};
LevelManager $levels; LevelManager $levels;
@ -54,6 +53,7 @@ namespace gui {
MapViewUI $map_view; MapViewUI $map_view;
CombatUI $combat_view; CombatUI $combat_view;
StatusUI $status_view; StatusUI $status_view;
OverlayUI $overlay_view;
CameraLOL $camera; CameraLOL $camera;
sf::Font $font; sf::Font $font;
sf::Text $text; sf::Text $text;
@ -77,7 +77,6 @@ namespace gui {
void try_move(int dir, bool strafe); void try_move(int dir, bool strafe);
void keyboard(); void keyboard();
void draw_weapon();
void draw_stats(); void draw_stats();
void draw_gui(); void draw_gui();
void draw_blood(); void draw_blood();

@ -71,6 +71,7 @@ sources = [
'map_view.cpp', 'map_view.cpp',
'matrix.cpp', 'matrix.cpp',
'matrix.cpp', 'matrix.cpp',
'overlay_ui.cpp',
'panel.cpp', 'panel.cpp',
'pathing.cpp', 'pathing.cpp',
'rand.cpp', 'rand.cpp',

@ -0,0 +1,36 @@
#include "overlay_ui.hpp"
#include "constants.hpp"
#include "color.hpp"
#include "events.hpp"
namespace gui {
using namespace guecs;
OverlayUI::OverlayUI(GameLevel level) :
$level(level)
{
$gui.position(RAY_VIEW_X, RAY_VIEW_Y, RAY_VIEW_WIDTH, RAY_VIEW_HEIGHT);
$gui.layout(
"[top_left|top|top_right]"
"[*%(300,300)middle|_|_]"
"[_|_|_]"
"[_|_|_]"
"[bottom_left|bottom|bottom_right]"
);
}
void OverlayUI::render(TexturePack &textures) {
auto &world = $gui.world();
for(auto &[name, cell] : $gui.cells()) {
auto region = $gui.entity(name);
$name_ents.insert_or_assign(name, region);
world.set<lel::Cell>(region, cell);
}
$gui.init(textures);
}
void OverlayUI::draw(sf::RenderWindow& window) {
$gui.render(window);
}
}

@ -0,0 +1,27 @@
#pragma once
#include "levelmanager.hpp"
#include <SFML/Graphics/RenderWindow.hpp>
#include <SFML/Graphics/Font.hpp>
#include "guecs.hpp"
namespace gui {
class OverlayUI {
public:
guecs::UI $gui;
GameLevel $level;
std::unordered_map<std::string, DinkyECS::Entity> $name_ents;
OverlayUI(GameLevel level);
void render(TexturePack& texture);
void draw(sf::RenderWindow& window);
void click(int x, int y);
template <typename Comp>
// this should be in the GUECS really
void set(std::string name, Comp val) {
auto ent = $name_ents.at(name);
$level.world->set<Comp>(ent, val);
}
};
}
Loading…
Cancel
Save