Selaa lähdekoodia

Refactor tile map, add TileMapInfo2D struct.

aster2013 11 vuotta sitten
vanhempi
sitoutus
a04edb1108

+ 3 - 2
Bin/Data/LuaScripts/36_Urho2DTileMap.lua

@@ -54,8 +54,9 @@ function CreateScene()
     tileMap.tmxFile = tmxFile
 
     -- Set camera's position
-    local x = tileMap.width * tileMap.tileWidth * 0.5
-    local y = tileMap.height * tileMap.tileHeight * 0.5
+    local info = tileMap.info
+    local x = info.mapWidth * 0.5
+    local y = info.mapHeight * 0.5
     cameraNode.position = Vector3(x, y, -10.0)
 end
 

+ 3 - 2
Bin/Data/Scripts/36_Urho2DTileMap.as

@@ -56,8 +56,9 @@ void CreateScene()
     tileMap.tmxFile = tmxFile;
     
     // Set camera's position;
-    float x = tileMap.width * tileMap.tileWidth * 0.5f;
-    float y = tileMap.height * tileMap.tileHeight * 0.5f;
+    TileMapInfo2D@ info = tileMap.info;
+    float x = info.mapWidth * 0.5f;
+    float y = info.mapHeight * 0.5f;
     cameraNode.position = Vector3(x, y, -10.0f);
 }
 

+ 2 - 10
Source/Engine/LuaScript/pkgs/Urho2D/TileMap2D.pkg

@@ -4,19 +4,11 @@ class TileMap2D : Component
 {
     void SetTmxFile(TmxFile2D* tmxFile);
     TmxFile2D* GetTmxFile() const;
-    Orientation2D GetOrientation() const;
-    int GetWidth() const;
-    int GetHeight() const;
-    float GetTileWidth() const;
-    float GetTileHeight() const;
+    const TileMapInfo2D& GetInfo() const;
     unsigned GetNumLayers() const;
     TileMapLayer2D* GetLayer(unsigned index) const;
 
     tolua_property__get_set TmxFile2D* tmxFile;
-    tolua_readonly tolua_property__get_set Orientation2D orientation;
-    tolua_readonly tolua_property__get_set int width;
-    tolua_readonly tolua_property__get_set int height;
-    tolua_readonly tolua_property__get_set float tileWidth;
-    tolua_readonly tolua_property__get_set float tileHeight;
+    tolua_readonly tolua_property__get_set TileMapInfo2D& info;
     tolua_readonly tolua_property__get_set unsigned numLayers;
 };

+ 16 - 1
Source/Engine/LuaScript/pkgs/Urho2D/TileMapDefs2D.pkg

@@ -6,6 +6,21 @@ enum Orientation2D
     O_ISOMETRIC
 };
 
+struct TileMapInfo2D
+{
+    Orientation2D orientation_ @ orientation;
+    int width_ @ width;
+    int height_ @ height;
+    float tileWidth_ @ tileWidth;
+    float tileHeight_ @ tileHeight;
+
+    float GetMapWidth() const;
+    float GetMapHeight() const;
+
+    tolua_readonly tolua_property__get_set float mapWidth;
+    tolua_readonly tolua_property__get_set float mapHeight;
+};
+
 enum TileMapLayerType2D
 {
     LT_TILE_LAYER,
@@ -59,4 +74,4 @@ class TileObject2D
     tolua_readonly tolua_property__get_set unsigned numPoints;
     tolua_readonly tolua_property__get_set int tileGid;
     tolua_readonly tolua_property__get_set Sprite2D* tileSprite;
-};
+};

+ 20 - 5
Source/Engine/Script/Urho2DAPI.cpp

@@ -193,12 +193,31 @@ static void RegisterParticleEmitter2D(asIScriptEngine* engine)
     engine->RegisterObjectMethod("ParticleEmitter2D", "ParticleEffect2D@+ get_effect() const", asMETHOD(ParticleEmitter2D, GetEffect), asCALL_THISCALL);
 }
 
