Browse Source

Add object group.

aster 11 years ago
parent
commit
c4b68bd429

+ 0 - 3
Source/Engine/Urho2D/TileMap2D.cpp

@@ -78,9 +78,6 @@ void TileMap2D::SetTmxFile(TmxFile2D* tmxFile)
     for (unsigned i = 0; i < numLayers; ++i)
     {
         const TmxLayer2D* tmxLayer = tmxFile_->GetLayer(i);
-        // Dont create object group
-        if (tmxLayer->type_ == LT_OBJECT_GROUP)
-            continue;
 
         SharedPtr<Node> layerNode(GetNode()->CreateChild(tmxLayer->name_, LOCAL));
         layerNode->SetTemporary(true);

+ 35 - 2
Source/Engine/Urho2D/TileMapLayer2D.cpp

@@ -72,9 +72,11 @@ void TileMapLayer2D::SetTmxLayer(const TmxLayer2D* tmxLayer)
         return;
 
     if (tmxLayer_->type_ == LT_TILE_LAYER)
-        SetTileLayer((TmxTileLayer2D*)tmxLayer_);
+        SetTileLayer((const TmxTileLayer2D*)tmxLayer_);
+    else if (tmxLayer_->type_ == LT_OBJECT_GROUP)
+        SetObjectGroup((const TmxObjectGroup2D*)tmxLayer_);
     else if (tmxLayer_->type_ == LT_IMAGE_LAYER)
-        SetImageLayer((TmxImageLayer2D*)tmxLayer_);
+        SetImageLayer((const TmxImageLayer2D*)tmxLayer_);
 }
 
 void TileMapLayer2D::SetDrawOrder(int drawOrder)
@@ -170,6 +172,37 @@ void TileMapLayer2D::SetTileLayer(const TmxTileLayer2D* tileLayer)
     }
 }
 
