遍历 TiledMap 中的对象层,并取得所有坐标
1 -- 将心心添加到背景层中 2 function BackgroundLayer:addHeart( ) 3 -- body 4 -- getObjectGroup 方法从地图中获取到指定的对象层(也就是个 ObjectGroup 对象组对象), 5 -- 对象组 ObjectGroup 中包含了多个对象, 6 -- 所以我们可以通过 getObjects 方法从 ObjectGroup 中获得所有的对象。 7 -- objects 在这里就相当于一个存放了多个对象的数组。 8 local objects = self.map:getObjectGroup("heart"):getObjects() 9 10 -- dict 是个临时变量,用它来存储单个的对象;table.getn 方法能得到数组的长度11 local dict = nil12 local i = 013 local len = table.getn(objects)14 15 -- 遍历 objects 数组16 for i = 0, len - 1, 1 do17 dict = objects[i + 1]18 -- 如果对象 dict 为空,则跳出 for 循环19 if dict == nil then20 break21 end22 -- 取出相应的属性值,即对象坐标。因为对象组中的对象在 TMX 文件中是以键值对的形式存在的,23 -- 所以我们可以通过它的 key 得到相应的 value。24 local key = "x"25 local x = dict["x"]26 key = "y"27 local y = dict["y"]28 29 -- 在获取到的坐标上创建 Heart 对象,并把它添加到 TiledMap 背景层上。30 -- 这样创建的心心才能跟随着背景层的滚动而滚动。31 local sprite = Heart.new(x, y)32 self.map:addChild(sprite)33 end34 35 end
可以封装这个函数
1 -- 封装加载函数 2 function BackgroundLayer:addBody( objectGroupName, class ) 3 -- body 4 local objects = self.map:getObjectGroup(objectGroupName):getObjects() 5 local dict = nil 6 local i = 0 7 local len = table.getn(objects) 8 9 for i = 0, len - 1, 1 do10 dict = objects[i + 1]11 12 if dict == nil then13 break14 end15 16 local key = "x"17 local x = dict["x"]18 key = "y"19 local y = dict["y"]20 21 local sprite = class.new(x, y)22 self.map:addChild(sprite)23 24 -- 在创建鸟这个游戏对象时,我们需要把所有的鸟都添加到定义的 self.bird 数组中。25 -- 所以在 addBody 方法中,我们需要加上一则判断:26 -- 即当创建的对象是鸟(bird)时,就把该对象插入 self.bird27 if objectGroupName == "bird" then28 table.insert(self.bird, sprite)29 end30 31 end32 end
addHeart方法的作用是遍历 TiledMap 中的 heart 对象层,取得该对象层中所有对象的坐标,并在该坐标上创建一个个心心对象。下面我们具体的讲解下代码,当然,可能结合下图要更容易理解点。
- getObjectGroup 方法从地图中获取到指定的对象层(也就是个 ObjectGroup 对象组对象),对象组 ObjectGroup 中包含了多个对象,所以我们可以通过 getObjects 方法从 ObjectGroup 中获得所有的对象。objects 在这里就相当于一个存放了多个对象的数组。
- dict 是个临时变量,用它来存储单个的对象;table.getn 方法能得到数组的长度。
- 遍历 objects 数组。
- 如果对象 dict 为空,则跳出 for 循环。
- 取出相应的属性值,即对象坐标。因为对象组中的对象在 TMX 文件中是以键值对的形式存在的,所以我们可以通过它的 key 得到相应的 value。
- 在获取到的坐标上创建 Heart 对象,并把它添加到 TiledMap 背景层上。这样创建的心心才能跟随着背景层的滚动而滚动。
之后,在程序中调用 addHeart,我们就可以创建出一系列的奖励品了。