Ver código fonte

Change tile size to float, fix bug, change Desert.png.

aster2013 11 anos atrás
pai
commit
1262869ac6

BIN
Bin/Data/Urho2D/Desert.png


+ 4 - 22
Source/Engine/Urho2D/TileMap2D.cpp

@@ -99,32 +99,14 @@ int TileMap2D::GetHeight() const
 
 }
 
-int TileMap2D::GetTileWidth() const
+float TileMap2D::GetTileWidth() const
 {
-    return tmxFile_ ? tmxFile_->GetTileWidth() : 0;
-
+    return tmxFile_ ? tmxFile_->GetTileWidth() : 0.0f;
 }
 
-int TileMap2D::GetTileHeight() const
-{
-    return tmxFile_ ? tmxFile_->GetTileHeight() : 0;
-
-}
-Vector2 TileMap2D::GetSize() const
+float TileMap2D::GetTileHeight() const
 {
-    if (!tmxFile_)
-        return Vector2::ZERO;
-
-    return Vector2(tmxFile_->GetWidth() * tmxFile_->GetTileWidth() * PIXEL_SIZE,
-        tmxFile_->GetHeight() * tmxFile_->GetTileHeight() * PIXEL_SIZE);
-}
-
-Vector2 TileMap2D::GetTileSize() const
-{
-    if (!tmxFile_)
-        return Vector2::ZERO;
-
-    return Vector2(tmxFile_->GetTileWidth() * PIXEL_SIZE, tmxFile_->GetTileHeight() * PIXEL_SIZE);
+    return tmxFile_ ? tmxFile_->GetTileHeight() : 0.0f;
 }
 
 TileMapLayer2D* TileMap2D::GetLayer(unsigned index) const

+ 3 - 7
Source/Engine/Urho2D/TileMap2D.h

@@ -52,14 +52,10 @@ public:
     int GetWidth() const;
     /// Return height.
     int GetHeight() const;
-    /// Return size.
-    Vector2 GetSize() const;
-    /// Return tile width in pixel.
-    int GetTileWidth() const;
+    /// Return tile width
+    float GetTileWidth() const;
     /// Return tile height in pixel.
-    int GetTileHeight() const;
-    /// Return tile size.
-    Vector2 GetTileSize() const;
+    float GetTileHeight() const;
     /// Return number of layers.
     unsigned GetNumLayers() const { return layers_.Size(); }
     /// Return tile map layer at index.

+ 12 - 12
Source/Engine/Urho2D/TileMapLayer2D.cpp

@@ -34,9 +34,6 @@
 namespace Urho3D
 {
 
-
-extern const float PIXEL_SIZE;
-
 TileMapLayer2D::TileMapLayer2D(Context* context) :
     Component(context),
     tmxLayer_(0),
@@ -80,14 +77,14 @@ void TileMapLayer2D::SetTmxLayer(const TmxLayer2D* tmxLayer, int drawOrder)
     tileNodes_.Resize(width * height);
 
     TmxFile2D* tmxFile = tmxLayer_->tmxFile_;
-    float tileWidth = tmxFile->GetTileWidth() * PIXEL_SIZE;
-    float tileHeight = tmxFile->GetTileHeight() * PIXEL_SIZE;
+    float tileWidth = tmxFile->GetTileWidth();
+    float tileHeight = tmxFile->GetTileHeight();
 
-    for (int x = 0; x < width; ++x)
+    for (int y = 0; y < height; ++y)
     {
-        for (int y = 0; y < height; ++y)
+        for (int x = 0; x < width; ++x)
         {
-            int gid = tmxLayer->tiles_[y * width + x];
+            int gid = tmxLayer->tileGids_[y * width + x];
             if (gid <= 0)
                 continue;
             
@@ -97,12 +94,12 @@ void TileMapLayer2D::SetTmxLayer(const TmxLayer2D* tmxLayer, int drawOrder)
             
             SharedPtr<Node> tileNode(GetNode()->CreateChild("Tile"));
             tileNode->SetTemporary(true);
+            tileNode->SetPosition(Vector3(x * tileWidth, y * tileHeight, 0.0f));
 
-            tileNode->SetPosition(Vector3(x * tileWidth, (height - y - 1) * tileHeight, 0.0f));
             StaticSprite2D* staticSprite = tileNode->CreateComponent<StaticSprite2D>();
             staticSprite->SetSprite(sprite);
             staticSprite->SetLayer(drawOrder_);
-            staticSprite->SetOrderInLayer(y * width + x);
+            staticSprite->SetOrderInLayer((height - 1 - y) * width + x);
 
             tileNodes_[y * width + x] = tileNode;
         }
@@ -117,7 +114,10 @@ void TileMapLayer2D::SetDrawOrder(int drawOrder)
     drawOrder_ = drawOrder;
 
     for (unsigned i = 0; i < tileNodes_.Size(); ++i)
-        tileNodes_[i]->GetComponent<StaticSprite2D>()->SetLayer(drawOrder_);
+    {
+        if (tileNodes_[i])
+            tileNodes_[i]->GetComponent<StaticSprite2D>()->SetLayer(drawOrder_);
+    }
 }
 
 int TileMapLayer2D::GetWidth() const
@@ -138,7 +138,7 @@ Node* TileMapLayer2D::GetTileNode(int x, int y) const
     if (x < 0 || x >= tmxLayer_->width_ || y < 0 || y >= tmxLayer_->height_)
         return 0;
 
-    return tileNodes_[y * tmxLayer_->height_ + x];
+    return tileNodes_[y * tmxLayer_->width_ + x];
 }
 
 }