+static void FakeAddRef(void* ptr)
+{
+}
+
+static void FakeReleaseRef(void* ptr)
+{
+}
+
 static void RegisterTileMapDefs2D(asIScriptEngine* engine)
 {
     engine->RegisterEnum("Orientation2D");
     engine->RegisterEnumValue("Orientation2D", "O_ORTHOGONAL", O_ORTHOGONAL);
     engine->RegisterEnumValue("Orientation2D", "O_ISOMETRIC", O_ISOMETRIC);
 
+    engine->RegisterObjectType("TileMapInfo2D", 0, asOBJ_REF);
+    engine->RegisterObjectBehaviour("TileMapInfo2D", asBEHAVE_ADDREF, "void f()", asFUNCTION(FakeAddRef), asCALL_CDECL_OBJLAST);
+    engine->RegisterObjectBehaviour("TileMapInfo2D", asBEHAVE_RELEASE, "void f()", asFUNCTION(FakeReleaseRef), asCALL_CDECL_OBJLAST);
+    engine->RegisterObjectProperty("TileMapInfo2D", "Orientation2D orientation", offsetof(TileMapInfo2D, orientation_));
+    engine->RegisterObjectProperty("TileMapInfo2D", "int width", offsetof(TileMapInfo2D, width_));
+    engine->RegisterObjectProperty("TileMapInfo2D", "int height", offsetof(TileMapInfo2D, height_));
+    engine->RegisterObjectProperty("TileMapInfo2D", "float tileWidth", offsetof(TileMapInfo2D, tileWidth_));
+    engine->RegisterObjectProperty("TileMapInfo2D", "float tileHeight", offsetof(TileMapInfo2D, tileHeight_));
+    engine->RegisterObjectMethod("TileMapInfo2D", "float get_mapWidth() const", asMETHOD(TileMapInfo2D, GetMapWidth), asCALL_THISCALL);
+    engine->RegisterObjectMethod("TileMapInfo2D", "float get_mapHeight() const", asMETHOD(TileMapInfo2D, GetMapHeight), asCALL_THISCALL);
+
     engine->RegisterEnum("TileMapLayerType2D");
     engine->RegisterEnumValue("TileMapLayerType2D", "LT_TILE_LAYER", LT_TILE_LAYER);
     engine->RegisterEnumValue("TileMapLayerType2D", "LT_OBJECT_GROUP", LT_OBJECT_GROUP);
@@ -271,11 +290,7 @@ static void RegisterTileMap2D(asIScriptEngine* engine)
 {
     engine->RegisterObjectMethod("TileMap2D", "void set_tmxFile(TmxFile2D@)", asMETHOD(TileMap2D, SetTmxFile), asCALL_THISCALL);
     engine->RegisterObjectMethod("TileMap2D", "TmxFile2D@ get_tmxFile() const", asMETHOD(TileMap2D, GetTmxFile), asCALL_THISCALL);
-    engine->RegisterObjectMethod("TileMap2D", "Orientation2D get_orientation() const", asMETHOD(TileMap2D, GetOrientation), asCALL_THISCALL);
-    engine->RegisterObjectMethod("TileMap2D", "int get_width() const", asMETHOD(TileMap2D, GetWidth), asCALL_THISCALL);
-    engine->RegisterObjectMethod("TileMap2D", "int get_height() const", asMETHOD(TileMap2D, GetHeight), asCALL_THISCALL);
-    engine->RegisterObjectMethod("TileMap2D", "float get_tileWidth() const", asMETHOD(TileMap2D, GetTileWidth), asCALL_THISCALL);
-    engine->RegisterObjectMethod("TileMap2D", "float get_tileHeight() const", asMETHOD(TileMap2D, GetTileHeight), asCALL_THISCALL);
+    engine->RegisterObjectMethod("TileMap2D", "TileMapInfo2D@ get_info() const", asMETHOD(TileMap2D, GetInfo), asCALL_THISCALL);
     engine->RegisterObjectMethod("TileMap2D", "uint get_numLayers() const", asMETHOD(TileMap2D, GetNumLayers), asCALL_THISCALL);
     engine->RegisterObjectMethod("TileMap2D", "TileMapLayer2D@ GetLayer(uint) const", asMETHOD(TileMap2D, GetLayer), asCALL_THISCALL);
 }

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

@@ -65,10 +65,11 @@ void TileMap2D::SetTmxFile(TmxFile2D* tmxFile)
     }
 
     tmxFile_ = tmxFile;
