- [NEW] Generació i pintat del mapa de totes les habitacions
This commit is contained in:
@@ -8,7 +8,7 @@ bool loop();
|
||||
|
||||
void game::init()
|
||||
{
|
||||
draw::init("DILEMMAKER v0.1", 320, 240, 3, false);
|
||||
draw::init("DILEMMAKER v0.1", 640, 480, 1, false);
|
||||
game::setState(loop);
|
||||
enemies::load();
|
||||
rooms::load();
|
||||
@@ -17,8 +17,8 @@ void game::init()
|
||||
|
||||
bool loop()
|
||||
{
|
||||
draw::setViewport(32, 24, 256, 128);
|
||||
rooms::draw();
|
||||
draw::cls(0);
|
||||
rooms::drawFullMap();
|
||||
draw::render();
|
||||
return true;
|
||||
}
|
||||
|
||||
101
source/rooms.cpp
101
source/rooms.cpp
@@ -17,6 +17,7 @@ namespace rooms
|
||||
int num_total_rooms = 0;
|
||||
std::string current_room = "";
|
||||
std::map<std::string, room_t> rooms;
|
||||
int full_map_x = 0, full_map_y = 0;
|
||||
|
||||
static const char *paletteMap[] = {
|
||||
"black", "bright_black", "blue", "bright_blue",
|
||||
@@ -51,13 +52,13 @@ namespace rooms
|
||||
} else if (key == "tileSetFile") {
|
||||
room.tileSetFile = images::getImage("tilesets/"+value);
|
||||
} else if (key == "roomUp") {
|
||||
room.roomUp = value;
|
||||
room.roomUp = value.substr(0, value.find_last_of('.'));;
|
||||
} else if (key == "roomDown") {
|
||||
room.roomDown = value;
|
||||
room.roomDown = value.substr(0, value.find_last_of('.'));;
|
||||
} else if (key == "roomLeft") {
|
||||
room.roomLeft = value;
|
||||
room.roomLeft = value.substr(0, value.find_last_of('.'));;
|
||||
} else if (key == "roomRight") {
|
||||
room.roomRight = value;
|
||||
room.roomRight = value.substr(0, value.find_last_of('.'));;
|
||||
} else if (key == "itemColor1") {
|
||||
room.itemColor1 = colorToNum(value);
|
||||
} else if (key == "itemColor2") {
|
||||
@@ -65,7 +66,7 @@ namespace rooms
|
||||
}
|
||||
} else if (section == "enemy") {
|
||||
if (key == "animation") {
|
||||
room.enemies.back().animation = value.substr(0, value.find_last_of('.'));;
|
||||
room.enemies.back().animation = value.substr(0, value.find_last_of('.'));
|
||||
} else if (key == "x") {
|
||||
room.enemies.back().x = std::stoi(value);
|
||||
} else if (key == "y") {
|
||||
@@ -197,6 +198,62 @@ namespace rooms
|
||||
}
|
||||
}
|
||||
|
||||
void generateThumbnail(fs::path filename)
|
||||
{
|
||||
std::string room_name = filename.stem().string();
|
||||
room_t &room = rooms[room_name];
|
||||
|
||||
// Primer generem un pixel per a cada tile del gif de tiles
|
||||
draw::surface *tiles = room.tileSetFile;
|
||||
uint8_t pixels[tiles->w/8][tiles->h/8];
|
||||
for (int ty=0; ty<tiles->h/8; ty++) {
|
||||
for (int tx=0; tx<tiles->w/8; tx++) {
|
||||
uint8_t count[16] {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
|
||||
for (int y=0;y<8;++y)
|
||||
for (int x=0;x<8;x++) {
|
||||
count[tiles->pixels[(x+tx*8)+(y+ty*8)*tiles->w]]++;
|
||||
}
|
||||
uint8_t max_count=0;
|
||||
uint8_t max_index=0;
|
||||
for (int i=0; i<16; ++i) if (count[i] > max_count) {max_count=count[i]; max_index=i;}
|
||||
pixels[tx][ty] = max_index;
|
||||
}
|
||||
}
|
||||
|
||||
room.thumbnail = draw::createSurface(32,16);
|
||||
for (int y=0; y<16; ++y) {
|
||||
for (int x=0; x<32; ++x) {
|
||||
uint16_t tile = room.tiles[x][y];
|
||||
if (tile>0) {
|
||||
tile--;
|
||||
room.thumbnail->pixels[x+y*32] = pixels[tile%24][tile/24];
|
||||
} else {
|
||||
room.thumbnail->pixels[x+y*32] = room.bgColor;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
std::map<std::string, bool> visited;
|
||||
|
||||
void detectFullMapOffset(std::string room_name, int x, int y)
|
||||
{
|
||||
if (visited.find(room_name)!= visited.end()) return;
|
||||
printf("Visiting '%s'...\n", room_name.c_str());
|
||||
visited[room_name] = true;
|
||||
|
||||
if (full_map_x < x) full_map_x = x;
|
||||
if (full_map_y < y) full_map_y = y;
|
||||
|
||||
room_t &room = rooms[room_name];
|
||||
room.map_x = x;
|
||||
room.map_y = y;
|
||||
if (room.roomUp != "0") detectFullMapOffset(room.roomUp, x, y+1);
|
||||
if (room.roomLeft != "0") detectFullMapOffset(room.roomLeft, x+1, y);
|
||||
if (room.roomDown != "0") detectFullMapOffset(room.roomDown, x, y-1);
|
||||
if (room.roomRight != "0") detectFullMapOffset(room.roomRight, x-1, y);
|
||||
}
|
||||
|
||||
void load()
|
||||
{
|
||||
// Get all room files
|
||||
@@ -216,12 +273,17 @@ namespace rooms
|
||||
std::cout << "Processing " << path.filename() << '\n';
|
||||
loadRoom(path);
|
||||
loadTiles(path);
|
||||
generateThumbnail(path);
|
||||
}
|
||||
|
||||
} catch (const fs::filesystem_error& e) {
|
||||
std::cerr << "Filesystem error: " << e.what() << '\n';
|
||||
}
|
||||
|
||||
visited.clear();
|
||||
detectFullMapOffset("01", 0, 0);
|
||||
full_map_x++;
|
||||
full_map_y++;
|
||||
/*for (auto &item : rooms)
|
||||
{
|
||||
room_t &room = item.second;
|
||||
@@ -238,6 +300,11 @@ namespace rooms
|
||||
void draw()
|
||||
{
|
||||
room_t &room = rooms["02"];
|
||||
|
||||
draw::cls(room.border);
|
||||
draw::setViewport(32, 24, 256, 128);
|
||||
draw::cls(room.bgColor);
|
||||
|
||||
draw::setSource(room.tileSetFile);
|
||||
|
||||
for (int y=0; y<16; ++y) {
|
||||
@@ -259,5 +326,29 @@ namespace rooms
|
||||
draw::draw(enemy.x*8, enemy.y*8, anim.frame_width, anim.frame_height, tile*anim.frame_width, 0);
|
||||
draw::restorecol(1);
|
||||
}
|
||||
|
||||
draw::resetViewport();
|
||||
|
||||
draw::setSource(room.thumbnail);
|
||||
draw::draw();
|
||||
}
|
||||
|
||||
void drawFullMap()
|
||||
{
|
||||
for (auto &item : rooms)
|
||||
{
|
||||
auto room = item.second;
|
||||
int x = ((full_map_x-room.map_x)*38)-1;
|
||||
int y = ((full_map_y-room.map_y)*22)-1;
|
||||
draw::resetViewport();
|
||||
draw::color(COLOR_WHITE);
|
||||
draw::rect(x, y, 34, 18);
|
||||
draw::setSource(room.thumbnail);
|
||||
draw::draw(x+1, y+1, 32, 16, 0, 0);
|
||||
if (room.roomUp != "0") draw::fillrect(x+15, y-4, 4, 4);
|
||||
//if (room.roomDown != "0") draw::fillrect(x+15, y+16, 4, 4);
|
||||
if (room.roomLeft != "0") draw::fillrect(x-4, y+7, 4, 4);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -62,8 +62,12 @@ namespace rooms
|
||||
std::vector<enemy_t> enemies;
|
||||
std::vector<item_t> items;
|
||||
uint16_t tiles[32][16];
|
||||
draw::surface *thumbnail {nullptr};
|
||||
int map_x {0};
|
||||
int map_y {0};
|
||||
};
|
||||
|
||||
void load();
|
||||
void draw();
|
||||
void drawFullMap();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user