6.6.3 地图物体层CCTMXObjectGroup
下面来看类CCTMXObjectGroup的公共函数。
代码6-5 类CCTMXObjectGroup的公共成员方法
1. //得到物体层的偏移量
2. virtual const CCPoint & getPositionOffset (void)
3.
4. //设置物体层的偏移量
5. virtual void setPositionOffset (const CCPoint &var)
6.
7. //获得物体层的属性字典
8. virtual CCDictionary * getProperties (void)
9.
10. //设置物体层的属性字典
11. virtual void setProperties (CCDictionary *var)
12.
13. //获得物体层中的物体对象
14. virtual CCArray * getObjects (void)
15.
16. //设置物体层中的物体对象
17. virtual void setObjects (CCArray *var)
18.
19. //构造函数
20. CCTMXObjectGroup ()
21.
22. //析构函数
23. virtual ~CCTMXObjectGroup ()
24.
25. //返回物体层的名字
26. const char * getGroupName ()
27.
28. //设置物体层的名字
29. void setGroupName (const char *groupName)
30.
31. //获得指定属性的数值
32. CCString * propertyNamed (const char *propertyName)
33.
34. //根据属性名字,返回属性字典
35. CCDictionary * objectNamed (const char *objectName)
上述代码6-5展示了物体层类CCTMXObjectGroup的公共成员方法。与拼图图层相比,它的方法更为少了一些,也更为简单。有了之前对于图层类CCTMXLayer的理解,这些函数读者通过注释也能猜出它们的作用了。此类中的函数都是依据物理层所包含的数据来设计的。其中函数propertyNamed就是根据属性的名字来获得具体数值的。另一个函数objectNamed则是根据对象的名字来返回一个可变的字典容器,当中保存了所有的对象。
至此为止,已经为读者介绍了Cocos2D-X引擎当中几乎所有的与拼接地图有关的类以及它们的函数。在熟悉了上述内容之后,我们就可以进行最后一步,通过编码,将原来在Tile Map编辑器中拼接的地图背景显示到界面当中。
6.7 示例项目
前面已经全面透彻地为读者介绍了Cocos2D-X引擎当中与砖块地图有关类和函数,读者也明白了砖块地图拼接技术的实现原理。说了很多的理论,也做了许多拼接地图,是时候来为读者展示一些示例项目了。希望通过以下的内容,可以加速读者消化吸收刚刚掌握的知识。
代码6-6 isometric拼接地图的使用
1. //初始化函数
2. TMXIsoObjectsTest::TMXIsoObjectsTest()
3. {
4. //创建地图对象
5. CCTMXTiledMap* map = CCTMXTiledMap::create("TileMaps/iso-test-objectgroup.tmx");
6. addChild(map, -1, kTagTileMap);
7.
8. CCSize s = map->getContentSize();
9. ----UXLOG("ContentSize: %f, %f", s.width,s.height);
10. //获得物体层
11. CCTMXObjectGroup* group = map->objectGroupNamed("Object Group 1");
12.
13. //UxMutableArray* objects = group->objects();
14. CCArray* objects = group->getObjects();
15. //UxMutableDictionary<std::string>* dict;
16. CCDictionary* dict;
17. CCObject* pObj = NULL;
18. //遍历物体层中的每一个物体对象
19. CCARRAY_FOREACH(objects, pObj)
20. {
21. dict = (CCDictionary*)pObj;
22.
23. if(!dict)
24. break;
25.
26. ----UXLOG("object: %x", dict);
27. }
28. }
29. //绘制函数
30. void TMXIsoObjectsTest::draw()
31. {
32. CCTMXTiledMap *map = (CCTMXTiledMap*) getChildByTag(kTagTileMap);
33. CCTMXObjectGroup *group = map->objectGroupNamed("Object Group 1");
34.
35. CCArray* objects = group->getObjects();
36. CCDictionary* dict;
37. CCObject* pObj = NULL;
38. CCARRAY_FOREACH(objects, pObj)
39. {
40. //绘制物体层中的每一个物体对象
41. dict = (CCDictionary*)pObj;//dynamic_cast<CCStringToStringDictionary*>(*it);
42.
43. if(!dict)
44. break;
45. const char* key = "x";
46. int x = ((CCString*)dict->objectForKey(key))->intValue();//dynamic_cast<NSNumber*> (dict->objectForKey("x"))->getNumber();
47. key = "y";
48. int y = ((CCString*)dict->objectForKey(key))->intValue();//dynamic_cast<NSNumber*> (dict->objectForKey("y"))->getNumber();
49. key = "width";
50. int width = ((CCString*)dict->objectForKey(key))->intValue();//dynamic_cast <NSNumber*> (dict->objectForKey("width"))->getNumber();
51. key = "height";
52. int height = ((CCString*)dict->objectForKey(key))->intValue();//dynamic_cast <NSNumber*>(dict->objectForKey("height"))->getNumber();
53. //通过几何绘制,来描绘物体
54. glLineWidth(3);
55.
56. ccDrawLine( ccp(x,y), ccp(x+width,y) );
57. ccDrawLine( ccp(x+width,y), ccp(x+width,y+height) );
58. ccDrawLine( ccp(x+width,y+height), ccp(x,y+height) );
59. ccDrawLine( ccp(x,y+height), ccp(x,y) );
60.
61. glLineWidth(1);
62. }
63. }
上述代码6-6正是将图6-8中所示地图背景在代码中的使用方法。这些代码来自Cocos2D-X引擎当中的TileMapTest示例项目。按照代码中的顺序,接下来为读者介绍其中一些主要的内容。
在此类的构造函数当中,创建了一个地图对象。创建地图对象的方法很简单。函数create的参数正是Tile MapEditor的地图数据文件。至于地图中所使用的砖块纹理图片,则会一同加载至内存当中。然后,在地图对象中调用函数objectGroupNamed来获得地图对象中的物体层。代码中的函数draw,则是根据物体对象的位置以及大小的属性,在屏幕中绘制一个边框将物体对象描述出来。这样的话,在示例项目运行时,就能看到与编辑器中一样的画面效果。
其实读者仔细分析上面的代码,其中没有复杂的内容。有了之前的理论铺垫,现在使用起来非常的顺手。关于拼接地图的创建函数也有两行。一行代码创建地图对象,另一行代码添加到显示界面中。远比在自制引擎中我们所做的工作少了很多。这主要得益于Cocos2D-X引擎为开发者通过简单的函数却提供了强大的功能。在使用拼接地图时,只需要短短几行代码就可以将其显示在游戏界面当中。下图正是上述示例项目的运行画面。
图6-18展示了本章节一直使用的一个地图背景。读者可以看到与Tile MapEditor中拼接地图一样的画面效果。不仅如此,在示例项目中,读者还可以通过拖拽动作来查看地图背景的每个角落。这只是一个简单的背景地图,甚至它单调的颜色,都很难用在哪款游戏当中,只不过是作为样例为读者介绍45度视角的拼接地图。选择一个没有什么画面效果的拼接地图,这纯粹是为了方便介绍Cocos2D-X引擎中拼接地图的用法。45度拼接地图,容易让人产生空间的视觉效果。因此,我们再为读者展示一个Cocos2D引擎当中的示例项目。其本身所使用的技术以及方法,与我们刚刚介绍的内容是一样的,只是在画面表现上具备了层次感,如图6-19所示。
图6-19所示的画面仍然是来自Cocos2D-X引擎当中的TileMapTest示例项目。此示例项目是为了展示拼接地图的遮挡效果。这些遮挡效果是通过砖块以及精灵的z轴坐标来实现的。从上图中,读者就可以清楚看出45度拼接地图所带来的空间纵深感。在一片白色树木中,还站着一个精灵对象。画面中体现的层次感都是根据45度拼接地图中的z坐标的顺序来实现的。这与之前的示例项目,在实现技术上并没有区别,只是使用了不同的纹理图片而已,因此就不在此处浪费篇幅了,感情兴趣的读者可以去看到Cocos2D-X引擎中的示例代码。
不过还有一些内容没有给读者介绍。在游戏当中,地图背景通常都不会静止不动,要不就是横向滚轴,要不就是纵向滚轴,也有可能是全屏的滚动。固定背景的游戏,已经随着《贪吃蛇》而被历史铭记了。因此接下来,将会为读者介绍游戏背景滚动以及精灵移动的方法。