-    
     if (!tmxFile_)
         return;
 
+    info_ = tmxFile_->GetInfo();
+
     unsigned numLayers = tmxFile_->GetNumLayers();
     layers_.Resize(numLayers);
 
@@ -80,7 +81,7 @@ void TileMap2D::SetTmxFile(TmxFile2D* tmxFile)
         layerNode->SetTemporary(true);
 
         SharedPtr<TileMapLayer2D> layer(layerNode->CreateComponent<TileMapLayer2D>());
-        layer->SetTmxLayer(tmxLayer);
+        layer->Initialize(this, tmxLayer);
         layer->SetDrawOrder(i * 10);
 
         layers_[i] = layer;
@@ -92,32 +93,6 @@ TmxFile2D* TileMap2D::GetTmxFile() const
     return tmxFile_;
 }
 
-Orientation2D TileMap2D::GetOrientation() const
-{
-    return tmxFile_ ? tmxFile_->GetOrientation() : O_ORTHOGONAL;
-}
-
-int TileMap2D::GetWidth() const
-{
-    return tmxFile_ ? tmxFile_->GetWidth() : 0;
-}
-
-int TileMap2D::GetHeight() const
-{
-    return tmxFile_ ? tmxFile_->GetHeight() : 0;
-
-}
-
-float TileMap2D::GetTileWidth() const
-{
-    return tmxFile_ ? tmxFile_->GetTileWidth() : 0.0f;
-}
-
-float TileMap2D::GetTileHeight() const
-{
-    return tmxFile_ ? tmxFile_->GetTileHeight() : 0.0f;
-}
-
 TileMapLayer2D* TileMap2D::GetLayer(unsigned index) const
 {
     if (index >= layers_.Size())

+ 4 - 10
Source/Engine/Urho2D/TileMap2D.h

@@ -49,16 +49,8 @@ public:
 
     /// Return tmx file.
     TmxFile2D* GetTmxFile() const;
-    /// Return orientation.
-    Orientation2D GetOrientation() const;
-    /// Return width.
-    int GetWidth() const;
-    /// Return height.
-    int GetHeight() const;
-    /// Return tile width
-    float GetTileWidth() const;
-    /// Return tile height in pixel.
-    float GetTileHeight() const;
+    /// Return information.
+    const TileMapInfo2D& GetInfo() const { return info_; }
     /// Return number of layers.
     unsigned GetNumLayers() const { return layers_.Size(); }
     /// Return tile map layer at index.
@@ -72,6 +64,8 @@ public:
 private:
     /// Tmx file.
     SharedPtr<TmxFile2D> tmxFile_;
+    /// Tile map information.
+    TileMapInfo2D info_;
     /// Tile map layers.
     Vector<SharedPtr<TileMapLayer2D> > layers_;
 };

+ 26 - 0
Source/Engine/Urho2D/TileMapDefs2D.cpp

@@ -119,4 +119,30 @@ const String& TileObject2D::GetProperty(const String& name) const
     return propertySet_->GetProperty(name);
 }
 
