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

@ -51,17 +51,7 @@ namespace guecs {
});
$world.query<lel::Cell, Sprite>([&](auto, auto &cell, auto &sprite) {
auto sprite_texture = textures.get(sprite.name);
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});
sprite.init(cell, textures);
});
}

@ -56,6 +56,20 @@ namespace guecs {
std::string name;
std::shared_ptr<sf::Sprite> sprite = 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 {

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

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

@ -71,6 +71,7 @@ sources = [
'map_view.cpp',
'matrix.cpp',
'matrix.cpp',
'overlay_ui.cpp',
'panel.cpp',
'pathing.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