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 10 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