+Vector2 IndexToPosition2D(int x, int y, const TileMapInfo2D& tileMapInfo)
+{
+    if (tileMapInfo.orientation_ == O_ORTHOGONAL)
+        return Vector2((x + 0.5f) * tileMapInfo.tileWidth_, (y + 0.5f) * tileMapInfo.tileHeight_);
+    else
+        return Vector2(((x + y) + 0.5f) * tileMapInfo.tileWidth_ * 0.5f, (tileMapInfo.height_ - (x - y) + 0.5f) * tileMapInfo.tileHeight_ * 0.5f);
+}
+
+bool PositionToIndex2D(int& x, int& y, const Vector2& position, const TileMapInfo2D& tileMapInfo)
+{
+    if (tileMapInfo.orientation_ == O_ORTHOGONAL)
+    {
+        x = (int)(position.x_ / tileMapInfo.tileWidth_);
+        y = (int)(position.y_ / tileMapInfo.tileHeight_);
+    }
+    else
+    {
+        int sum = (int)(position.x_ * 2.0f / tileMapInfo.tileWidth_);
+        int dif = (int)(tileMapInfo.height_ - position.y_ * 2.0f / tileMapInfo.tileHeight_);
+        x = (sum + dif) / 2;
+        y = (sum - dif) / 2;
+    }
+
+    return x >= 0 && x < tileMapInfo.width_ && y >= 0 && y < tileMapInfo.height_;
+}
+
 }

+ 24 - 0
Source/Engine/Urho2D/TileMapDefs2D.h

@@ -39,6 +39,26 @@ enum Orientation2D
     O_ISOMETRIC
 };
 
+/// Tile map infomation.
+struct URHO3D_API TileMapInfo2D
+{
+    /// Orientation.
+    Orientation2D orientation_;
+    /// Width.
+    int width_;
+    /// Height.
+    int height_;
+    /// Tile width.
+    float tileWidth_;
+    /// Tile height.
+    float tileHeight_;
+
+    /// Return map width.
+    float GetMapWidth() const { return width_ * tileWidth_; }
+    /// return map height.
+    float GetMapHeight() const { return height_ * tileHeight_;}
+};
+
 /// Tile map layer type.
 enum TileMapLayerType2D
 {
@@ -159,5 +179,9 @@ private:
     SharedPtr<PropertySet2D> propertySet_;
 };
 
+/// Convert index to position.
+URHO3D_API Vector2 IndexToPosition2D(int x, int y, const TileMapInfo2D& tileMapInfo);
+/// Convert position to index, if out of range return false.
+URHO3D_API bool PositionToIndex2D(int& x, int& y, const Vector2& position, const TileMapInfo2D& tileMapInfo);
 
 }

+ 13 - 20
Source/Engine/Urho2D/TileMapLayer2D.cpp

@@ -25,7 +25,7 @@
 #include "Node.h"
 #include "ResourceCache.h"
 #include "StaticSprite2D.h"
-#include "TileMapLayer2D.h"
+#include "TileMap2D.h"
 #include "TileMapLayer2D.h"
 #include "TmxFile2D.h"
 
@@ -51,9 +51,9 @@ void TileMapLayer2D::RegisterObject(Context* context)
     context->RegisterFactory<TileMapLayer2D>();
 }
 
-void TileMapLayer2D::SetTmxLayer(const TmxLayer2D* tmxLayer)
+void TileMapLayer2D::Initialize(TileMap2D* tileMap, const TmxLayer2D* tmxLayer)
 {
-    if (tmxLayer == tmxLayer_)
+    if (tileMap == tileMap_ && tmxLayer == tmxLayer_)
         return;
 
     if (tmxLayer_)
@@ -71,6 +71,7 @@ void TileMapLayer2D::SetTmxLayer(const TmxLayer2D* tmxLayer)
     objectGroup_ = 0;
     imageLayer_ = 0;
     
+    tileMap_ = tileMap;
     tmxLayer_ = tmxLayer;
     
     if (!tmxLayer_)
@@ -129,6 +130,11 @@ void TileMapLayer2D::SetVisible(bool visible)
     }
 }
 