+ 28 - 17
Source/Engine/Urho2D/TmxFile2D.cpp

@@ -36,12 +36,14 @@
 namespace Urho3D
 {
 
+extern const float PIXEL_SIZE;
+
 TmxFile2D::TmxFile2D(Context* context) :
     Resource(context),
     width_(0),
     height_(0),
-    tileWidth_(0),
-    tileHeight_(0)
+    tileWidth_(0.0f),
+    tileHeight_(0.0f)
 {
 }
 
@@ -77,8 +79,8 @@ bool TmxFile2D::BeginLoad(Deserializer& source)
     {
         for (XMLElement tileSetElem = rootElem.GetChild("tileset"); tileSetElem; tileSetElem = tileSetElem.GetNext("tileset"))
         {
-            String loadTextureName = GetParentPath(GetName()) + tileSetElem.GetChild("image").GetAttribute("source");
-            GetSubsystem<ResourceCache>()->BackgroundLoadResource<Texture2D>(loadTextureName, true, this);
+            String textureFilePath = GetParentPath(GetName()) + tileSetElem.GetChild("image").GetAttribute("source");
+            GetSubsystem<ResourceCache>()->BackgroundLoadResource<Texture2D>(textureFilePath, true, this);
         }
     }
 
@@ -87,12 +89,10 @@ bool TmxFile2D::BeginLoad(Deserializer& source)
 
 bool TmxFile2D::EndLoad()
 {
-    // Actually load the folders and animations now
     if (!loadXMLFile_)
         return false;
 
     XMLElement rootElem = loadXMLFile_->GetRoot("map");
-
     String version = rootElem.GetAttribute("version");
     if (version != "1.0")
     {
@@ -109,8 +109,8 @@ bool TmxFile2D::EndLoad()
 
     width_ = rootElem.GetInt("width");
     height_ = rootElem.GetInt("height");
-    tileWidth_ = rootElem.GetInt("tilewidth");
-    tileHeight_ = rootElem.GetInt("tileheight");
+    tileWidth_ = rootElem.GetFloat("tilewidth") * PIXEL_SIZE;
+    tileHeight_ = rootElem.GetFloat("tileheight") * PIXEL_SIZE;
 
     // Load tile set
     for (XMLElement tileSetElem = rootElem.GetChild("tileset"); tileSetElem; tileSetElem = tileSetElem.GetNext("tileset"))
@@ -156,17 +156,17 @@ Sprite2D* TmxFile2D::GetTileSprite(int gid) const
 bool TmxFile2D::LoadTileSet(const XMLElement& element)
 {
     XMLElement imageElem = element.GetChild("image");
-    String loadTextureName = GetParentPath(GetName()) + imageElem.GetAttribute("source");
+    String textureFilePath = GetParentPath(GetName()) + imageElem.GetAttribute("source");
     ResourceCache* cache = GetSubsystem<ResourceCache>();
-    SharedPtr<Texture2D> texture(cache->GetResource<Texture2D>(loadTextureName));
+    SharedPtr<Texture2D> texture(cache->GetResource<Texture2D>(textureFilePath));
     if (!texture)
     {
-        LOGERROR("Could not load texture " + loadTextureName);
+        LOGERROR("Could not load texture " + textureFilePath);
         loadXMLFile_.Reset();
         return false;
     }
 
-    textures_.Push(texture);
+    tileSetTextures_.Push(texture);
 
     int gid = element.GetInt("firstgid");
     int tileWidth = element.GetInt("tilewidth");
@@ -183,6 +183,7 @@ bool TmxFile2D::LoadTileSet(const XMLElement& element)
             SharedPtr<Sprite2D> sprite(new Sprite2D(context_));
             sprite->SetTexture(texture);
             sprite->SetRectangle(IntRect(x, y, x + tileWidth, y + tileHeight));
+            // Set hot spot at left bottom
             sprite->SetHotSpot(Vector2(0.0f, 0.0f));
 
             tileSprites_[gid++] = sprite;
@@ -216,14 +217,24 @@ bool TmxFile2D::LoadLayer(const XMLElement& element)
         return false;
     }
 
-    layer.tiles_.Reserve(layer.width_ * layer.height_);
-
-    for (XMLElement tileElem = dataElem.GetChild("tile"); tileElem; tileElem = tileElem.GetNext("tile"))
+    XMLElement tileElem = dataElem.GetChild("tile");
+    layer.tileGids_.Resize(layer.width_ * layer.height_);
+    
+    // Flip y
+    for (int y = layer.height_ - 1; y >= 0; --y)
     {
-        layer.tiles_.Push(tileElem.GetInt("gid"));
+        for (int x = 0; x < layer.width_; ++x)
+        {
+            if (!tileElem)
+                return false;
+
+            int gid = tileElem.GetInt("gid");
+            tileElem = tileElem.GetNext("tile");
+            layer.tileGids_[y * layer.width_ + x] = gid;
+        }
     }
 
     return true;
 }
 
-}
+}

