- [NEW] Generació i pintat del mapa de totes les habitacions
This commit is contained in:
@@ -8,7 +8,7 @@ bool loop();
|
|||||||
|
|
||||||
void game::init()
|
void game::init()
|
||||||
{
|
{
|
||||||
draw::init("DILEMMAKER v0.1", 320, 240, 3, false);
|
draw::init("DILEMMAKER v0.1", 640, 480, 1, false);
|
||||||
game::setState(loop);
|
game::setState(loop);
|
||||||
enemies::load();
|
enemies::load();
|
||||||
rooms::load();
|
rooms::load();
|
||||||
@@ -17,8 +17,8 @@ void game::init()
|
|||||||
|
|
||||||
bool loop()
|
bool loop()
|
||||||
{
|
{
|
||||||
draw::setViewport(32, 24, 256, 128);
|
draw::cls(0);
|
||||||
rooms::draw();
|
rooms::drawFullMap();
|
||||||
draw::render();
|
draw::render();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
101
source/rooms.cpp
101
source/rooms.cpp
@@ -17,6 +17,7 @@ namespace rooms
|
|||||||
int num_total_rooms = 0;
|
int num_total_rooms = 0;
|
||||||
std::string current_room = "";
|
std::string current_room = "";
|
||||||
std::map<std::string, room_t> rooms;
|
std::map<std::string, room_t> rooms;
|
||||||
|
int full_map_x = 0, full_map_y = 0;
|
||||||
|
|
||||||
static const char *paletteMap[] = {
|
static const char *paletteMap[] = {
|
||||||
"black", "bright_black", "blue", "bright_blue",
|
"black", "bright_black", "blue", "bright_blue",
|
||||||
@@ -51,13 +52,13 @@ namespace rooms
|
|||||||
} else if (key == "tileSetFile") {
|
} else if (key == "tileSetFile") {
|
||||||
room.tileSetFile = images::getImage("tilesets/"+value);
|
room.tileSetFile = images::getImage("tilesets/"+value);
|
||||||
} else if (key == "roomUp") {
|
} else if (key == "roomUp") {
|
||||||
room.roomUp = value;
|
room.roomUp = value.substr(0, value.find_last_of('.'));;
|
||||||
} else if (key == "roomDown") {
|
} else if (key == "roomDown") {
|
||||||
room.roomDown = value;
|
room.roomDown = value.substr(0, value.find_last_of('.'));;
|
||||||
} else if (key == "roomLeft") {
|
} else if (key == "roomLeft") {
|
||||||
room.roomLeft = value;
|
room.roomLeft = value.substr(0, value.find_last_of('.'));;
|
||||||
} else if (key == "roomRight") {
|
} else if (key == "roomRight") {
|
||||||
room.roomRight = value;
|
room.roomRight = value.substr(0, value.find_last_of('.'));;
|
||||||
} else if (key == "itemColor1") {
|
} else if (key == "itemColor1") {
|
||||||
room.itemColor1 = colorToNum(value);
|
room.itemColor1 = colorToNum(value);
|
||||||
} else if (key == "itemColor2") {
|
} else if (key == "itemColor2") {
|
||||||
@@ -65,7 +66,7 @@ namespace rooms
|
|||||||
}
|
}
|
||||||
} else if (section == "enemy") {
|
} else if (section == "enemy") {
|
||||||
if (key == "animation") {
|
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") {
|
} else if (key == "x") {
|
||||||
room.enemies.back().x = std::stoi(value);
|
room.enemies.back().x = std::stoi(value);
|
||||||
} else if (key == "y") {
|
} 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()
|
void load()
|
||||||
{
|
{
|
||||||
// Get all room files
|
// Get all room files
|
||||||
@@ -216,12 +273,17 @@ namespace rooms
|
|||||||
std::cout << "Processing " << path.filename() << '\n';
|
std::cout << "Processing " << path.filename() << '\n';
|
||||||
loadRoom(path);
|
loadRoom(path);
|
||||||
loadTiles(path);
|
loadTiles(path);
|
||||||
|
generateThumbnail(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (const fs::filesystem_error& e) {
|
} catch (const fs::filesystem_error& e) {
|
||||||
std::cerr << "Filesystem error: " << e.what() << '\n';
|
std::cerr << "Filesystem error: " << e.what() << '\n';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
visited.clear();
|
||||||
|
detectFullMapOffset("01", 0, 0);
|
||||||
|
full_map_x++;
|
||||||
|
full_map_y++;
|
||||||
/*for (auto &item : rooms)
|
/*for (auto &item : rooms)
|
||||||
{
|
{
|
||||||
room_t &room = item.second;
|
room_t &room = item.second;
|
||||||
@@ -238,6 +300,11 @@ namespace rooms
|
|||||||
void draw()
|
void draw()
|
||||||
{
|
{
|
||||||
room_t &room = rooms["02"];
|
room_t &room = rooms["02"];
|
||||||
|
|
||||||
|
draw::cls(room.border);
|
||||||
|
draw::setViewport(32, 24, 256, 128);
|
||||||
|
draw::cls(room.bgColor);
|
||||||
|
|
||||||
draw::setSource(room.tileSetFile);
|
draw::setSource(room.tileSetFile);
|
||||||
|
|
||||||
for (int y=0; y<16; ++y) {
|
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::draw(enemy.x*8, enemy.y*8, anim.frame_width, anim.frame_height, tile*anim.frame_width, 0);
|
||||||
draw::restorecol(1);
|
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<enemy_t> enemies;
|
||||||
std::vector<item_t> items;
|
std::vector<item_t> items;
|
||||||
uint16_t tiles[32][16];
|
uint16_t tiles[32][16];
|
||||||
|
draw::surface *thumbnail {nullptr};
|
||||||
|
int map_x {0};
|
||||||
|
int map_y {0};
|
||||||
};
|
};
|
||||||
|
|
||||||
void load();
|
void load();
|
||||||
void draw();
|
void draw();
|
||||||
|
void drawFullMap();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user