瀏覽代碼

Add index to position convert function in TileMap2D

aster2013 11 年之前
父節點
當前提交
a2ead6f404

+ 9 - 0
Source/Engine/LuaScript/pkgs/Urho2D/TileMap2D.pkg

@@ -7,8 +7,17 @@ class TileMap2D : Component
     const TileMapInfo2D& GetInfo() const;
     unsigned GetNumLayers() const;
     TileMapLayer2D* GetLayer(unsigned index) const;
+    Vector2 IndexToPosition(int x, int y) const;
+    tolua_outside bool TileMap2DPositionToIndex @ PositionToIndex(const Vector2& position, int* x = 0, int* y = 0) const;
 
     tolua_property__get_set TmxFile2D* tmxFile;
     tolua_readonly tolua_property__get_set TileMapInfo2D& info;
     tolua_readonly tolua_property__get_set unsigned numLayers;
 };
+
+${
+static bool TileMap2DPositionToIndex(const TileMap2D* tileMap, const Vector2& position, int* x, int* y)
+{
+    return tileMap->PositionToIndex(*x, *y, position);
+}
+$}

+ 2 - 0
Source/Engine/Script/Urho2DAPI.cpp

@@ -293,6 +293,8 @@ static void RegisterTileMap2D(asIScriptEngine* engine)
     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);
+    engine->RegisterObjectMethod("TileMap2D", "Vector2 IndexToPosition(int, int) const", asMETHOD(TileMap2D, IndexToPosition), asCALL_THISCALL);
+    engine->RegisterObjectMethod("TileMap2D", "bool PositionToIndex(int&out x, int &out y, const Vector2&in) const", asMETHOD(TileMap2D, PositionToIndex), asCALL_THISCALL);
 }
 
 static void RegisterRigidBody2D(asIScriptEngine* engine)

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

@@ -101,6 +101,16 @@ TileMapLayer2D* TileMap2D::GetLayer(unsigned index) const
     return layers_[index];
 }
 
+Vector2 TileMap2D::IndexToPosition(int x, int y) const
+{
+    return IndexToPosition2D(x, y, info_);
+}
+
+bool TileMap2D::PositionToIndex(int& x, int& y, const Vector2& position) const
+{
+    return PositionToIndex2D(x, y, position, info_);
+}
+
 void TileMap2D::SetTmxFileAttr(ResourceRef value)
 {
     ResourceCache* cache = GetSubsystem<ResourceCache>();

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

@@ -55,6 +55,10 @@ public:
     unsigned GetNumLayers() const { return layers_.Size(); }
     /// Return tile map layer at index.
     TileMapLayer2D* GetLayer(unsigned index) const;
+    /// Convert index to position.
+    Vector2 IndexToPosition(int x, int y) const;
+    /// Convert position to index, if out of map return false.
+    bool PositionToIndex(int& x, int& y, const Vector2& position) const;
 
     /// Set tile map file attribute.
     void SetTmxFileAttr(ResourceRef value);

+ 1 - 4
Source/Engine/Urho2D/TileMapLayer2D.cpp

@@ -230,9 +230,6 @@ void TileMapLayer2D::SetTileLayer(const TmxTileLayer2D* tileLayer)
     int height = tileLayer->GetHeight();
     nodes_.Resize(width * height);
 
-    TmxFile2D* tmxFile = tileLayer->GetTmxFile();
-    const TileMapInfo2D& info = tmxFile->GetInfo();
-
     for (int y = 0; y < height; ++y)
     {
         for (int x = 0; x < width; ++x)
@@ -243,7 +240,7 @@ void TileMapLayer2D::SetTileLayer(const TmxTileLayer2D* tileLayer)
 
             SharedPtr<Node> tileNode(GetNode()->CreateChild("Tile"));
             tileNode->SetTemporary(true);
-            tileNode->SetPosition(IndexToPosition2D(x, y, info));
+            tileNode->SetPosition(tileMap_->IndexToPosition(x, y));
 
             StaticSprite2D* staticSprite = tileNode->CreateComponent<StaticSprite2D>();
             staticSprite->SetSprite(tile->GetSprite());