+TileMap2D* TileMapLayer2D::GetTileMap() const
+{
+    return tileMap_;
+}
+
 bool TileMapLayer2D::HasProperty(const String& name) const
 {
     if (!tmxLayer_)
@@ -225,16 +231,7 @@ void TileMapLayer2D::SetTileLayer(const TmxTileLayer2D* tileLayer)
     nodes_.Resize(width * height);
 
     TmxFile2D* tmxFile = tileLayer->GetTmxFile();
-    Orientation2D orientation = tmxFile->GetOrientation();
-
-    float scaleX = tmxFile->GetTileWidth();
-    float scaleY = tmxFile->GetTileHeight();
-    
-    if (orientation == O_ISOMETRIC)
-    {
-        scaleX *= 0.5f;
-        scaleY *= 0.5f;
-    }
+    const TileMapInfo2D& info = tmxFile->GetInfo();
 
     for (int y = 0; y < height; ++y)
     {
@@ -246,10 +243,7 @@ void TileMapLayer2D::SetTileLayer(const TmxTileLayer2D* tileLayer)
 
             SharedPtr<Node> tileNode(GetNode()->CreateChild("Tile"));
             tileNode->SetTemporary(true);
-            if (orientation == O_ORTHOGONAL)
-                tileNode->SetPosition(Vector3((x + 0.5f) * scaleX, (y + 0.5f) * scaleY, 0.0f));
-            else if (orientation == O_ISOMETRIC)
-                tileNode->SetPosition(Vector3(((x + y) + 0.5f) * scaleX, (height - (x - y) + 0.5f) * scaleY, 0.0f));
+            tileNode->SetPosition(IndexToPosition2D(x, y, info));
 
             StaticSprite2D* staticSprite = tileNode->CreateComponent<StaticSprite2D>();
             staticSprite->SetSprite(tile->GetSprite());
@@ -298,12 +292,11 @@ void TileMapLayer2D::SetImageLayer(const TmxImageLayer2D* imageLayer)
         return;
 
     TmxFile2D* tmxFile = imageLayer->GetTmxFile();
-    int height = tmxFile->GetHeight();
-    float tileHeight = tmxFile->GetTileHeight();
+    float mapHeight = tmxFile->GetInfo().GetMapHeight();
 
     SharedPtr<Node> imageNode(GetNode()->CreateChild("Tile"));
     imageNode->SetTemporary(true);
-    imageNode->SetPosition(Vector3(0.0f, height * tileHeight, 0.0f));
+    imageNode->SetPosition(Vector3(0.0f, mapHeight, 0.0f));
 
     StaticSprite2D* staticSprite = imageNode->CreateComponent<StaticSprite2D>();
     staticSprite->SetSprite(imageLayer->GetSprite());

+ 7 - 2
Source/Engine/Urho2D/TileMapLayer2D.h

@@ -29,6 +29,7 @@ namespace Urho3D
 {
 
 class Node;
+class TileMap2D;
 class TmxImageLayer2D;
 class TmxLayer2D;
 class TmxObjectGroup2D;
@@ -47,13 +48,15 @@ public:
     /// Register object factory.
     static void RegisterObject(Context* context);
 
-    /// Set tmx layer.
-    void SetTmxLayer(const TmxLayer2D* tmxLayer);
+    /// Initialize with tile map and tmx layer.
+    void Initialize(TileMap2D* tileMap, const TmxLayer2D* tmxLayer);
     /// Set draw order
     void SetDrawOrder(int drawOrder);
     /// Set visible.
     void SetVisible(bool visible);
 
+    /// Return tile map.
+    TileMap2D* GetTileMap() const;
     /// Return tmx layer.
     const TmxLayer2D* GetTmxLayer() const { return tmxLayer_; }
     /// Return draw order.
@@ -94,6 +97,8 @@ private:
     /// Set image layer.
     void SetImageLayer(const TmxImageLayer2D* imageLayer);
 
+    /// Tile map.
+    WeakPtr<TileMap2D> tileMap_;
     /// Tmx layer.
     const TmxLayer2D* tmxLayer_;
     /// Tile layer.

+ 8 - 12
Source/Engine/Urho2D/TmxFile2D.cpp

@@ -154,7 +154,7 @@ bool TmxObjectGroup2D::Load(const XMLElement& element)
 {
     LoadInfo(element);
    
-    const float mapHeight = height_ * tmxFile_->GetTileHeight();
+    const float mapHeight = height_ * tmxFile_->GetInfo().tileHeight_;
 
     for (XMLElement objectElem = element.GetChild("object"); objectElem; objectElem = objectElem.GetNext("object"))
     {
@@ -263,11 +263,7 @@ Sprite2D* TmxImageLayer2D::GetSprite() const
 }
 
 TmxFile2D::TmxFile2D(Context* context) :
-    Resource(context),
-    width_(0),
-    height_(0),
-    tileWidth_(0.0f),
-    tileHeight_(0.0f)
+    Resource(context)
 {
 }
 
@@ -353,19 +349,19 @@ bool TmxFile2D::EndLoad()
 
     String orientation = rootElem.GetAttribute("orientation");
     if (orientation == "orthogonal")
-        orientation_ = O_ORTHOGONAL;
+        info_.orientation_ = O_ORTHOGONAL;
     else if (orientation == "isometric")
-        orientation_ = O_ISOMETRIC;
+        info_.orientation_ = O_ISOMETRIC;
     else
     {
         LOGERROR("Invalid orientation type " + orientation);
         return false;
     }
 
-    width_ = rootElem.GetInt("width");
-    height_ = rootElem.GetInt("height");
-    tileWidth_ = rootElem.GetFloat("tilewidth") * PIXEL_SIZE;
-    tileHeight_ = rootElem.GetFloat("tileheight") * PIXEL_SIZE;
+    info_.width_ = rootElem.GetInt("width");
+    info_.height_ = rootElem.GetInt("height");
+    info_.tileWidth_ = rootElem.GetFloat("tilewidth") * PIXEL_SIZE;
+    info_.tileHeight_ = rootElem.GetFloat("tileheight") * PIXEL_SIZE;
 
     for (unsigned i = 0; i < layers_.Size(); ++i)
         delete layers_[i];

+ 4 - 20
Source/Engine/Urho2D/TmxFile2D.h

@@ -153,16 +153,8 @@ public:
     /// Finish resource loading. Always called from the main thread. Return true if successful.
     virtual bool EndLoad();
 
-    /// Return orientation.
-    Orientation2D GetOrientation() const { return orientation_; }
-    /// Return width in tiles.
-    int GetWidth() const { return width_; }
-    /// Return height in tiles.
-    int GetHeight() const { return height_; }
-    /// Return tile width.
-    float GetTileWidth() const { return tileWidth_; }
-    /// Return tile height.
-    float GetTileHeight() const { return tileHeight_; }
+    /// Return information.
+    const TileMapInfo2D& GetInfo() const { return info_; }
     /// Return tile sprite by gid, if not exist return 0.
     Sprite2D* GetTileSprite(int gid) const;
     /// Return tile property set by gid, if not exist return 0.
@@ -182,16 +174,8 @@ private:
     SharedPtr<XMLFile> loadXMLFile_;
     /// TSX name to XML file mapping.
     HashMap<String, SharedPtr<XMLFile> > tsxXMLFiles_;
-    /// Orientation type.
-    Orientation2D orientation_;
-    /// Width.
-    int width_;
-    /// Height.
-    int height_;
-    /// Tile width.
-    float tileWidth_;
-    /// Tile height.
-    float tileHeight_;
+    /// Tile map information.
+    TileMapInfo2D info_;
     /// Tile set textures.
     Vector<SharedPtr<Texture2D> > tileSetTextures_;
     /// Gid to tile sprite mapping.

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

@@ -98,8 +98,9 @@ void Urho2DTileMap::CreateScene()
     tileMap->SetTmxFile(tmxFile);
 
     // Set camera's position
-    float x = tileMap->GetWidth() * tileMap->GetTileWidth() * 0.5f;
-    float y = tileMap->GetHeight() * tileMap->GetTileHeight() * 0.5f;
+    const TileMapInfo2D& info = tileMap->GetInfo();
+    float x = info.GetMapWidth() * 0.5f;
+    float y = info.GetMapHeight() * 0.5f;
     cameraNode_->SetPosition(Vector3(x, y, -10.0f));
 }