+ 9 - 9
Source/Engine/Urho2D/TmxFile2D.h

@@ -34,7 +34,7 @@ class XMLElement;
 class XMLFile;
 
 /// Tile map layer.
-struct TmxLayer2D
+struct URHO3D_API TmxLayer2D
 {
     /// Tmx file.
     WeakPtr<TmxFile2D> tmxFile_;
@@ -44,8 +44,8 @@ struct TmxLayer2D
     int width_;
     /// Height.
     int height_;
-    /// Tiles.
-    PODVector<int> tiles_;
+    /// Tiles gids.
+    PODVector<int> tileGids_;
 };
 
 /// Tile map file.
@@ -71,9 +71,9 @@ public:
     /// Return height.
     int GetHeight() const { return height_; }
     /// Return tile width.
-    int GetTileWidth() const { return tileWidth_; }
+    float GetTileWidth() const { return tileWidth_; }
     /// Return tile height.
-    int GetTileHeight() const { return tileHeight_; }
+    float GetTileHeight() const { return tileHeight_; }
     /// Return number of layers.
     unsigned GetNumLayers() const { return layers_.Size(); }
     /// Return layer at index.
@@ -94,11 +94,11 @@ private:
     /// Height.
     int height_;
     /// Tile width.
-    int tileWidth_;
+    float tileWidth_;
     /// Tile height.
-    int tileHeight_;
-    /// Textures.
-    Vector<SharedPtr<Texture2D> > textures_;
+    float tileHeight_;
+    /// Tile set textures.
+    Vector<SharedPtr<Texture2D> > tileSetTextures_;
     /// Gid to tile sprite mapping.
     HashMap<int, SharedPtr<Sprite2D> > tileSprites_;
     /// Layers.

+ 3 - 2
Source/Samples/36_Urho2DTileMap/Urho2DTileMap.cpp

@@ -105,9 +105,10 @@ void Urho2DTileMap::CreateScene()
     // Set animation
     tileMap->SetTmxFile(tmxFile);
 
-    Vector2 halfSize = tileMap->GetSize() * 0.5f;
     // Set camera's position
-    cameraNode_->SetPosition(Vector3(halfSize.x_, halfSize.y_, -10.0f));
+    float x = tileMap->GetWidth() * tileMap->GetTileWidth() * 0.5f;
+    float y = tileMap->GetHeight() * tileMap->GetTileHeight() * 0.5f;
+    cameraNode_->SetPosition(Vector3(x, y, -10.0f));
 }
 
 void Urho2DTileMap::CreateInstructions()