cocos2d-x 2D砖块地图实现技术之四

来源:互联网 发布:p2psearcher软件下载 编辑:程序博客网 时间:2024/05/16 17:14

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引擎中的示例代码。

不过还有一些内容没有给读者介绍。在游戏当中,地图背景通常都不会静止不动,要不就是横向滚轴,要不就是纵向滚轴,也有可能是全屏的滚动。固定背景的游戏,已经随着《贪吃蛇》而被历史铭记了。因此接下来,将会为读者介绍游戏背景滚动以及精灵移动的方法。

原创粉丝点击