From 9b5590795d66ac525b9c9b39b8d390e3b0fa00e6 Mon Sep 17 00:00:00 2001 From: ElonDev Date: Thu, 15 Jan 2015 15:35:20 +0100 Subject: [PATCH] Tile image draw process modification --- src/libtiled/mapreader.cpp | 6 ++++++ src/libtiled/maprenderer.cpp | 11 +++++++++-- src/libtiled/mapwriter.cpp | 7 +++++++ src/libtiled/tile.cpp | 7 +++++++ src/libtiled/tile.h | 11 +++++++++++ 5 files changed, 40 insertions(+), 2 deletions(-) diff --git a/src/libtiled/mapreader.cpp b/src/libtiled/mapreader.cpp index c5c68e87c37..a8d29cef1a3 100644 --- a/src/libtiled/mapreader.cpp +++ b/src/libtiled/mapreader.cpp @@ -409,6 +409,12 @@ void MapReaderPrivate::readTilesetTile(Tileset *tileset) while (xml.readNextStartElement()) { if (xml.name() == QLatin1String("properties")) { tile->mergeProperties(readProperties()); + } else if (xml.name() == QLatin1String("imageoffset")) { + const QXmlStreamAttributes oa = xml.attributes(); + int x = oa.value(QLatin1String("x")).toString().toInt(); + int y = oa.value(QLatin1String("y")).toString().toInt(); + tile->setImageOffset(QPointF(x, y)); + xml.skipCurrentElement(); } else if (xml.name() == QLatin1String("image")) { QString source = xml.attributes().value(QLatin1String("source")).toString(); if (!source.isEmpty()) diff --git a/src/libtiled/maprenderer.cpp b/src/libtiled/maprenderer.cpp index 3d1750036c5..a8e75ab6183 100644 --- a/src/libtiled/maprenderer.cpp +++ b/src/libtiled/maprenderer.cpp @@ -36,6 +36,8 @@ #include #include +#include + using namespace Tiled; QRectF MapRenderer::boundingRect(const ImageLayer *imageLayer) const @@ -115,11 +117,16 @@ void CellRenderer::render(const Cell &cell, const QPointF &pos, Origin origin) const QPixmap &image = cell.tile->currentFrameImage(); const QSizeF size = image.size(); const QPoint offset = cell.tile->tileset()->tileOffset(); + const QPointF imageOffset = cell.tile->imageOffset(); const QPointF sizeHalf = QPointF(size.width() / 2, size.height() / 2); + // Cell size is 86x43, get half size to set position correctly. + float cellHalfWidth = 43; + float cellHalfHeight = 21.5; + QPainter::PixmapFragment fragment; - fragment.x = pos.x() + offset.x() + sizeHalf.x(); - fragment.y = pos.y() + offset.y() + sizeHalf.y() - size.height(); + fragment.x = pos.x() + offset.x() + sizeHalf.x() + cellHalfWidth - imageOffset.x(); + fragment.y = pos.y() + offset.y() + sizeHalf.y() - cellHalfHeight - imageOffset.y(); fragment.sourceLeft = 0; fragment.sourceTop = 0; fragment.width = size.width(); diff --git a/src/libtiled/mapwriter.cpp b/src/libtiled/mapwriter.cpp index 209ab761d7d..58ec1dab836 100644 --- a/src/libtiled/mapwriter.cpp +++ b/src/libtiled/mapwriter.cpp @@ -326,6 +326,7 @@ void MapWriterPrivate::writeTileset(QXmlStreamWriter &w, const Tileset *tileset, for (int i = 0; i < tileset->tileCount(); ++i) { const Tile *tile = tileset->tileAt(i); const Properties properties = tile->properties(); + const QPointF imageOffset = tile->imageOffset(); unsigned terrain = tile->terrain(); float probability = tile->terrainProbability(); ObjectGroup *objectGroup = tile->objectGroup(); @@ -335,6 +336,12 @@ void MapWriterPrivate::writeTileset(QXmlStreamWriter &w, const Tileset *tileset, w.writeAttribute(QLatin1String("id"), QString::number(i)); if (terrain != 0xFFFFFFFF) w.writeAttribute(QLatin1String("terrain"), makeTerrainAttribute(tile)); + if (!imageOffset.isNull()) { + w.writeStartElement(QLatin1String("imageoffset")); + w.writeAttribute(QLatin1String("x"), QString::number(imageOffset.x())); + w.writeAttribute(QLatin1String("y"), QString::number(imageOffset.y())); + w.writeEndElement(); + } if (probability != -1.f) w.writeAttribute(QLatin1String("probability"), QString::number(probability)); if (!properties.isEmpty()) diff --git a/src/libtiled/tile.cpp b/src/libtiled/tile.cpp index 3643a62b8cf..467dded2884 100644 --- a/src/libtiled/tile.cpp +++ b/src/libtiled/tile.cpp @@ -39,6 +39,7 @@ Tile::Tile(const QPixmap &image, int id, Tileset *tileset): mTileset(tileset), mImage(image), mTerrain(-1), + mImageOffset(0, 0), mTerrainProbability(-1.f), mObjectGroup(0), mCurrentFrameIndex(0), @@ -53,6 +54,7 @@ Tile::Tile(const QPixmap &image, const QString &imageSource, mImage(image), mImageSource(imageSource), mTerrain(-1), + mImageOffset(0, 0), mTerrainProbability(-1.f), mObjectGroup(0), mCurrentFrameIndex(0), @@ -92,6 +94,11 @@ void Tile::setTerrain(unsigned terrain) mTileset->markTerrainDistancesDirty(); } +void Tile::setImageOffset(QPointF imageOffset) +{ + mImageOffset = imageOffset; +} + /** * Sets \a objectGroup to be the group of objects associated with this tile. * The Tile takes ownership over the ObjectGroup and it can't also be part of diff --git a/src/libtiled/tile.h b/src/libtiled/tile.h index 88e5f36afd6..277bc3eced3 100644 --- a/src/libtiled/tile.h +++ b/src/libtiled/tile.h @@ -141,6 +141,16 @@ class TILEDSHARED_EXPORT Tile : public Object */ void setTerrain(unsigned terrain); + /** + * Returns the image offset to set correct position. + */ + QPointF imageOffset() const { return mImageOffset; } + + /** + * Set the image offset for tile position. + */ + void setImageOffset(QPointF imageOffset); + /** * Returns the probability of this terrain type appearing while painting (0-100%). */ @@ -167,6 +177,7 @@ class TILEDSHARED_EXPORT Tile : public Object QPixmap mImage; QString mImageSource; unsigned mTerrain; + QPointF mImageOffset; float mTerrainProbability; ObjectGroup *mObjectGroup;