Super jank prototype of my idea but I am rendering multiple characters per cell to give the effect of a more complex character. Now to make this a data setup so it's easy to make characters. Also, probably have little add ons to show things like weapons equiped, etc.

main
Zed A. Shaw 2 months ago
parent 31c86fa2b3
commit 9f1e9717a0
  1. 45
      gui.cpp
  2. 3
      gui.hpp
  3. 2
      map.hpp

@ -123,6 +123,22 @@ bool GUI::handle_events() {
return event_happened;
}
sf::Sprite &GUI::get_text_sprite(wchar_t tile) {
if(!$sprites.contains(tile)) {
sf::Glyph glyph = $font.getGlyph(tile, MAP_FONT_SIZE, false);
// WARNING! we actually have to do this here because SFML caches
// the glyphs on the font texture, so this gets loaded each time
// we get a new glyph from the font.
$font_texture = $font.getTexture(MAP_FONT_SIZE);
sf::Sprite sprite($font_texture);
sprite.setTextureRect(glyph.textureRect);
$sprites[tile] = sprite;
}
return $sprites[tile];
}
void GUI::run_systems() {
auto player = $world.get<Player>();
System::enemy_pathing($world, $game_map, player);
@ -133,33 +149,39 @@ void GUI::run_systems() {
void GUI::draw_screen(bool clear, float map_off_x, float map_off_y) {
if(clear) $window.clear();
std::string screenout = $screen.ToString();
std::string map_screenout = $map_screen.ToString();
std::wstring main_screen_utf8 = $converter.from_bytes(screenout);
$ui_text.setString(main_screen_utf8);
$window.draw($ui_text);
std::string map_screenout = $map_screen.ToString();
std::wstring map_screen_utf8 = $converter.from_bytes(map_screenout);
sf::Texture ftext = $font.getTexture(MAP_FONT_SIZE);
float y = 0.0f;
float x = GAME_MAP_POS;
const float line_spacing = $font.getLineSpacing(MAP_FONT_SIZE);
sf::Glyph base_glyph = $font.getGlyph(L'', MAP_FONT_SIZE, false);
auto bg_sprite = get_text_sprite(L'');
bg_sprite.setColor(sf::Color(20,20,20));
auto add_sprite = get_text_sprite(L'!');
bool has_add = false;
for(size_t i = 0; i < map_screen_utf8.size(); i++) {
wchar_t tile = map_screen_utf8[i];
sf::Glyph glyph = $font.getGlyph(tile, MAP_FONT_SIZE, false);
sf::Sprite sprite(ftext);
sprite.setTextureRect(glyph.textureRect);
sf::Sprite &sprite = get_text_sprite(tile);
sprite.setPosition({x, y});
bg_sprite.setPosition({x, y});
if(tile == L'') {
sprite.setColor(sf::Color(100,100,100));
sprite.setColor(sf::Color(80,80,80));
} else if(tile == L'') {
sprite.setColor(sf::Color::Blue);
} else if(tile == L'Ω') {
sprite.setColor(sf::Color::Red);
} else if(tile == L'·') {
sprite.setColor(color(Value::DARK_MID));
add_sprite.setColor(sf::Color::Red);
add_sprite.setPosition({x-3,y-3});
has_add = true;
} else if(tile == L'#') {
sprite.setColor(sf::Color(5,5,5));
} else if(tile == L'\r') {
continue; // skip these, just windows junk
} else if(tile == L'\n') {
@ -171,8 +193,13 @@ void GUI::draw_screen(bool clear, float map_off_x, float map_off_y) {
sprite.setColor(color(Value::MID));
}
$window.draw(bg_sprite);
$window.draw(sprite);
x += glyph.advance;
if(has_add) {
$window.draw(add_sprite);
has_add = false;
}
x += base_glyph.advance;
}
$window.display();

@ -50,6 +50,7 @@ class GUI {
Screen $screen;
Screen $map_screen;
DinkyECS::World $world;
sf::Texture $font_texture;
std::unordered_map<wchar_t, sf::Sprite> $sprites;
public:
@ -66,7 +67,7 @@ public:
void shake();
void configure_world();
void run_systems();
sf::Sprite get_text_sprite(wchar_t tile);
sf::Sprite &get_text_sprite(wchar_t tile);
int main();
};

@ -11,7 +11,7 @@
#define WALL_VALUE 1
#define SPACE_VALUE 0
#define WALL_TILE "█"
#define FLOOR_TILE "·"
#define FLOOR_TILE "#"
#define PLAYER_TILE "☺"
#define ENEMY_TILE "Ω"

Loading…
Cancel
Save