added tileset fonts back in

This commit is contained in:
Squishy Bloob 2024-03-31 01:56:47 +00:00
parent 55204a5d0a
commit 4f584174a6
5 changed files with 65 additions and 29 deletions

View File

@ -3,11 +3,16 @@
#include <string> #include <string>
#include <vector> #include <vector>
#include "image.h" #include "image.h"
#include "resource_manager.h"
#include "vec2.h" #include "vec2.h"
struct tileset { struct font;
struct tileset : resource {
friend struct font;
tileset(image const* image, vec2i tile_size); tileset(image const* image, vec2i tile_size);
//tileset(std::string path, vec2i tile_size); //tileset(std::string path, vec2i tile_size);
tileset(resource_manager& rm, ini_category const* ini, std::string const& path, std::vector<uint8_t> const& data);
image& operator[](int index); image& operator[](int index);

View File

@ -1,35 +1,41 @@
#include "font.h" #include "font.h"
#include "image.h" #include "image.h"
#include "tileset.h"
font::font(resource_manager& rm, ini_category const* ini, std::string const& path, std::vector<uint8_t> const& data) { font::font(resource_manager& rm, ini_category const* ini, std::string const& path, std::vector<uint8_t> const& data) {
if(!ini) if(!ini)
throw std::runtime_error("font needs assets.ini"); throw std::runtime_error("font needs assets.ini");
if(!ini->get<bool>("proportional")) if(ini->get<bool>("proportional")) {
throw std::runtime_error("not yet implemented"); auto image = rm.get<::image>(path);
auto x = 0;
std::vector<int> slices;
for(int i = 0; i < image->size().x; ++i) {
if(image->get(vec2i(i, 0)) & 0xff000000)
slices.push_back(i);
}
int count = slices.size();
slices.push_back(image->size().x);
_lineheight = image->size().y - 1;
auto charset = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_'abcdefghijklmnopqrstuvwxyz{|}~";
auto image = rm.get<::image>(path); for(int i = 0; i < count; ++i) {
auto x = 0; auto r = recti(vec2i(slices[i], 1), vec2i(slices[i + 1] - slices[i], _lineheight));
std::vector<int> slices; //auto img = ::image(r.size);
for(int i = 0; i < image->size().x; ++i) { auto ch = charset[i];
if(image->get(vec2i(i, 0)) & 0xff000000) _glyphs.emplace(ch, r.size);
slices.push_back(i); _glyphs.at(ch).clear(0);
_glyphs.at(ch).draw(image, vec2i::zero, r);
}
} else {
int width = ini->get<int>("width");
int height = ini->get<int>("height");
auto ts = rm.get<tileset>(path);
_lineheight = ts->_tile_size.y;
for(int i = 0; i < 256; ++i) {
_glyphs.insert({ i, ts->_tiles[i] });
}
} }
int count = slices.size();
slices.push_back(image->size().x);
_lineheight = image->size().y - 1;
auto charset = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_'abcdefghijklmnopqrstuvwxyz{|}~";
for(int i = 0; i < count; ++i) {
auto r = recti(vec2i(slices[i], 1), vec2i(slices[i + 1] - slices[i], _lineheight));
//auto img = ::image(r.size);
auto ch = charset[i];
_glyphs.emplace(ch, r.size);
_glyphs.at(ch).clear(0);
_glyphs.at(ch).draw(image, vec2i::zero, r);
}
} }
image const* font::get(char ch) const { image const* font::get(char ch) const {

View File

@ -1,4 +1,5 @@
#include "tileset.h" #include "tileset.h"
#include "image.h"
tileset::tileset(image const* image, vec2i tile_size) { tileset::tileset(image const* image, vec2i tile_size) {
auto tile_count = image->size() / tile_size; auto tile_count = image->size() / tile_size;
@ -11,6 +12,21 @@ tileset::tileset(image const* image, vec2i tile_size) {
} }
} }
} }
tileset::tileset(resource_manager& rm, ini_category const* ini, std::string const& path, std::vector<uint8_t> const& data) {
auto tile_size = vec2i(ini->get<int>("tile_width"), ini->get<int>("tile_height"));
_tile_size = tile_size;
auto image = rm.get<::image>(path);
auto tile_count = image->size() / tile_size;
for(int y = 0; y < tile_count.y; ++y) {
for(int x = 0; x < tile_count.x; ++x) {
auto tile = ::image(tile_size);
tile.clear(0);
tile.draw(image, vec2i::zero, recti(tile_size * vec2i(x, y), tile_size));
_tiles.push_back(tile);
}
}
}
/* /*
tileset::tileset(std::string path, vec2i tile_size) : tileset::tileset(std::string path, vec2i tile_size) :
tileset(new image(path), tile_size) tileset(new image(path), tile_size)

View File

@ -1,3 +1,7 @@
[habbo.png] [habbo.png]
proportional = true proportional = true
[font.png]
proportional = false
tile_width = 8
tile_height = 14

View File

@ -12,22 +12,24 @@ struct my_game : game {
//tileset tileset; //tileset tileset;
font const* font; font const* font1;
font const* font2;
double time; double time;
}; };
void my_game::init(settings& settings) { void my_game::init(settings& settings) {
settings.target_fps = 6000; settings.target_fps = 6000;
time = 0.0; time = 0.0;
settings.scale = 3; settings.scale = 1;
settings.size = vec2i(1920/3, 1080/3); settings.size = vec2i(1920, 1080);
//img = get<image>("test.png"); //img = get<image>("test.png");
//slime = get<image>("slime.png"); //slime = get<image>("slime.png");
//slime = slime->upscale_2x(); //slime = slime->upscale_2x();
//slime = slime->upscale_2x(); //slime = slime->upscale_2x();
//slime = slime->upscale_2x(); //slime = slime->upscale_2x();
//ini = get<::ini>("test.ini"); //ini = get<::ini>("test.ini");
font = get<::font>("_/default-font-prop.png"); font1 = get<::font>("_/default-font-prop.png");
font2 = get<::font>("font.png");
//cursor(&font['\\']); //cursor(&font['\\']);
} }
@ -47,7 +49,10 @@ void my_game::render(image& target) {
//target.draw(tileset[0xda], vec2i(320, 180) + pos, 0xff00ff); //target.draw(tileset[0xda], vec2i(320, 180) + pos, 0xff00ff);
auto str = "Can only be played if\nthere are no card in\nyour draw pile.\nDeal 50 damage to ALL\nenemies."; auto str = "Can only be played if\nthere are no card in\nyour draw pile.\nDeal 50 damage to ALL\nenemies.";
//target.draw(str, vec2i(100, 100) + pos, font, 0xffffff, 0); //target.draw(str, vec2i(100, 100) + pos, font, 0xffffff, 0);
target.draw(std::format("FPS: {}", fps()), vec2i(10, 10), font, 0xffffff, 0); target.draw(std::format("FPS: {}", fps()), vec2i(10, 10), font1, 0xffffff, 0);
for(int i = 0; i < 64; ++i)
target.draw("C-4", vec2i(100, i * 14), font2, 0xffffff, 0);
//target.draw("\\", mouse_pos(), font, 0xffffff, 0); //target.draw("\\", mouse_pos(), font, 0xffffff, 0);
} }