static bool sameTileImages(const Tileset &a, const Tileset &b) { Q_ASSERT(a.tileCount() == b.tileCount()); for (int i = 0; i < a.tileCount(); ++i) { const Tile *tileA = a.tileAt(i); const Tile *tileB = b.tileAt(i); if (tileA->imageSource() != tileB->imageSource()) return false; } return true; }
Tileset *VariantToMapConverter::toTileset(const QVariant &variant) { const QVariantMap variantMap = variant.toMap(); const int firstGid = variantMap["firstgid"].toInt(); const QString name = variantMap["name"].toString(); const int tileWidth = variantMap["tilewidth"].toInt(); const int tileHeight = variantMap["tileheight"].toInt(); const int spacing = variantMap["spacing"].toInt(); const int margin = variantMap["margin"].toInt(); const QVariantMap tileOffset = variantMap["tileoffset"].toMap(); const int tileOffsetX = tileOffset["x"].toInt(); const int tileOffsetY = tileOffset["y"].toInt(); if (tileWidth <= 0 || tileHeight <= 0 || firstGid == 0) { mError = tr("Invalid tileset parameters for tileset '%1'").arg(name); return 0; } Tileset *tileset = new Tileset(name, tileWidth, tileHeight, spacing, margin); tileset->setTileOffset(QPoint(tileOffsetX, tileOffsetY)); const QString trans = variantMap["transparentcolor"].toString(); if (!trans.isEmpty()) #if QT_VERSION >= 0x040700 if (QColor::isValidColor(trans)) #endif tileset->setTransparentColor(QColor(trans)); QString imageSource = variantMap["image"].toString(); if (QDir::isRelativePath(imageSource)) imageSource = mMapDir.path() + QLatin1Char('/') + imageSource; if (!tileset->loadFromImage(QImage(imageSource), imageSource)) { mError = tr("Error loading tileset image:\n'%1'").arg(imageSource); delete tileset; return 0; } tileset->setProperties(toProperties(variantMap["properties"])); QVariantMap propertiesVariantMap = variantMap["tileproperties"].toMap(); QVariantMap::const_iterator it = propertiesVariantMap.constBegin(); for (; it != propertiesVariantMap.constEnd(); ++it) { const int tileIndex = it.key().toInt(); const QVariant propertiesVar = it.value(); if (tileIndex >= 0 && tileIndex < tileset->tileCount()) { const Properties properties = toProperties(propertiesVar); tileset->tileAt(tileIndex)->setProperties(properties); } } mGidMapper.insert(firstGid, tileset); return tileset; }
// Reader Tiled::Map *DroidcraftPlugin::read(const QString &fileName) { using namespace Tiled; QByteArray uncompressed; // Read data QFile f(fileName); if (f.open(QIODevice::ReadOnly)) { QByteArray compressed = f.readAll(); f.close(); uncompressed = decompress(compressed, 48 * 48); } // Check the data if (uncompressed.count() != 48 * 48) { mError = tr("This is not a valid Droidcraft map file!"); return 0; } // Build 48 x 48 map // Create a Map -> Create a Tileset -> Add Tileset to map // -> Create a TileLayer -> Fill layer -> Add TileLayer to Map Map *map = new Map(Map::Orthogonal, 48, 48, 32, 32); Tileset *mapTileset = new Tileset("tileset", 32, 32); mapTileset->loadFromImage(QImage(":/tileset.png"), "tileset.png"); map->addTileset(mapTileset); // Fill layer TileLayer *mapLayer = new TileLayer("map", 0, 0, 48, 48); // Load for (int i = 0; i < 48 * 48; i++) { unsigned char tileFile = uncompressed.at(i); int y = i / 48; int x = i - (48 * y); Tile *tile = mapTileset->tileAt(tileFile); mapLayer->setCell(x, y, Cell(tile)); } map->addLayer(mapLayer); return map; }