+
+void TileMapLayer2D::SetObjectGroup(const TmxObjectGroup2D* objectGroup)
+{
+    TmxFile2D* tmxFile = objectGroup->tmxFile_;
+
+    for (unsigned i = 0; i < objectGroup->objects_.Size(); ++i)
+    {
+        const TmxObject& object = objectGroup->objects_[i];
+        if (object.type_ != OT_TILE)
+            continue;
+
+        if (object.gid_ <= 0)
+            continue;
+
+        Sprite2D* sprite = tmxFile->GetTileSprite(object.gid_);
+        if (!sprite)
+            continue;
+
+        SharedPtr<Node> tileNode(GetNode()->CreateChild("Tile"));
+        tileNode->SetTemporary(true);
+        tileNode->SetPosition(Vector3(object.x_, object.y_, 0.0f));
+
+        StaticSprite2D* staticSprite = tileNode->CreateComponent<StaticSprite2D>();
+        staticSprite->SetSprite(sprite);
+        staticSprite->SetLayer(drawOrder_);
+        staticSprite->SetOrderInLayer((int)((10.0f - object.y_) * 100.0f));
+
+        nodes_.Push(tileNode);
+    }
+}
+
 void TileMapLayer2D::SetImageLayer(const TmxImageLayer2D* imageLayer)
 {
     if (!imageLayer->sprite_)

+ 3 - 5
Source/Engine/Urho2D/TileMapLayer2D.h

@@ -23,15 +23,11 @@
 #pragma once
 
 #include "Component.h"
+#include "TmxFile2D.h"
 
 namespace Urho3D
 {
 
-enum TmxLayerType2D;
-struct TmxLayer2D;
-struct TmxTileLayer2D;
-struct TmxImageLayer2D;
-
 class Node;
 
 /// Tile map component.
@@ -74,6 +70,8 @@ public:
 private:
     /// Set tile layer.
     void SetTileLayer(const TmxTileLayer2D* tileLayer);
+    /// Set object group.
+    void SetObjectGroup(const TmxObjectGroup2D* objectGroup);
     /// Set image layer.
     void SetImageLayer(const TmxImageLayer2D* imageLayer);
 

+ 58 - 1
Source/Engine/Urho2D/TmxFile2D.cpp

@@ -210,7 +210,6 @@ bool TmxFile2D::LoadLayer(const XMLElement& element)
     layers_.Push(tileLayer);
 
     tileLayer->name_ = element.GetAttribute("name");
-
     tileLayer->width_ = element.GetInt("width");
     tileLayer->height_ = element.GetInt("height");
 
@@ -249,6 +248,64 @@ bool TmxFile2D::LoadLayer(const XMLElement& element)
 
 bool TmxFile2D::LoadObjectGroup(const XMLElement& element)
 {
+    TmxObjectGroup2D* objectGroup = new TmxObjectGroup2D(this);
+    layers_.Push(objectGroup);
+
+    objectGroup->name_ = element.GetAttribute("name");
+    objectGroup->width_ = element.GetInt("width");
+    objectGroup->height_ = element.GetInt("height");
+
+    const float mapHeight = height_ * tileHeight_;
+
+    for (XMLElement objectElem = element.GetChild("object"); objectElem; objectElem = objectElem.GetNext("object"))
+    {
+        objectGroup->objects_.Push(TmxObject());
+        TmxObject& object = objectGroup->objects_.Back();
+
+        object.x_ = objectElem.GetInt("x") * PIXEL_SIZE;
+        // Flip y
+        object.y_ = mapHeight - objectElem.GetInt("y") * PIXEL_SIZE;
+
+        if (objectElem.HasAttribute("width") || objectElem.HasAttribute("height"))
+        {
+            if (!objectElem.HasChild("ellipse"))
+                object.type_ = OT_RECTANGLE;
+            else
+                object.type_ = OT_ELLIPSE;
+
+            object.width_ = objectElem.GetInt("width") * PIXEL_SIZE;
+            object.height_ = objectElem.GetInt("height") * PIXEL_SIZE;
+
+            object.y_ -= object.height_;
+        }
+        else if (objectElem.HasAttribute("gid"))
+        {
+            object.type_ = OT_TILE;
+            object.gid_ = objectElem.GetInt("gid");
+        }
+        else
+        {
+            XMLElement childElem = objectElem.GetChild();
+            if (childElem.GetName() == "polygon")
+                object.type_ = OT_POLYGON;
+            else if (childElem.GetName() == "polyline")
+                object.type_ = OT_POLYLINE;
+            else
+                return false;
+
+            Vector<String> points = childElem.GetAttribute("points").Split(' ');
+            object.points_.Resize(points.Size());
+            
+            for (unsigned i = 0; i < points.Size(); ++i)
+            {
+                points[i].Replace(',', ' ');
+                Vector2 point = ToVector2(points[i]) * PIXEL_SIZE;
+                point.y_ = mapHeight - point.y_;
+                object.points_[i] = point;
+            }
+        }
+    }
+
     return true;
 }
 

+ 35 - 3
Source/Engine/Urho2D/TmxFile2D.h

@@ -38,14 +38,14 @@ class XMLFile;
 /// Tmx layer type.
 enum TmxLayerType2D
 {
-    /// Invalid layer.
-    LT_INVALID = 0,
     /// Tile layer.
-    LT_TILE_LAYER,
+    LT_TILE_LAYER = 0,
     /// Object group.
     LT_OBJECT_GROUP,
     /// Image layer.
     LT_IMAGE_LAYER,
+    /// Invalid.
+    LT_INVALID,
 };
 
 /// Tmx layer.
@@ -83,6 +83,35 @@ struct URHO3D_API TmxTileLayer2D : TmxLayer2D
     PODVector<int> tileGids_;
 };
 
+/// Object type.
+enum TmxObjectType
+{
+    /// Rectangle.
+    OT_RECTANGLE = 0,
+    /// Ellipse.
+    OT_ELLIPSE,
+    /// Polygon.
+    OT_POLYGON,
+    /// Polyline.
+    OT_POLYLINE,
+    /// Tile.
+    OT_TILE,
+};
+
+/// Tmx object.
+struct URHO3D_API TmxObject
+{
+    /// Object type.
+    TmxObjectType type_;
+    /// Position.
+    float x_, y_;
+    /// Size (for rectangle and ellipse).
+    float width_, height_;
+    /// Points(for polygon and polyline).
+    Vector<Vector2> points_;
+    /// Gid (for tile).
+    int gid_;
+};
 
 /// Tmx image layer.
 struct URHO3D_API TmxObjectGroup2D : TmxLayer2D
@@ -90,6 +119,9 @@ struct URHO3D_API TmxObjectGroup2D : TmxLayer2D
     TmxObjectGroup2D(TmxFile2D* tmxFile) : TmxLayer2D(tmxFile, LT_OBJECT_GROUP)
     {
     }
+
+    /// Objects.
+    Vector<TmxObject> objects_;
 };
 
 /// Tmx image layer.