cocos2d 大型地图_cocos2d 地图 - CSDN
  • Cocos2d-x大型地图

    2014-03-31 21:08:51
    cocos2d-x中,瓦片地图一般是用TileMap方案实现 对于Tiled的使用,本文不做介绍,本文着重介绍下cocos2dx中瓦片地图的使用 首先,我们需要知道几个类:CCTMXTiledMap、CCTMXLayer、CCTMXObjectGroup CCTMXTiledMap...

    在cocos2d-x中,瓦片地图一般是用TileMap方案实现

    对于Tiled的使用,本文不做介绍,本文着重介绍下cocos2dx中瓦片地图的使用

    首先,我们需要知道几个类:CCTMXTiledMap、CCTMXLayer、CCTMXObjectGroup

    CCTMXTiledMap代表一个完整的瓦片地图,它负责地图文件的载入、管理以及呈现。CCTMXLayer代表一个瓦片地图中的图层,可以从图层对象获取图层信息,其隶属于CCTMXTiledMap。CCTMXObjectGroup是地图精灵类,用于代表地图中的精灵组。

    对于这三个类的常见函数如下

    1.CCTMXTiledMap

    create(const char *tmxFile)

    createWithXML(const char *tmxString, const char *resourcePath)

    getMapOrientation

    getMapSize(void)

    getObjectGroups(void)

    getProperties(void)

    getTileSize(void)

    initWithTMXFile(const char *tmxFile)

    initWithXML(const char *tmxString, const char *resourcePath)

    layerNamed(const char *layerName)

    objectGroupNamed(const char *groupName)

    propertyNamed(const char *propertyName)

    propertiesForGID(int GID)

    函数意思比较简单,在此补做过多介绍。当然既然有getter访问器,自然也有setter访问器,在此就不列出了.

    2.CCTMXLayer

    get/setLayerSize

    get/setMapTileSize

    get/setTileSet

    get/setProperties

    releaseMap

    tileAt

    tileGIDAt

    setTileGID

    removeTileA:根据横纵坐标索引删除该位置图素

    positionAt:根据图素横纵坐标索引获取图素位置

    setuptiles::创建设置空像素

    propertyNamed:根据属性名称获得属性值

    3.CCTMXObjectGroup

    get/setPositionOffset

    get/setObjects

    get/setGroupName

    get/setProperties

    objectNamed

    propertyNamed

     在此补充下坐标和图素行列数的转换

    indexx=Point.x/map->getTileSize.width;

    indexy=map->getMapSIze().height-(Point.y)/map->getTileSize().height

    简单来说,就是具体位置除以图素的宽高,不过由于地图中的的行列数是从上到下,而cocos2dx中是从下到上,所以有个小小的转换。

    展开全文
  • Part 7:Cocos2d-x开发实战-Cocos中的瓦片地图讲师介绍: 关东升,技术总监/研发总监,一个在IT领域摸爬滚打20多年的老程序员、软件架构师、高级培训讲师、IT作家。 熟悉Java、Kotlin、Python、iOS、Android、游戏...

    Part 7:Cocos2d-x开发实战-Cocos中的瓦片地图

    讲师介绍: 
    关东升,技术总监/研发总监,一个在IT领域摸爬滚打20多年的老程序员、软件架构师、高级培训讲师、IT作家。 熟悉Java、Kotlin、Python、iOS、Android、游戏开发、数据库开发与设计、软件架构设计等多种IT技术。 参与设计和开发北京市公交一卡通百亿级大型项目,开发国家农产品追溯系统、金融系统微博等移动客户端项目。 近期为中国移动、中国联通、南方航空、中石油、工商银行、平安银行和天津港务局等企事业单位授课。 著有《Java从小白到大牛》、《Kotlin从小白到大牛》、《iOS开发指南》、《Android网络游戏开发实战》、《Cocos2d-x实战》系列和《JSP网络程序设计》等40多部计算机书籍。

    课程介绍: 
    介绍瓦片地图在解决大背景问题的优势。也能够掌握使用瓦片地图工具制作瓦片地图。熟悉Cocos2d-x中瓦片地图的API。

    第一章:地图性能问题第一节地图性能问题第二节关于图片格式的问题 

    第二章:使用瓦片地图 第一节Cocos2d-x中瓦片地图API 

    第三章:实例 忍者无敌

    课程特色: 
    专属答疑+课件资料提供+视频无限时回放+VIP交流群

    开课时间: 
    随到随学,自由支配

    点我试看: http://edu.csdn.net/course/detail/2178?utm_source=blog11

    展开全文
  • 大型地图肯定不能一次绘制,我的方法是运用缓存然后绘制出“看得到”的地图部分。· 地图分为很多张屏幕大小的图片,在我这里是1000*500,每次只需要绘制四张图片必然能包括屏幕的所有范围,如图: 中间的黑色线框...

    上次向大家介绍了底层的地图逻辑,这次来看看视觉层面,也就是地图图片的绘制。

    大型地图肯定不能一次绘制,我的方法是运用缓存然后绘制出“看得到”的地图部分。

    · 地图分为很多张屏幕大小的图片,在我这里是1000*500,每次只需要绘制四张图片必然能包括屏幕的所有范围,如图:

    这里写图片描述
    中间的黑色线框为屏幕,黑白色的方块为地图图片

    下面是具体实现:

    #ifndef _VISION_MAP_H_
    #define _VISION_MAP_H_
    #include"GlobalEntity.h"
    #include"NullSprite.h"
    #include"Hero.h"
    using namespace cocos2d;
    
    #define MAX_VISION_LAND 10
    #define MAX_VISION_PLANTS 10
    #define MAP_Z_ORDER 0
    #define LAND_Z_ORDER 10
    #define CONTROLLER_Z_ORDER 100
    #define VISION_FPS 40
    //from 0 to 401 are entities' Z-ORDERs
    typedef std::function<void()> VisionMapCB;//回调函数对象
    
    class VisionMap:public Layer
    {
    public:
        VisionMap();
        ~VisionMap();
        virtual bool init();
        CREATE_FUNC(VisionMap);
        void handleMessage();
        virtual bool setCache();
        bool drawMap();
        void clearCache();
        void scheduleFunc(float fl);
        void getVisionLand();
        void getVisionPlant();
    protected:
        static Point _lastHeroPosition;
    private:
        Sprite* _displayedMap[4];
        Vector<Sprite*> _displayedLand;
        Vector<Sprite*> _displayedPlant;
        bool _firstDraw;
        Hero* _hero;
    };
    
    
    
    #endif

    · 消息处理器和init里的初始化暂且不表,先看加载缓存:

    bool VisionMap::setCache()
    {
        //normal map Img
        for (int i = 0; i < 4; i++)
        {
            Texture2D* texture = Director::getInstance()->getTextureCache()->addImage(String::createWithFormat("Environment_%d.png", i)->getCString());
            auto spriteBatchNode = SpriteBatchNode::createWithTexture(texture);
            this->addChild(spriteBatchNode);
            SpriteFrameCache::getInstance()->addSpriteFramesWithFile(String::createWithFormat("Environment_%d.plist", i)->getCString(),
                String::createWithFormat("Environment_%d.png", i)->getCString());
        }
        //end
    
        //land Img test
        auto pSpriteFrame = SpriteFrame::create("land_0.png", Rect(0, 0, 200, 200));
        SpriteFrameCache::getInstance()->addSpriteFrame(pSpriteFrame, "land_0.png");
        //end
    
        return true;
    }

    此处使用了texturePacker把图片压缩,land的美术资源还没画好,先用圆形代替,以便测试碰撞检测

    · 重点来了,地图的绘制:

    bool VisionMap::drawMap()
    {
        int col = (int)(_hero->getPosition().x*RECT_SIZE - HERO_LOCATION_SCREEN.x) / IMG_WIDTH;
        int row = (int)(_hero->getPosition().y*RECT_SIZE - HERO_LOCATION_SCREEN.y) / IMG_HEIGHT;
        int colRemainder = (int)(_hero->getPosition().x*RECT_SIZE - HERO_LOCATION_SCREEN.x) % IMG_WIDTH;
        int rowRemainder = (int)(_hero->getPosition().y*RECT_SIZE - HERO_LOCATION_SCREEN.y) % IMG_HEIGHT;
    
        if (!_firstDraw)
        {
            _displayedMap[0] = Sprite::createWithSpriteFrameName(String::createWithFormat("environment_%d_%d.png", row, col)->getCString());
            _displayedMap[1] = Sprite::createWithSpriteFrameName(String::createWithFormat("environment_%d_%d.png", row + 1, col)->getCString());
            _displayedMap[2] = Sprite::createWithSpriteFrameName(String::createWithFormat("environment_%d_%d.png", row + 1, col + 1)->getCString());
            _displayedMap[3] = Sprite::createWithSpriteFrameName(String::createWithFormat("environment_%d_%d.png", row, col + 1)->getCString());
            for (int i = 0; i < 4; i++)
            {
                this->addChild(_displayedMap[i],-100);
                _displayedMap[i]->setAnchorPoint(Point::ZERO);
            }
            _firstDraw = true;
        }
        //if (_lastHeroPosition.x + IMG_WIDTH <= _hero->getPosition().x || _hero->getPosition().x <= _lastHeroPosition.x - IMG_WIDTH ||
        //  _lastHeroPosition.y + IMG_HEIGHT <= _hero->getPosition().y || _hero->getPosition().y <= _lastHeroPosition.y - IMG_HEIGHT)
        //{
        //  
    
        //  _lastHeroPosition = _hero->getPosition();
        //}
        _displayedMap[0]->setDisplayFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName((String::createWithFormat("environment_%d_%d.png", row, col)->getCString())));
        _displayedMap[1]->setDisplayFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName((String::createWithFormat("environment_%d_%d.png", row + 1, col)->getCString())));
        _displayedMap[2]->setDisplayFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName((String::createWithFormat("environment_%d_%d.png", row + 1, col + 1)->getCString())));
        _displayedMap[3]->setDisplayFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName((String::createWithFormat("environment_%d_%d.png", row, col + 1)->getCString())));
    
        _displayedMap[0]->setPosition(-1 * colRemainder, -1 * rowRemainder);
        _displayedMap[1]->setPosition(-1 * colRemainder, IMG_HEIGHT - rowRemainder - 1);
        _displayedMap[2]->setPosition(IMG_WIDTH - colRemainder - 1, IMG_HEIGHT - rowRemainder - 1);
        _displayedMap[3]->setPosition(IMG_WIDTH - colRemainder - 1, -1 * rowRemainder);
    //end normal map
    
        //hero
        _hero->getSkeleton()->setZOrder(400 - _hero->getPosition().y);
        //end
    
        //land
        getVisionLand();
        //end
    
        //plants
        getVisionPlant();
        //end
        return true;
    }

    在我的游戏中,hero一直在中间的位置,所以所有的图片都要根据hero的坐标来计算相对坐标,drawMap()函数将在每一帧被调用,这里有一点小小的优化,当hero移动不超过屏幕大小时,不会重新计算地图图片,只有超过了1000*500这个范围,才会重新计算图片ID,因为需要加载新的图片了。

    · 然后是绘制各种实体对象,例如plant,其余的实体逻辑类似:

    void VisionMap::getVisionPlant()
    {
    //由于实体对象每帧都会绘制,所以要把上一帧的同一个实体从层里删除。
        if (_firstDraw)
        {
    
            for (int i = 0; i < _displayedPlant.size(); i++)
            {
                this->removeChild(_displayedPlant.at(i));
            }
        }
        int count = 0;
        _displayedPlant.clear();
        while (count < globalEntity->_virtualMap->_plants.size())
        {
            Rect screenRect
                (
                _hero->getPosition().x*RECT_SIZE - HERO_LOCATION_SCREEN.x,
                _hero->getPosition().y*RECT_SIZE - HERO_LOCATION_SCREEN.y,
                IMG_WIDTH,
                IMG_HEIGHT
                );
            Rect plantRect
                (
                globalEntity->_virtualMap->_plants.at(count)->getPosition().x*RECT_SIZE - 300,
                globalEntity->_virtualMap->_plants.at(count)->getPosition().y*RECT_SIZE,
                globalEntity->_virtualMap->_plants.at(count)->Plants::getContentSize().x,
                globalEntity->_virtualMap->_plants.at(count)->Plants::getContentSize().y
                );
            if (screenRect.intersectsRect(plantRect))
            {
                auto po = globalEntity->_virtualMap->_plants.at(count)->getPosition();
                auto sp = Sprite::createWithSpriteFrameName(globalEntity->_virtualMap->_plants.at(count)->spriteName_);
                sp->setPosition(
                    po.x*RECT_SIZE - _hero->getPosition().x*RECT_SIZE + HERO_LOCATION_SCREEN.x,
                    po.y*RECT_SIZE - _hero->getPosition().y*RECT_SIZE + HERO_LOCATION_SCREEN.y
                    );
                sp->setAnchorPoint(Point(0.5, 0));
                sp->setZOrder(400 - po.y);
                _displayedPlant.pushBack(sp);
                this->addChild(sp);
            }
            count++;
        }
    }

    根据实体对象的矩形边框与屏幕边框是否相交,可以确定是否需要绘制。

    百闻不如一见,最后的结果(补上上次的像素检测):

    这里写图片描述

    移动一下
    这里写图片描述

    展开全文
  • cocos2d-x游戏开发基础与实战 经典视频教程 cocos2d-x游戏开发工资高吗? 精通C/C++,熟练掌握Cocos2d-x引擎及其Cocos2d-x引擎周边开发工具,了解游戏开发常用的工具和软件,精通Socket网络编程和HTTP协议,能高效的...

    cocos2d-x游戏开发基础与实战 经典视频教程

    cocos2d-x游戏开发工资高吗?
    精通C/C++,熟练掌握Cocos2d-x引擎及其Cocos2d-x引擎周边开发工具,了解游戏开发常用的工具和软件,精通Socket网络编程和HTTP协议,能高效的处理各种数据.
    开发过一款以上的知名商业化移动游戏产品的话,工资月薪起码在3万以上!

    cocos2d-x游戏开发需要学什么?
    第一部分cocos2d-x游戏开发基础

    第1章 HelloCocos2d—x
    1.1 引擎简介
    1.2 搭建开发环境
    1.3 HelloWorld
    1.4 HelloWorld分析
    1.5 测试样例简介
    1.6 小结

    第2章 在游戏开始之前
    2.1 基本概念
    2.1.1 场景与流程控制
    2.1.2 层
    2.1.3 精灵
    2.1.4 节点与渲染树
    2.1.5 动作与动画
    2.2 Cocos2d—x代码风格
    2.2.1 命名空间与类名称
    2.2.2 构造函数与初始化
    2.2.3 选择器
    2.2.4 属性
    2.2.5 单例
    2.3 C++中的Cocos2d—x内存管理
    2.3.1 复杂的内存管理
    2.3.2 现有的智能内存管理技术
    2.3.3 Cocos2d—x的内存管理机制
    2.3.4 工厂方法
    2.3.5 关于对象传值
    2.3.6 释放:release()还是autorelease()?
    2.3.7 容器
    2.3.8 相关辅助宏
    2.3.9 Cocos2d—x内存管理原则
    2.4 生命周期分析
    2.5 小结

    第3章 游戏的基本元素
    3.1 CCDirector:大总管
    3.2 CCScene:场景
    3.3 CCLayer:层
    3.4 CCSprite:精灵
    3.4.1 纹理
    3.4.2 创建精灵
    3.4.3 设置精灵的属性
    3.4.4 向层中添加精灵
    3.4.5 常用成员
    3.5 CCNode与坐标系
    3.5.1 坐标系与绘图属性
    3.5.2 节点的组织
    3.5.3 定时器事件
    3.5.4 其他事件
    3.6 Cocos2d—x内置的常用层
    3.7 Cocos2d—x调度原理
    3.7.1 游戏主循环
    3.7.2 定时调度器
    3.8 小结

    第4章 动作
    4.1 基本概念
    4.2 瞬时动作
    4.3 持续性动作
    4.3.1 位置变化动作
    4.3.2 属性变化动作
    4.3.3 视觉特效动作
    4.3.4 控制动作
    4.4 复合动作
    4.5 变速动作
    4.6 使鱼动起来
    4.7 创建自定义动作
    4.7.1 一点简单的物理知识
    4.7.2 创建自定义动作
    4.8 让动作更平滑流畅
    4.9 Cocos2d—x动作原理
    4.9.1 动作类的结构
    4.9.2 动作的更新
    4.9.3 CCActionManager的工作原理
    4.10 小结

    第5章 动画与场景特效
    5.1 动画
    5.1.1 概述
    5.1.2 使用动画
    5.2 场景特效
    5.3 小结

    第6章 音乐与音效
    6.1 使用音效引擎
    6.2 支持格式
    6.3 播放音乐与音效
    6.3.1 预加载
    6.3.2 播放与停止
    6.3.3 暂停与恢复播放
    6.3.4 其他成员
    6.4 小结

    第7章 用户输入
    7.1 触摸输入
    7.1.1 使用CCLayer响应触摸事件
    7.1.2 两种Cocos2d—x触摸事件
    7.2 触摸分发器原理
    7.3 触摸中的陷阱
    7.4 使用触摸事件
    7.4.1 使炮台动起来
    7.4.2 识别简单的手势
    7.5 加速度计
    7.6 文字输入
    7.7 小结

    第二部分 引擎进阶

    第8章 粒子效果
    8.1 Cocos2d—x中的粒子系统
    8.2 粒子效果编辑器
    8.2.1 界面介绍
    8.2.2 制作火焰特效
    8.3 小结

    第9章 大型地图
    9.1 瓦片地图
    9.2 编辑器
    9.2.1 TiledMapEditor简介
    9.2.2 创建水底世界
    9.3 导入游戏
    9.4 实现层次感
    9.5 预定义属性
    9.6 小结

    第10章 Cocos2d—x绘图原理及优化
    10.1 OpenGL基础
    10.1.1 OpenGL简介
    10.1.2 绘图
    10.1.3 矩阵与变换
    10.2 Cocos2d—x绘图原理
    10.2.1 精灵的绘制
    10.2.2 渲染树的绘制
    10.2.3 坐标变换
    10.3 TexturePacker与优化
    10.3.1 绘图瓶颈
    10.3.2 碎图压缩与精灵框帧
    10.3.3 批量渲染
    10.3.4 色彩深度优化
    10.4 小结

    第11章 OpenGL绘图技巧
    11.1 自定义绘图
    11.2 遮罩层
    11.3 数据交流
    11.4 可编程管线
    11.4.1 可编程着色器
    11.4.2 CCGLProgram
    11.4.3 变量传递
    11.5 水纹效果
    11.5.1 着色器程序
    11.5.2 ShaderNode类
    11.5.3 uniform变量准备
    11.5.4 绘制
    11.5.5 添加到场景
    11.6 CCGrid3D
    11.7 再议效率
    11.8 小结

    第12章 物理引擎
    12.1 新的超级武器
    12.2 Box2D引擎简介
    12.3 接入Box2D
    12.4 更新状态
    12.5 调试绘图
    12.6 碰撞检测
    12.7 弹射
    12.8 精确碰撞
    12.9 小结

    第三部分 游戏开发进阶

    第13章 数据持久化
    13.1 CCUserDefault
    13.2 格式化存储
    13.3 本地文件存储
    13.4 XML与JSON
    13.5 加密与解密
    13.6 SQLite
    13.7 小结

    第14章 网络
    14.1 网络传输架构
    14.2 CURL
    14.3 简单传输
    14.4 非阻塞传输
    14.5 用户记录
    14.6 多人对战与同步问题
    14.6.1 时间同步
    14.6.2 鱼群同步
    14.7 校验
    14.8 小结

    第15章 缓存与池
    15.1 移动设备昂贵的CPU与内存
    15.2 缓存机制:预加载与重复使用
    15.3 Cocos2d—x中的缓存
    15.3.1 CCTextureCache
    15.3.2 CCSpriteFrameCache
    15.3.3 CCAnimationCache
    15.4 对象池机制:可回收与重复使用
    15.5 对象池实现
    15.6 落实到工厂方法
    15.7 一个简单的性能测试
    15.8 使用时机
    15.9 小结

    第16章 并发编程
    16.1 单线程的尴尬
    16.2 pthread
    16.3 线程安全
    16.4 线程间任务安排
    16.5 并发编程辅助
    16.6 小结

    第四部分 多平台

    第17章 多平台下的Cocos2d
    17.1 Windows8
    17.2 WindowsPhone平台
    17.3 Cocos2d—HTML5
    17.4 移植
    17.5 小结

    第18章 可视化开发
    18.1 CocosBuilder可视化开发
    18.2 使用CocosBuilder创建场景
    18.3 在Cocos2d—x项目中使用场景
    18.4 小结

    第19章 Cocos2d—HTML5
    19.1 概述
    19.2 开发流程
    19.2.1 开发环境介绍
    19.2.2 搭建开发环境
    19.2.3 开始开发
    19.3 代码安全
    19.4 小结

    第20章 移植
    20.1 命名原则
    20.1.1 类名称
    20.1.2 类函数
    20.1.3 属性
    20.1.4 选择器
    20.1.5 全局变量、函数与宏
    20.2 跨语言移植
    20.2.1 第一阶段:代码移植
    20.2.2 第二阶段:消除平台差异
    20.2.3 第三阶段:优化
    20.3 小结

    第五部分cocos2d-x游戏开发基础实战

    第21章 实战演练——开发自己的《捕鱼达人》
    21.1 开发前的准备
    21.1.1 视图
    21.1.2 模型
    21.1.3 控制器
    21.2 开始开发
    21.2.1 第一轮迭代
    21.2.2 第二轮迭代
    21.2.3 第三轮迭代

    cocos2d-x教程百度网盘下载地址:
    http://www.xuexiluxian.net/cocos2dx-shizhan.html

    展开全文
  • Cocos2d-x高级开发教程:制作自己的《捕鱼达人》》是国内第一本全面深入讲解Cocos2d-x进阶内容的图书,Cocos2d-x创始人王哲作序推荐,《捕鱼达人》开发人员力作;《捕鱼达人》代码大揭秘,传授大家如何做一个...
  • cocos2d框架介绍

    2011-09-13 10:54:29
    cocos2d引擎 2.0 cocos2d简介 Cocos2d最初的版本是用python写的,之后被改成objectiveC,应用于iphone上,之后国内某人又根据该设计理念,将其改为C++版本cocos2dX,该版本可以在iphone,widnows,andriod三个平

    cocos2d引擎

    2.0 cocos2d简介

    Cocos2d最初的版本是用python写的,之后被改成objectiveC,应用于iphone上,之后国内某人又根据该设计理念,将其改为C++版本cocos2dX,该版本可以在iphone,widnows,andriod三个平台上运行.最新的版本是1.0.0,该引擎C++的版本还引入了lua脚本系统.cocos2d是完全开源的引擎,开发者可以任意使用该代码而不用公开源代码.cocos2d被广泛的使用,其中包括Zynga,南宫梦等知名游戏公司.Cocos2d不仅仅只是一个2D图形引擎库,他还提供了一些对游戏逻辑支持的系统.cocos2d提供了一个简单的声音引擎,支持播放mp3,wave,ogg等文件格式的音乐.cocos2d可以和物理引擎box2d配合使用,实现碰撞等物理效果.cocos2d引擎的结构清晰,文档和实例比较丰富.易学易用.

    2.1 cocos2d 基本结构

    Cocos2d采用场景树结构来管理游戏对象,把一个游戏划分为不同的场景,场景又可以分为不同的层,一个层又可以拥有任意个可见的游戏对象.游戏对象又可以执行Action来修改其属性.每一个时刻都有一个场景在独立运行,通过切换不同的场景来完成一个游戏流程.cocos2d还采用了引用计数的方式来管理内存,基本上所有的类都派生于拥有引用计数的机制的CCObject.其基本框架类图如下: 

    a.      CCApplication,负责平台相关的初始化,消息处理等,是一个单件类

    b.      CCDirector,主要职责是管理场景和切换场景,游戏暂停等.另外他还负责初始化openes相关的一东西.也是一个单件类

    c.      CCNode,节点类,是游戏中最重要的对象,在cocos2dk中,任何可见的或不可以的游戏逻辑对象都是一个节点,节点有以下特点:

    a)        是一个容器,可以包含任意多个其它节点.

    b)        可以执行一个行为(CCAction)

    c)        可以执行一定时的任务回调

    d)        拥有坐标变换(transform)信息,如postion,scale,rotation等

    e)        由于一个节点可以添加任意个子节点,所有的节点组成一个树状结构,因此父节点的坐标变换会影响子节点在世界坐标系中的坐标,一个节点只能拥有一个父节点

    d.      CCAction,动作类,CCAtion就好像指派给CCNode的命令一样,在特定时间(或立即)内修改CCNode的属性,例如位置,旋转,缩放等

    e.      CCScene,场景类,和PL中的stage类似,游戏场景一般是指在某个时刻能独立运行的部分,包括可见的怪物,地形和不可见的逻辑脚本等.例如一个游戏的一个特定关卡,游戏菜单,过场动画等都是一个独立的场景.cocos2d中的场景又由不同的层(CCLayer)组成.由于CCScene是CCNode的子类,因此可以可以用CCAction来修改其属性

    f.       CCLayer类,场景中的层类,一个场景可以拥有多个层,如HUD层,游戏对象层,背景层,天空层等,层是一个可以绘制的区域.可以将ui,sprite等对象添加到其中.除此之外,层还接收输入消息,可以在层的类中处理输入消息,和CCScene一样,CClayer是CCNode的子类,也可以用CCAction来修改其属性

    2.2资源管理与文件系统

    资源管理可以分为两个方面,一是管理一些原生(Raw)的资源,例如模型,贴图,脚本,字体等.另外一种资源是在游戏运行时分配的游戏对象.他们需要能被快速的访问.一般来说,没有被引用的游戏对象一般不会立即被释放,会先缓存到某个地方.在加载新的场景时.才会被释放.在一些大型的渲染系统中,资源会被分为三个阶段,硬盘,内存,显存资源,分别采用不同的策略和cache机制来管理,cocos2d没有明显的提出资源管理的概念,但使用了一些cache的机制来缓存已经加载了的纹理,frame,animation等.对于运行时分配的游戏对象,cocos2d也提供了一个autorelease的机制,在游戏切换场景时,将会对autorelease的对象进行内存回收.由于cocos2d采用了引用计数的机制.循环引用是一个需要关注的问题.

    对于文件系统,cocos2d封装了一个简单的类CCFileUtils,该类除了能读取普通的文件之外,还可以从zip文件读取文件.该类还读取plist文件生成一个CCDictionary对象.

    2.3 sprite与渲染系统

             Cocos2d的Sprite由Texure,frame,和animation组成,由openes负责渲染主要的类关系如下:


    a.      Sprite 可以看成是某一时刻,一个2d的图片的一个剪辑部分

    b.      frame由texture和一个矩形(quad)组成

    c.      texture代表一个可以被绘制的2维的纹理

    d.      imgae对应硬盘中不同类型的图片,例如jpg,png,tga等.它知道如何从文件中读取不同类型的图片,生成缓冲数据,供texture使用

    e.      CCAnimation由一系列的frame组成,类似于电影的胶片集合

    f.       CCAnimate,动画action,实现在指定时间内在sprite上播放指定的动画(CCAnimation)

    2.3.1 Texture与Image

             Cocos2d中的CCTexture2D用来描述一个2d的纹理,它知道如何将自己绘制到屏幕上.通过该类还可以设置纹理过滤,抗锯齿等参数.该类还提供了一个接口,将字符串创建成纹理.该类所包含的纹理大小必须是2^n.因此纹理的大小不一定就等于图片的大小.CCTexture2D以下成员:

    a.      name,指向纹理在显存中的地址

    b.      pixelFormat,描述纹理的格式,例如RGBA888,或RGB565等

    c.      pixelWidth,pixelHeight,纹理的宽高

    d.      maxS,maxT,纹理的最大坐标

    既然已经有了CCTexture2D这样的类纹理的渲染,那么还需要Imgae类做什么呢?因为图片的格式多样,不同的格式,不同平台下有不同的加载方法,因此cocos2d使用了一个CCImage类封装不同格式的图片在不同平台下的加载.如果说CCImage中的buffer对应的是内在资源,那么CCTexture2D对应的buffer是显存资源.

    2.3.2 Frame与Animation

             上面讲过,Frame保存了一个纹理和矩形,在cocos2d中,一般都会给frame起个名字,以字典的形式保存在CCSpriteFrameCache中,方便随时读取.CCSpriteFrameCache支持从plist(类似于xml)文件读取图片,根据文件生成一系列的frame,并且给每个frame都生成一个名字. plist的文件可以使用很多第三方工具生成,例如Zwoptex(http://zwoptexapp.com/),TexturePacker(http://code-and-web.de/texturepacker);

    CCAnimation类用来在CCspreite对象上实现动画.他保存了一系列的frame.和frame之间的延时.可以通过使用CCAnimationaction来在sprite上播放一个动画.

    2.3.3 渲染流程

             由于cocos2d只处理2d图形,渲染采用了固定流水线的方式.当时也可以直接使用openes的函数来完成一些高级的特效.和渲染相关的类有CCTexutre2D,CCTexutreAtlas, CCSprite,CCRenderTexture,CCRenderTexture支持将数据渲染到纹理上.另外CCNode还一个相机类,但一般情况都不使用.只有在实现一些3D特效的时候,才使用相机的一些特性.

    2.4 粒子系统

    Cocos2d支持两种类型的粒子系统,点状(CCParticleSystemPoint)和方形(CCParticleQuadSsytem)粒子系统,Quad类型的系统支持一些额外的特性

    a.      可以旋转

    b.      可以是任何大小的,而point的尺寸不能超过64

    c.      Quad类型的粒子系统可以被整体缩放

    d.      Quad类型的粒子系统比Point粒子系统消耗更多的内存和显存

    粒子系统还支持从plist文件中读取数据,plist文件可以通过第三方工具生成,例如ParticleDesigner(http://particledesigner.71squared.com/),和ParticleMint

    2.5 UI与字体

             Cocos2d中只有简单的ui实现,支持button,label,toggle三种类型的ui,另外还支持简单的文本输入框(TextField).类关系图如下:


    a.      CCMenu从CClayer派生而来,可以处理输入消息,CCMenu包含多个CCMenuItem对象,在接收到输入消息之后,根据触摸位置,将输入消息分发到相应MenuItem,执行回调函数

    b.      CCMenu还提供一个对齐菜单项的接口

    c.      CCMenuItem 菜单项的基类,目前cocos2d只从CCMenuItem派生了CCMenuItemLabel,CCMenuItemSprite,CCMenuToggle三个类.当然也可以派生新的类,实现其它的菜单项,例如checkbox等.

     

    Cocos2d支持两种类型的字体,一种是平台相关的TTF字体,另外一种是平台无关的美术字体,该类型字体可以通过字体编辑器(例如http://glyphdesigner.71squared.com/)自己来定义形状和大小,使用起来和sprite差不多,比较方便.

    2.6 简单的TileMap

             Cocos2d支持的是一种TMX(TileMap XML)格式的地图,该地图可以由TileMapEditor生成(http://www.mapeditor.org/),TMX地图有以下特点

    a.      支持正交(orthogonal),六边形(hexagonal),45度等距(isometric)地图

    b.      支持对象组,对象,和属性

    和地图相关的类如下:


    a.      以上类图是简化后的,实现的类还包含了objectgroup,property,TileSetInfo等

    b.      一个TiledMap拥有多个layer

    c.      一个layer拥有多个tile(用sprite来表示)

    d.      由于每个tile都被看作一个sprite对象,因此每个tile可以被独立的,移动,旋转,缩放甚至执行action等.

    e.      layer保存了一个对应于tileid的二维数组,只有在需要的时候才会根据tile id 创建相应的tile(sprite),这样可以既可以节省存储空间,也可以提高渲染效率.

    f.       Tile可以在运行时被添加和删除

    g.      http://www.cocos2d-iphone.org/wiki/doku.php/prog_guide:tiled_maps网页上有关于tileMap使用的详细教程

    2.7 游戏逻辑的支持

             前面已经讲过Cocos2d不仅仅只是一个2D渲染引擎,它还提供了一个支持游戏逻辑的系统,首先所有可见的对象,场景和layer都以场景树的数据结构来保存,对root(一般都是scene)执行的操作都会影响root的孩子节点.如果root被缩放或者平移,那么root的所有孩子节点也会被缩放和平移.所有的节点类(CCNode)都继承了一个接口 SelectorProtocol,该接口有一系列的回调函数,在特定的条件下回调来完成相应的逻辑处理.其中最基本也是最重要的是与schedule相关的回调接口.下面将介绍一下schedule任务系统

    2.7.0 Schedule系统

             Scheule系统也叫任务系统或者事件系统,任务指一个时间片内定时发生的事件.在cocos2d中的CCNode可以订制一个计划任务.通过回调函数来完成一个特定的逻辑.相关的类图如下


    a.      CCSchedule可以将selectorProtocol接口对象添加到任务列表中.

    b.      CCTimer每一帧都检查对应的任务是否达到执行时间点,如果达到则执行回调函数.

    c.      CCNode派生于SelecotrProtocol,根据需要重载实现回调函数,实现相应的逻辑

    2.7.1 Action介绍

             Action就像一些可以被执行的命令,通常情况下,一个action会修改一个CCNode对象的一些属性,让一个CCNode对象执行一些动作,例如改变其的位置,朝向.让一个Sprite播放动画等.如果这个action是在一定时间段内完成的,我们称它为IntervalAction,如果是立即执行的,我们称它为InstantAction.例如CCMoveBy在一定时间段内将一个CCNode对象移动一定的距离.因此它是IntervalAction的子类.而CCCallFunc实现立即执行一个架回调函数.因此它是InstantAction的子类.

             Action的设计采用了组合模式和装饰模式,可以将一系列的action组合起来,让CCNodec对象执行,就像给CCNode下达一系列的命令一样.例如以下代码

            

    CCActionInterval* move =CCMoveBy::actionWithDuration(0.5f, ccp(0,160));

             CCActionInterval*rotate = CCRotateBy::actionWithDuration(2, 360);

             CCActionInterval*scale = CCScaleBy::actionWithDuration(2, 5);

             CCActionInterval*opacity = CCFadeOut::actionWithDuration(2);

             CCActionInterval*fadein = CCFadeIn::actionWithDuration(2);

                      CCActionInterval* scaleback =CCScaleTo::actionWithDuration(1, 1);

    CCFiniteTimeAction*seq0 = CCSequence::actions(move, rotate, scale, opacity, fadein, scaleback,NULL);

    Actor->runAction(seq0);

             该代码解释如下:

    a.      Actor在0.5秒之内向y方向移动160个单位,

    b.      让actor在2秒内,旋转360度

    c.      将actor2秒内放大5倍

    d.      2秒内淡出

    e.      2秒内淡入

    f.       1秒之内缩放到原始大小

    2.8 网络支持

             Cocos2d没有提供专门的网络库

    2.9 脚本支持

             Cocos2dX最近的版本提供了lua脚本支持,在1.1.0版本结合了tolua++,基本上将所有类的成员函数都导出到脚本中.除此之外,还增加了一些脚本回调函数,例如菜单的消息处理可以通过执行一段脚本来完成.也可以添加计划任务来回调脚本函数.cocos2d中虽然有一个简单的实例来说明如何使用lua,但具体的效率如何还待进一步验证

    2.10 声音引擎支持

             Cocos2d使用了一个简单的声音引擎,支持Wav,mp3,ogg,caf格式音频文件播放.但该引擎没有提供音量设置

    2.11 物理引擎支持

             Cocos2d可以和box2d,chipmunk物理引擎结合在一起,实现碰撞,重力等物理效果模拟.在代码的实例中,有大量与box2d和chipmunk结合的实例,可以供学习和研究使用.

    2.12 cocos2d的缺点

             Cocs2d不但是处理了2D渲染,还将整个渲染系统和游戏逻辑紧密的耦合在一起,因此在使用coco2d渲染时,不得不使用他的整个逻辑相关的代码.因此很难在使用其渲染库的同时又自己设计一套逻辑框架.对于一些小型游戏来说,可以使用其可以进行快速的迭代和开发.但对于一些大型游戏,为了使用系统运行更稳定,结构更清晰.更易于扩展,一般都会将各个模块独立开来.以方便不同的人员分工开发和维护.

    展开全文
  • 写这个系列主要为了记录和总结使用Cocos2d-x JSB和Cocos2d-html5做游戏开发的过程中遇到的问题和解决方案。 cocos2d-x jsb和cocos2d-html5的跨...Cocos2d-x js binding(JSB)和Cocos2d-x lua binding一样,是Coco
  • 所谓大型地图,是指类似于pc端沙盒游戏那样的地图。需要加载大量的图片资源。而cocos并不是针对这样的游戏设计(现目前手机端很少有2d的类似游戏)。笔者最近再开发一款类似《饥荒》的生存类游戏,所以涉及到大型...
  • 跨平台Cocos2d-Java游戏引擎以及配套的CocosEditor2.0游戏开发工具终于诞生了。使用Java语言来开发Cocos2d跨平台游戏, 和-lua,-js 的风格相近API,毋庸置疑,这确实是Cocos2d新的里程碑。欢迎来的Cocos2d-Java的...
  • cocos2d-js除了做native游戏外,还可以用来做HTML5游戏/动画,那么它跟adobe的createjs框架比较会怎么样呢? (背景知识:createjs是adobe支持的HTML5框架,
  • Cocos2d-x JSB + cocos2d-html5 跨平台游戏开发(一)—— 引擎选择 2014-02-01 00:48:26 .entry-content ul, .entry-content ol {padding: 0 0 0 10px; } 写这个系列主要为了记录和总结使用Cocos2d-x...
  • cocos2d引擎 2.0 cocos2d简介 ...Cocos2d最初的版本是用python写的,之后被改成objectiveC,应用于iphone上,之后国内某人又根据该设计理念,将其改为C++版本cocos2dX,该版本可以在iphone,widnows,andrio
  • 介绍瓦片地图在解决大背景问题的优势。也能够掌握使用瓦片地图工具制作瓦片地图。熟悉Cocos2d-x中瓦片地图的API。
  • 【由CSDN和创新工场联合举办的“移动开发者大会•中国2012”将于2012年10月19-20日在国家会议...Cocos2D-X核心开发者王哲将出席本次移动开发者大会“平台与技术”主题论坛,演讲议题为“Cocos2D游戏性能优化”。王哲
  • XML是一种非常重要的文件格式,由于C++对XML的支持非常完善,cocos2d-x选择XML作为主要的文件存储格式。在cocos2d-x中集成了libxml2来解析XML数据。   定义一个用于解析的类,这个类继承CCSAXDelegator和CCObje
  • cocos2d-x 大型ARPG手游研发----研发思路及感想 转载:http://www.cnblogs.com/zisou/articles/cocos2d-x-ARPG.html  我半年前进入了目前的这家做教育行业的公司(在此之前一直从事原生态开发手游的迷茫之路),...
  • 初探使用iOS 7 Sprite Kit与Cocos2d开发游戏的对比 初探使用iOS 7 Sprite Kit与Cocos2d开发游戏的对比 发布于:2013-07-18 11:00阅读数:19848 前言 iOS7 beta发布后,大部分开发者和用户的注意...
  • Cocos2d-x 高级开发教程 -制作自己的《捕鱼达人》!  本课程以《捕鱼达人》游戏为案例,全面系统地讲解了Cocos2d-x的功能与特性,  以及进行游戏开发的基本思路,包括游戏框架的搭建、基本游戏元素的使用、动作...
  • cocos2d-x的未来之旅

    2012-03-17 17:59:05
    分析手机游戏未来的发展方向,了解cocos2d-x这个神奇的引擎未来会有哪些发展刻不容缓。 智能手机系统的发展趋势 手机系统的发展一直都牵动着手机行业。刚开始,只有大的手机厂商(如诺基亚和索爱等)才有...
1 2 3 4 5 ... 20
收藏数 645
精华内容 258
关键字:

cocos2d 大型地图