cocos2d-x CCMenu详细源码分析

.h

typedef enum 
{
    kCCMenuStateWaiting,// 表示没有菜单项被选中
    kCCMenuStateTrackingTouch // 表示有菜单项被选中
} tCCMenuState;
 
enum {
    //* priority used by the menu for the event handler
    kCCMenuHandlerPriority = -128,};
 
class CC_DLL CCMenu : public CCLayerRGBA // CCMenu的基类居然是CCLayer!
{
    bool m_bEnabled; // CCMenu是否接收触摸事件
     
public:
    CCMenu() : m_pSelectedItem(NULL) {}
    virtual ~CCMenu(){}
 
    // 创建一个空菜单
    static CCMenu* create();
 
    // 根据多个菜单项列创建菜单
    static CCMenu* create(CCMenuItem* item,...);
 
    // 通过子菜单项的数组创建菜单
    static CCMenu* createWithArray(CCArray* pArrayOfItems);
 
    // 通过一个菜单项创建菜单
    static CCMenu* createWithItem(CCMenuItem* item);
     
    // 通过多个菜单项列创建菜单
    static CCMenu* createWithItems(CCMenuItem *firstItem,va_list args);
 
    // 初始化空菜单
    bool init();
 
    // 通过子菜单项数组初始化菜单
    bool initWithArray(CCArray* pArrayOfItems);
 
    // 垂直方向默认间隙排列
    void alignItemsVertically();
    //垂直方向指定间隙排列
    void alignItemsVerticallyWithPadding(float padding);
 
    // 水平方向默认间隙排列
    void alignItemsHorizontally();
    // 水平方向指定间隙排列
    void alignItemsHorizontallyWithPadding(float padding);
 
    // 通过每行个数排列
    void alignItemsInColumns(unsigned int columns,...);
    void alignItemsInColumns(unsigned int columns,va_list args);
    // ?
    void alignItemsInColumnsWithArray(CCArray* rows);
 
    // 通过每列个数排列
    void alignItemsInRows(unsigned int rows,...);
    void alignItemsInRows(unsigned int rows,va_list args);
    // ?
    void alignItemsInRowsWithArray(CCArray* columns);
 
    // 设置事件处理优先级,默认为kCCMenuTouchPriority
    void setHandlerPriority(int newPriority);
 
    // 基类方法
    virtual void addChild(CCNode * child);
    virtual void addChild(CCNode * child,int zOrder);
    virtual void addChild(CCNode * child,int zOrder,int tag);
    virtual void registerWithTouchDispatcher();
    virtual void removeChild(CCNode* child,bool cleanup);
 
    // 触摸事件
    virtual bool ccTouchBegan(CCTouch* touch,CCEvent* event);
    virtual void ccTouchEnded(CCTouch* touch,CCEvent* event);
    virtual void ccTouchCancelled(CCTouch *touch,CCEvent* event);
    virtual void ccTouchMoved(CCTouch* touch,CCEvent* event);
 
    // 退出调用函数
    virtual void onExit();
 
    // ?
    virtual void setOpacityModifyRGB(bool bValue) {CC_UNUSED_PARAM(bValue);}
    virtual bool isOpacityModifyRGB(void) { return false;}
    // 获取/设置菜单是否可用
    virtual bool isEnabled() { return m_bEnabled; }
    virtual void setEnabled(bool value) { m_bEnabled = value; };
 
protected:
    // 返回被触摸的菜单项
    CCMenuItem* itemForTouch(CCTouch * touch);
    tCCMenuState m_eState;
    CCMenuItem *m_pSelectedItem;
};
 



.cpp


static std::vector<unsigned int=""> ccarray_to_std_vector(CCArray* pArray) // 将CCArray转换成Vector
{
    std::vector<unsigned int=""> ret;
    CCObject* pObj;
    CCARRAY_FOREACH(pArray,pObj)
    {
        CCInteger* pInteger = (CCInteger*)pObj;
        ret.push_back((unsigned int)pInteger->getValue());
    }
    return ret;
}
 
enum
{
    kDefaultPadding =  5,};
 
//
//CCMenu
//
 
CCMenu* CCMenu::create()
{ // 传空参数,创建空菜单
    return CCMenu::create(NULL,NULL);
}
 
CCMenu * CCMenu::create(CCMenuItem* item,...)
{
    va_list args;
    va_start(args,item); //处理...形参
     
    CCMenu *pRet = CCMenu::createWithItems(item,args);
     
    va_end(args);
     
    return pRet;
}
 
CCMenu* CCMenu::createWithArray(CCArray* pArrayOfItems)
{
    CCMenu *pRet = new CCMenu();
    if (pRet && pRet->initWithArray(pArrayOfItems))
    {
        pRet->autorelease(); // 设置自动释放
    }
    else
    {
        CC_SAFE_DELETE(pRet);
    }
     
    return pRet;
}
 
CCMenu* CCMenu::createWithItems(CCMenuItem* item,va_list args)
{
    CCArray* pArray = NULL; // 将...形参转换成CCArray
    if( item )
    {
        pArray = CCArray::create(item,NULL); // 创建一个CCArray
        CCMenuItem *i = va_arg(args,CCMenuItem*);
        while(i)
        {
            pArray->addObject(i); // 添加其他子菜单项
            i = va_arg(args,CCMenuItem*);
        }
    }
     
    return CCMenu::createWithArray(pArray);
}
 
CCMenu* CCMenu::createWithItem(CCMenuItem* item)
{
    return CCMenu::create(item,NULL);
}
 
bool CCMenu::init()
{
    return initWithArray(NULL);
}
 
bool CCMenu::initWithArray(CCArray* pArrayOfItems)
{
    if (CCLayer::init())
    {
        // 设置触摸相关信息
        setTouchPriority(kCCMenuHandlerPriority);
        setTouchMode(kCCTouchesOneByOne);
        setTouchEnabled(true);
 
        // 打开可用状态
        m_bEnabled = true;
         
        // 菜单置于屏幕中间,并填充满整个屏幕
        CCSize s = CCDirector::sharedDirector()->getWinSize();
        this->ignoreAnchorPointForPosition(true);
        setAnchorPoint(ccp(0.5f,0.5f));
        this->setContentSize(s);
        setPosition(ccp(s.width/2,s.height/2));
         
        // 遍历添加菜单项
        if (pArrayOfItems != NULL)
        {
            int z=0;
            CCObject* pObj = NULL;
            CCARRAY_FOREACH(pArrayOfItems,pObj)
            {
                CCMenuItem* item = (CCMenuItem*)pObj;
                this->addChild(item,z);
                z++;
            }
        }
     
        // 将选中项置为空
        m_pSelectedItem = NULL;
        // 将状态置为没有菜单项被选中
        m_eState = kCCMenuStateWaiting;
         
        // enable cascade color and opacity on menus
        setCascadeColorEnabled(true);
        setCascadeOpacityEnabled(true);
         
        return true;
    }
    return false;
}
 
/*
* override add:
*/
void CCMenu::addChild(CCNode * child)
{
    CCLayer::addChild(child);
}
 
void CCMenu::addChild(CCNode * child,int zOrder)
{
    CCLayer::addChild(child,zOrder);
}
 
void CCMenu::addChild(CCNode * child,int tag)
{ // 确保child为CCMenuItem之内
    CCAssert( dynamic_cast<ccmenuitem*>(child) != NULL,Menu only supports MenuItem objects as children);
    CCLayer::addChild(child,zOrder,tag);
}
 
void CCMenu::onExit()
{
    if (m_eState == kCCMenuStateTrackingTouch) // 如果有菜单项被选中,则取消选择状态
    {
        if (m_pSelectedItem)
        { // 将选中项菜单选中状态清除,并将用于记录的变量置为空
            m_pSelectedItem->unselected();
            m_pSelectedItem = NULL;
        }
        // 将状态置为等待触摸
        m_eState = kCCMenuStateWaiting;
    }
 
    CCLayer::onExit();
}
 
void CCMenu::removeChild(CCNode* child,bool cleanup)
{
    CCMenuItem *pMenuItem = dynamic_cast<ccmenuitem*>(child);
    CCAssert(pMenuItem != NULL,Menu only supports MenuItem objects as children);
     
    // 如果是被选中的菜单项,则先把选中置为空
    if (m_pSelectedItem == pMenuItem)
    {
        m_pSelectedItem = NULL;
    }
     
    CCNode::removeChild(child,cleanup);
}
 
//Menu - Events
 
void CCMenu::setHandlerPriority(int newPriority)
{
    CCTouchDispatcher* pDispatcher = CCDirector::sharedDirector()->getTouchDispatcher();
    pDispatcher->setPriority(newPriority,this); // 设置触摸优先级
}
 
void CCMenu::registerWithTouchDispatcher()
{ // 注册触摸
    CCDirector* pDirector = CCDirector::sharedDirector();
    pDirector->getTouchDispatcher()->addTargetedDelegate(this,this->getTouchPriority(),true);
}
 
bool CCMenu::ccTouchBegan(CCTouch* touch,CCEvent* event)
{
    CC_UNUSED_PARAM(event);
    if (m_eState != kCCMenuStateWaiting || ! m_bVisible || !m_bEnabled)
    { // 排除不执行触摸事件状态
        return false;
    }
 
    for (CCNode *c = this->m_pParent; c != NULL; c = c->getParent())
    { // 如果菜单父类不可见则返回
        if (c->isVisible() == false)
        {
            return false;
        }
    }
<span style="white-space: pre;">    </span>// 选出触摸项
    m_pSelectedItem = this->itemForTouch(touch);
    if (m_pSelectedItem)
    {
        m_eState = kCCMenuStateTrackingTouch; // 将状态变为有菜单项被选中
        m_pSelectedItem->selected(); // 对触摸项执行触摸事件
        return true;
    }
    return false;
}
 
void CCMenu::ccTouchEnded(CCTouch *touch,CCEvent* event)
{
    CC_UNUSED_PARAM(touch); // 消除不使用警告
    CC_UNUSED_PARAM(event);
    CCAssert(m_eState == kCCMenuStateTrackingTouch,[Menu ccTouchEnded] -- invalid state);
    if (m_pSelectedItem)
    { // 解除菜单项选中状态
        m_pSelectedItem->unselected();
        m_pSelectedItem->activate();
    }
    m_eState = kCCMenuStateWaiting;
}
 
void CCMenu::ccTouchCancelled(CCTouch *touch,CCEvent* event)
{
    CC_UNUSED_PARAM(touch);
    CC_UNUSED_PARAM(event);
    CCAssert(m_eState == kCCMenuStateTrackingTouch,[Menu ccTouchCancelled] -- invalid state);
    if (m_pSelectedItem)
    { // 解除菜单项选中状态
        m_pSelectedItem->unselected();
    }
    m_eState = kCCMenuStateWaiting;
}
 
void CCMenu::ccTouchMoved(CCTouch* touch,CCEvent* event)
{
    CC_UNUSED_PARAM(event);
    CCAssert(m_eState == kCCMenuStateTrackingTouch,[Menu ccTouchMoved] -- invalid state);
    CCMenuItem *currentItem = this->itemForTouch(touch); // 获取当前触摸的子菜单项
    if (currentItem != m_pSelectedItem) 
    {
        if (m_pSelectedItem) // 如果当前有选中项,先取消选中
        {
            m_pSelectedItem->unselected();
        }
        m_pSelectedItem = currentItem; // 重新设置选中项
        if (m_pSelectedItem)
        {
            m_pSelectedItem->selected();
        }
    }
}
 
//Menu - Alignment
// 垂直方向默认间隙排列
void CCMenu::alignItemsVertically()
{
    this->alignItemsVerticallyWithPadding(kDefaultPadding);
}
 
// 垂直方向指定间隙排列
void CCMenu::alignItemsVerticallyWithPadding(float padding)
{
    float height = -padding;  // 第一个子菜单没有间隔,用于去掉这个重复
    if (m_pChildren && m_pChildren->count() > 0)
    {
        CCObject* pObject = NULL;
        CCARRAY_FOREACH(m_pChildren,pObject)
        {
            CCNode* pChild = dynamic_cast<ccnode*>(pObject);
            if (pChild)
            {
                height += pChild->getContentSize().height * pChild->getScaleY() + padding; // 获取子菜单项和间隔的总高度
            }
        }
    }
 
    float y = height / 2.0f; // 因为定位点在中间,所以先除去2
    if (m_pChildren && m_pChildren->count() > 0)
    {
        CCObject* pObject = NULL;
        CCARRAY_FOREACH(m_pChildren,pObject)
        {
            CCNode* pChild = dynamic_cast<ccnode*>(pObject);
            if (pChild)
            {
                pChild->setPosition(ccp(0,y - pChild->getContentSize().height * pChild->getScaleY() / 2.0f)); // 锚点在中间,所以除2
                y -= pChild->getContentSize().height * pChild->getScaleY() + padding; // 减去一个子菜单项和间隔的高度
            }
        }
    }
}
 
// 水平方向默认间隙排列
void CCMenu::alignItemsHorizontally(void)
{
    this->alignItemsHorizontallyWithPadding(kDefaultPadding);
}
 
// 水平方向指定间隙排列
void CCMenu::alignItemsHorizontallyWithPadding(float padding) // 原理和垂直排列相似,只不过将x变成y
{
 
    float width = -padding;
    if (m_pChildren && m_pChildren->count() > 0)
    {
        CCObject* pObject = NULL;
        CCARRAY_FOREACH(m_pChildren,pObject)
        {
            CCNode* pChild = dynamic_cast<ccnode*>(pObject);
            if (pChild)
            {
                width += pChild->getContentSize().width * pChild->getScaleX() + padding;
            }
        }
    }
 
    float x = -width / 2.0f;
    if (m_pChildren && m_pChildren->count() > 0)
    {
        CCObject* pObject = NULL;
        CCARRAY_FOREACH(m_pChildren,pObject)
        {
            CCNode* pChild = dynamic_cast<ccnode*>(pObject);
            if (pChild)
            {
                pChild->setPosition(ccp(x + pChild->getContentSize().width * pChild->getScaleX() / 2.0f,0));
                 x += pChild->getContentSize().width * pChild->getScaleX() + padding;
            }
        }
    }
}
 
void CCMenu::alignItemsInColumns(unsigned int columns,...)
{ // 将...转换成va_list
    va_list args;
    va_start(args,columns);
 
    this->alignItemsInColumns(columns,args);
 
    va_end(args);
}
 
void CCMenu::alignItemsInColumns(unsigned int columns,va_list args)
{ // 将va_list转换成CCArray
    CCArray* rows = CCArray::create();
    while (columns)
    {
        rows->addObject(CCInteger::create(columns));
        columns = va_arg(args,unsigned int);
    }
    alignItemsInColumnsWithArray(rows);
}
 
void CCMenu::alignItemsInColumnsWithArray(CCArray* rowsArray)
{
    vector<unsigned int=""> rows = ccarray_to_std_vector(rowsArray); // 将CCArray转换成vector
 
    int height = -5; // 为-5是用于除去第一行的间隙
    unsigned int row = 0; // 索引,当前行序号
    unsigned int rowHeight = 0; // 放置每一行高度(即每行最大高度)
    unsigned int columnsOccupied = 0; // 已放置列数
    unsigned int rowColumns; // 放置该行有多少列
 
    if (m_pChildren && m_pChildren->count() > 0) // 子菜单项数组存在且个数不为0
    {
        CCObject* pObject = NULL; // 临时变量
        CCARRAY_FOREACH(m_pChildren,pObject) // 遍历子菜单项数组
        {
            CCNode* pChild = dynamic_cast<ccnode*>(pObject); // 将CCObject对象强制转换成CCNode对象
            if (pChild) // 如果强制转换成功
            {
                CCAssert(row < rows.size(),);
 
                rowColumns = rows[row]; // 获取该行列数
                CCAssert(rowColumns,);
 
                float tmp = pChild->getContentSize().height; // 获取当前子菜单高度
                rowHeight = (unsigned int)((rowHeight >= tmp || isnan(tmp)) ? rowHeight : tmp); // 如果行高大于当前子菜单项高度,或者当前子菜单项高度越界,rowHeight不变,否则rowHeight等于当前子菜单项高度(用来存放最大菜单项高度)
 
                ++columnsOccupied; // 已放置列数自加
                if (columnsOccupied >= rowColumns) // 如果已放置列数大于等于该行可容纳列数
                {
                    height += rowHeight + 5; // 高度加上当前高度加上间隙
                    columnsOccupied = 0; // 重置已放置列数
                    rowHeight = 0; // 重置每行行高的临时变量
                    ++row; // 跳转至下一行
                }
            }
        }
    }    
 
    // check if too many rows/columns for available menu items
    CCAssert(! columnsOccupied,);
 
    CCSize winSize = CCDirector::sharedDirector()->getWinSize(); // 获取屏幕大小
 
    row = 0;
    rowHeight = 0;
    rowColumns = 0;
    float w = 0.0;
    float x = 0.0;
    float y = (float)(height / 2);
 
    if (m_pChildren && m_pChildren->count() > 0)
    {
        CCObject* pObject = NULL;
        CCARRAY_FOREACH(m_pChildren,pObject)
        {
            CCNode* pChild = dynamic_cast<ccnode>(pObject);
            if (pChild)
            {
                if (rowColumns == 0) // 如果需要放置数量为0才重新读取数据
                {
                    rowColumns = rows[row]; // 获取需要放置的数量
                    w = winSize.width / (1 + rowColumns); //占屏幕宽度大小平分
                    x = w;
                }
 
                float tmp = pChild->getContentSize().height;
                rowHeight = (unsigned int)((rowHeight >= tmp || isnan(tmp)) ? rowHeight : tmp); // 获取当前行高度最大高度
                pChild->setPosition(ccp(x - winSize.width / 2,y - pChild->getContentSize().height / 2)); // 重新放置位置
 
                x += w;
                ++columnsOccupied;
 
                if (columnsOccupied >= rowColumns) // 如果已放置列数大于等于需要放置的列数
                {
                    y -= rowHeight + 5; // 减去一个子菜单项和间隔的高度
 
                    columnsOccupied = 0;
                    rowColumns = 0;
                    rowHeight = 0;
                    ++row;
                }
            }
        }
    }    
}
 
//alignItemsInRows系列方法参照alignItemsInColumns
void CCMenu::alignItemsInRows(unsigned int rows,rows);
 
    this->alignItemsInRows(rows,args);
 
    va_end(args);
}
 
void CCMenu::alignItemsInRows(unsigned int rows,va_list args)
{
    CCArray* pArray = CCArray::create();
    while (rows)
    {
        pArray->addObject(CCInteger::create(rows));
        rows = va_arg(args,unsigned int);
    }
    alignItemsInRowsWithArray(pArray);
}
 
void CCMenu::alignItemsInRowsWithArray(CCArray* columnArray)
{
    vector<unsigned int=""> columns = ccarray_to_std_vector(columnArray);
 
    vector<unsigned int=""> columnWidths;
    vector<unsigned int=""> columnHeights;
 
    int width = -10;
    int columnHeight = -5;
    unsigned int column = 0;
    unsigned int columnWidth = 0;
    unsigned int rowsOccupied = 0;
    unsigned int columnRows;
 
    if (m_pChildren && m_pChildren->count() > 0)
    {
        CCObject* pObject = NULL;
        CCARRAY_FOREACH(m_pChildren,pObject)
        {
            CCNode* pChild = dynamic_cast<ccnode>(pObject);
            if (pChild)
            {
                // check if too many menu items for the amount of rows/columns
                CCAssert(column < columns.size(),);
 
                columnRows = columns[column];
                // can't have zero rows on a column
                CCAssert(columnRows,);
 
                // columnWidth = fmaxf(columnWidth,[item contentSize].width);
                float tmp = pChild->getContentSize().width;
                columnWidth = (unsigned int)((columnWidth >= tmp || isnan(tmp)) ? columnWidth : tmp);
 
                columnHeight += (int)(pChild->getContentSize().height + 5);
                ++rowsOccupied;
 
                if (rowsOccupied >= columnRows)
                {
                    columnWidths.push_back(columnWidth);
                    columnHeights.push_back(columnHeight);
                    width += columnWidth + 10;
 
                    rowsOccupied = 0;
                    columnWidth = 0;
                    columnHeight = -5;
                    ++column;
                }
            }
        }
    }
 
    // check if too many rows/columns for available menu items.
    CCAssert(! rowsOccupied,);
 
    CCSize winSize = CCDirector::sharedDirector()->getWinSize();
 
    column = 0;
    columnWidth = 0;
    columnRows = 0;
    float x = (float)(-width / 2);
    float y = 0.0;
 
    if (m_pChildren && m_pChildren->count() > 0)
    {
        CCObject* pObject = NULL;
        CCARRAY_FOREACH(m_pChildren,pObject)
        {
            CCNode* pChild = dynamic_cast<ccnode>(pObject);
            if (pChild)
            {
                if (columnRows == 0)
                {
                    columnRows = columns[column];
                    y = (float) columnHeights[column];
                }
 
                // columnWidth = fmaxf(columnWidth,[item contentSize].width);
                float tmp = pChild->getContentSize().width;
                columnWidth = (unsigned int)((columnWidth >= tmp || isnan(tmp)) ? columnWidth : tmp);
 
                pChild->setPosition(ccp(x + columnWidths[column] / 2,y - winSize.height / 2));
 
                y -= pChild->getContentSize().height + 10;
                ++rowsOccupied;
 
                if (rowsOccupied >= columnRows)
                {
                    x += columnWidth + 5;
                    rowsOccupied = 0;
                    columnRows = 0;
                    columnWidth = 0;
                    ++column;
                }
            }
        }
    }
}
 
CCMenuItem* CCMenu::itemForTouch(CCTouch *touch){
    CCPoint touchLocation = touch->getLocation(); // 获取当前触摸点
    if (m_pChildren && m_pChildren->count() > 0) // 判断子节点(子菜单项)是否存在,且个数不为0
    {
        CCObject* pObject = NULL; // 临时变量
        CCARRAY_FOREACH(m_pChildren,pObject) // 遍历子菜单项数组
        {
            CCMenuItem* pChild = dynamic_cast<ccmenuitem>(pObject); // 强制转换,获取当前子菜单项
            if (pChild && pChild->isVisible() && pChild->isEnabled()) // 如果当前子菜单项不为空、且可见、且可用
            {
                CCPoint local = pChild->convertToNodeSpace(touchLocation); // 把世界坐标转换到当前节点的本地坐标系中
                CCRect r = pChild->rect(); // 获取子菜单项范围
                r.origin = CCPointZero;
                if (r.containsPoint(local)) // 判断子菜单项范围中是否包括触摸点
                {
                    return pChild; // 返回该子菜单项
                }
            }
        }
    }
    return NULL; // 返回空
}


看懂了。就是知识

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


    本文实践自 RayWenderlich、Ali Hafizji 的文章《How To Create Dynamic Textures with CCRenderTexture in Cocos2D 2.X》,文中使用Cocos2D,我在这里使用Cocos2D-x 2.1.4进行学习和移植。在这篇文章,将会学习到如何创建实时纹理、如何用Gimp创建无缝拼接纹
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@163.com微信公众号:HopToad 欢迎转载,转载标注出处:http://blog.csdn.netotbaron/article/details/424343991.  软件准备 下载地址:http://cn.cocos2d-x.org/download 2.  简介2.1         引用C
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从Cocos2D-x官网上下载,进入网页http://www.cocos2d-x.org/download,点击Cocos2d-x以下的Download  v3.0,保存到自定义的文件夹2:从python官网上下载。进入网页https://www.python.org/downloads/,我当前下载的是3.4.0(当前最新
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发引擎,易学易用,支持多种智能移动平台。官网地址:http://cocos2d-x.org/当前版本:2.0    有很多的学习资料,在这里我只做为自己的笔记记录下来,错误之处还请指出。在VisualStudio2008平台的编译:1.下载当前稳
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《最强大脑》娱乐节目。将2048改造成一款挑战玩家对数字记忆的小游戏。邮箱:appdevzw@163.com微信公众号:HopToadAPK下载地址:http://download.csdn.net/detailotbaron/8446223源码下载地址:http://download.csdn.net/
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试以QtCreatorIDE来进行CMake构建。Cocos2d-x3.X地址:https://github.com/cocos2d/cocos2d-x1.打开QtCreator,菜单栏→"打开文件或项目...",打开cocos2d-x目录下的CMakeLists.txt文件;2.弹出CMake向导,如下图所示:设置
 下载地址:链接:https://pan.baidu.com/s/1IkQsMU6NoERAAQLcCUMcXQ提取码:p1pb下载完成后,解压进入build目录使用vs2013打开工程设置平台工具集,打开设置界面设置: 点击开始编译等待编译结束编译成功在build文件下会出现一个新文件夹Debug.win32,里面就是编译
分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net前言上次用象棋演示了cocos2dx的基本用法,但是对cocos2dx并没有作深入的讨论,这次以超级马里奥的源代码为线索,我们一起来学习超级马里奥的实
1. 圆形音量button事实上作者的本意应该是叫做“电位计button”。可是我觉得它和我们的圆形音量button非常像,所以就这么叫它吧~先看效果:好了,不多解释,本篇到此为止。(旁白: 噗。就这样结束了?)啊才怪~我们来看看代码:[cpp] viewplaincopyprint?CCContro
原文链接:http://www.cnblogs.com/physwf/archive/2013/04/26/3043912.html为了进一步深入学习贯彻Cocos2d,我们将自己写一个场景类,但我们不会走的太远,凡是都要循序渐进,哪怕只前进一点点,那也至少是前进了,总比贪多嚼不烂一头雾水的好。在上一节中我们建
2019独角兽企业重金招聘Python工程师标准>>>cocos2d2.0之后加入了一种九宫格的实现,主要作用是用来拉伸图片,这样的好处在于保留图片四个角不变形的同时,对图片中间部分进行拉伸,来满足一些控件的自适应(PS: 比如包括按钮,对话框,最直观的形象就是ios里的短信气泡了),这就要求图
原文链接:http://www.cnblogs.com/linji/p/3599478.html1.环境和工具准备Win7VS2010/2012,至于2008v2版本之后似乎就不支持了。 2.安装pythonv.2.0版本之前是用vs模板创建工程的,到vs2.2之后就改用python创建了。到python官网下载版本2.7.5的,然后
环境:ubuntu14.04adt-bundle-linux-x86_64android-ndk-r9d-linux-x86_64cocos2d-x-3.0正式版apache-ant1.9.3python2.7(ubuntu自带)加入环境变量exportANDROID_SDK_ROOT=/home/yangming/adt-bundle-linux/sdkexportPATH=${PATH}:/$ANDROID_SDK_ROOTools/export
1开发背景游戏程序设计涉及了学科中的各个方面,鉴于目的在于学习与进步,本游戏《FlappyBird》采用了两个不同的开发方式来开发本款游戏,一类直接采用win32底层API来实现,另一类采用当前火热的cocos2d-x游戏引擎来开发本游戏。2需求分析2.1数据分析本项目要开发的是一款游
原文链接:http://www.cnblogs.com/linji/p/3599912.html//纯色色块控件(锚点默认左下角)CCLayerColor*ccc=CCLayerColor::create(ccc4(255,0,0,128),200,100);//渐变色块控件CCLayerGradient*ccc=CCLayerGradient::create(ccc4(255,0,0,
原文链接:http://www.cnblogs.com/linji/p/3599488.html//载入一张图片CCSprite*leftDoor=CCSprite::create("loading/door.png");leftDoor->setAnchorPoint(ccp(1,0.5));//设置锚点为右边中心点leftDoor->setPosition(ccp(240,160));/
为了答谢广大学员对智捷课堂以及关老师的支持,现购买51CTO学院关老师的Cocos2d-x课程之一可以送智捷课堂编写图书一本(专题可以送3本)。一、Cocos2d-x课程列表:1、Cocos2d-x入门与提高视频教程__Part22、Cocos2d-x数据持久化与网络通信__Part33、Cocos2d-x架构设计与性能优化内存优
Spawn让多个action同时执行。Spawn有多种不同的create方法,最终都调用了createWithTwoActions(FiniteTimeAction*action1,FiniteTimeAction*action2)方法。createWithTwoActions调用initWithTwoActions方法:对两个action变量初始化:_one=action1;_two=action2;如果两个a
需要环境:php,luajit.昨天在cygwin上安装php和luajit环境,这真特么是一个坑。建议不要用虚拟环境安装打包环境,否则可能会出现各种莫名问题。折腾了一下午,最终将环境转向linux。其中,luajit的安装脚本已经在quick-cocos2d-x-develop/bin/中,直接luajit_install.sh即可。我的lin
v3.0相对v2.2来说,最引人注意的。应该是对触摸层级的优化。和lambda回调函数的引入(嗯嗯,不枉我改了那么多类名。话说,每次cocos2dx大更新。总要改掉一堆类名函数名)。这些特性应该有不少人研究了,所以今天说点跟图片有关的东西。v3.0在载入图片方面也有了非常大改变,仅仅只是