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.
This commit is contained in:
parent
31c86fa2b3
commit
9f1e9717a0
3 changed files with 39 additions and 11 deletions
45
gui.cpp
45
gui.cpp
|
@ -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();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue