从零开始学习cocoStudio(4)--背包功能

背包基本功能:


    1.存放物品

    2.穿戴装备(套装、武器、宠物等)

    3.待定功能(出售、合成、排序)


如图:




    在做此功能先,要先在AppDelegate类添加搜索资源目录,否则会因资源问题导致各种崩~~~


AppDelegate.cpp

bool AppDelegate::applicationDidFinishLaunching() {
    // initialize director
    CCDirector* pDirector = CCDirector::sharedDirector();
    CCEGLView* pEGLView = CCEGLView::sharedOpenGLView();

    pDirector->setOpenGLView(pEGLView);
	
    // turn on display FPS
   // pDirector->setDisplayStats(true);

    // set FPS. the default value is 1.0/60 if you don't call this
    pDirector->setAnimationInterval(1.0 / 60);

    
    CCSize screenSize = CCEGLView::sharedOpenGLView()->getFrameSize();
    
    CCSize designSize = CCSizeMake(480, 320);
    
    CCFileUtils* pFileUtils = CCFileUtils::sharedFileUtils();
    
    if (screenSize.height > 320)
    {
        CCSize resourceSize = CCSizeMake(960, 640);
        std::vector<std::string> searchPaths;
        searchPaths.push_back("hd");
        pFileUtils->setSearchPaths(searchPaths);
        pDirector->setContentScaleFactor(resourceSize.height/designSize.height);
    }
    
    CCEGLView::sharedOpenGLView()->setDesignResolutionSize(designSize.width, designSize.height, kResolutionShowAll);

    CocosGUIExamplesEquipScene *pScene = new CocosGUIExamplesEquipScene();
    pScene->autorelease();
    
    // run
    pDirector->runWithScene(pScene);
    
    
    
    // create a scene. it's an autorelease object
//    CCScene *pScene = HelloWorld::scene();
//
//    // run
//    pDirector->runWithScene(pScene);

    return true;
}
背包类

CocosGUIExamplesEquipScene.h

#ifndef __DemoBag__CocosGUIExamplesEquipScene__
#define __DemoBag__CocosGUIExamplesEquipScene__

#include <iostream>

#include "cocos2d.h"
#include "cocos-ext.h"
//#include "../../testBasic.h"

#define EQUIP_LAYOUT_TAG_ROOT                            1000       //背包主目录
#define EQUIP_LAYOUT_TAG_UP                              1001       //背包层
#define EQUIP_LAYOUT_TAG_CLOTHES                         1002       //装备层
#define EQUIP_LAYOUT_TAG_WEAPONS                         1003       //武器层
#define EQUIP_LAYOUT_TAG_PETS                            1004       //宠物层

#define EQUIP_SWITCH_LAYOUT_BUTTON_TAG_CLOTHES           1005       //装备按钮
#define EQUIP_SWITCH_LAYOUT_BUTTON_TAG_WEAPONS           1006       //武器按钮
#define EQUIP_SWITCH_LAYOUT_BUTTON_TAG_PETS              1007       //宠物按钮


USING_NS_CC;
USING_NS_CC_EXT;
using namespace gui;

class CocosGUIExamplesEquipScene : public CCScene
{
public:
    CocosGUIExamplesEquipScene();
    ~CocosGUIExamplesEquipScene();
    
    
    void EquipInit();
    
    virtual void onEnter();
    virtual void onExit();

    void switchBtnCallBack(CCObject* pSender);          //菜单切换(装备、武器、宠物)
    
    void create();                                      //初始化装备
    void createClothes();                               //创建装备
    void createWeapons();                               //创建武器
    void createPets();                                  //创建宠物
    
    void touch(CCObject* pSender);                      // 按下
    void move(CCObject* pSender);                       // 移动
    void drop(CCObject* pSender);                       // 取消
    
    void touchEvent(CCObject *pSender, TouchEventType type);    //点击事件
    void backOver(CCObject *pObject);                           //返回事件
    
    void menuCloseCallback(CCObject* pSender);                  //退了按钮
    
protected:
    enum EQUIP_TYPE
    {
        EQUIP_TYPE_NONE,        //默认
        EQUIP_TYPE_CLOTHES,     //装备
        EQUIP_TYPE_WEAPONS,     //武器
        EQUIP_TYPE_PETS,        //宠物
    };
    
protected:
    UILayer* m_pUIlayer;
    
    //装备
    EQUIP_TYPE m_eEquipType;        //宏(装备、武器、宠物)
    
    CCDictionary* m_dicBeUsedSlot;  //存储上装容器(框)
    CCDictionary* m_dicClothesSlot; //存储装备容器(框)
    CCDictionary* m_dicWeaponsSlot; //存储武器容器(框)
    CCDictionary* m_dicPetsSlot;    //存储宠物容器(框)
    
    CCDictionary* m_dicClothes;     //存储装备容器(图片)
    CCDictionary* m_dicWeapons;     //存储武器容器(图片)
    CCDictionary* m_dicPets;        //存储宠物容器(图片)

    
    int container_1_Zorder;         //装备层级(Z轴)
    int container_2_Zorder;         //武器层级(Z轴)
    int container_3_Zorder;         //宠物层级(Z轴)
    
    CCPoint container_1_Position;   //装备位置
    CCPoint container_2_Position;   //装备位置
    CCPoint container_3_Position;   //装备位置
    
    CCPoint movePoint;              //移动始点
    CCPoint lastPoint;              //移动终点
    
    CCPoint widgetLastWorldSpace;   //游戏世界坐标(始点)
    CCPoint widgetLastNodeSpace;    //节点位置
    UIWidget* lastWidgetParent;     //获得父节点
};

#endif /* defined(__DemoBag__CocosGUIExamplesEquipScene__) */
CocosGUIExamplesEquipScene.cpp

#include "CocosGUIExamplesEquipScene.h"

CocosGUIExamplesEquipScene::CocosGUIExamplesEquipScene()
{
    CCScene::init();
}

CocosGUIExamplesEquipScene::~CocosGUIExamplesEquipScene()
{
    
}

void CocosGUIExamplesEquipScene::onEnter()
{
    CCScene::onEnter();
    
    m_pUIlayer = UILayer::create();
    m_pUIlayer->scheduleUpdate();
    addChild(m_pUIlayer);
    
    //背包初始化
    EquipInit();
    
    // 退出按钮
    UIButton* exit_button = UIButton::create();
    exit_button->setTouchEnabled(true);
    exit_button->loadTextures("CloseNormal.png", "CloseSelected.png", "");
    exit_button->setPosition(ccp(m_pUIlayer->getContentSize().width - exit_button->getContentSize().width, exit_button->getContentSize().height));
    exit_button->addTouchEventListener(this, toucheventselector(CocosGUIExamplesEquipScene::menuCloseCallback));
    m_pUIlayer->addWidget(exit_button);
}

void CocosGUIExamplesEquipScene::onExit()
{
    
}

//背包初始化
void CocosGUIExamplesEquipScene::EquipInit()
{
    m_eEquipType = EQUIP_TYPE_CLOTHES;
    
    m_dicBeUsedSlot = CCDictionary::create();
    CC_SAFE_RETAIN(m_dicBeUsedSlot);
    m_dicClothesSlot = CCDictionary::create();
    CC_SAFE_RETAIN(m_dicClothesSlot);
    m_dicWeaponsSlot = CCDictionary::create();
    CC_SAFE_RETAIN(m_dicWeaponsSlot);
    m_dicPetsSlot = CCDictionary::create();
    CC_SAFE_RETAIN(m_dicPetsSlot);
    
    
    m_dicClothes = CCDictionary::create();
    CC_SAFE_RETAIN(m_dicClothes);
    m_dicWeapons = CCDictionary::create();
    CC_SAFE_RETAIN(m_dicWeapons);
    m_dicPets = CCDictionary::create();
    CC_SAFE_RETAIN(m_dicPets);
    
    container_1_Zorder = 0;
    container_2_Zorder = 0;
    container_3_Zorder = 0;
    container_1_Position = CCPointZero;  
    container_2_Position = CCPointZero;
    container_3_Position = CCPointZero;
    movePoint = CCPointZero;
    lastPoint = CCPointZero;
    
    widgetLastWorldSpace = CCPointZero;
    widgetLastNodeSpace = CCPointZero;
    lastWidgetParent = NULL;

    
    //导入背包UI
    Layout* equipe_root = dynamic_cast<Layout*>(GUIReader::shareReader()->widgetFromJsonFile("cocosgui/gui_examples/equip_1/equip_1.json"));
    equipe_root->setTag(EQUIP_LAYOUT_TAG_ROOT);
    m_pUIlayer->addWidget(equipe_root);
    
    // title layout
    Layout* title_layout = dynamic_cast<Layout*>(equipe_root->getChildByName("title_panel"));
    
    //关闭按钮
    UIButton* close_btn = dynamic_cast<UIButton*>(title_layout->getChildByName("close_button"));
    close_btn->setVisible(false);
    
    // up layout
    Layout* up_layout = dynamic_cast<Layout*>(equipe_root->getChildByName("up_panel"));
    up_layout->setTag(EQUIP_LAYOUT_TAG_UP);
    
    //切换按钮(装备、武器、宠物)
    //装备
    UITextButton* clothes_btn = dynamic_cast<UITextButton*>(up_layout->getChildByName("clothes_button"));
    clothes_btn->addTouchEventListener(this, toucheventselector(CocosGUIExamplesEquipScene::switchBtnCallBack));
    clothes_btn->setTag(EQUIP_SWITCH_LAYOUT_BUTTON_TAG_CLOTHES);
    clothes_btn->setBright(false);  //设置无效灰色

    //武器
    UITextButton* weapons_btn = dynamic_cast<UITextButton*>(up_layout->getChildByName("weapons_button"));
    weapons_btn->addTouchEventListener(this, toucheventselector(CocosGUIExamplesEquipScene::switchBtnCallBack));
    weapons_btn->setTag(EQUIP_SWITCH_LAYOUT_BUTTON_TAG_WEAPONS);
    
    //宠物
    UITextButton* pets_btn = dynamic_cast<UITextButton*>(up_layout->getChildByName("pets_button"));
    pets_btn->addTouchEventListener(this, toucheventselector(CocosGUIExamplesEquipScene::switchBtnCallBack));
    pets_btn->setTag(EQUIP_SWITCH_LAYOUT_BUTTON_TAG_PETS);
    
    // repertories
    // 装备 layout
    Layout* clothes_layout = dynamic_cast<Layout*>(equipe_root->getChildByName("clothes_panel"));
    clothes_layout->setTag(EQUIP_LAYOUT_TAG_CLOTHES);
    
    // 武器 layout
    Layout* weapons_layout = dynamic_cast<Layout*>(equipe_root->getChildByName("weapons_panel"));
    weapons_layout->setTag(EQUIP_LAYOUT_TAG_WEAPONS);
    
    // 宠物 layout
    Layout* pets_layout = dynamic_cast<Layout*>(equipe_root->getChildByName("pets_panel"));
    pets_layout->setTag(EQUIP_LAYOUT_TAG_PETS);
    
    container_1_Zorder = clothes_layout->getZOrder();
    container_2_Zorder = weapons_layout->getZOrder();
    container_3_Zorder = pets_layout->getZOrder();
    
    container_1_Position = clothes_layout->getPosition();
    container_2_Position = weapons_layout->getPosition();
    container_3_Position = pets_layout->getPosition();

    //默认显示衣服
    clothes_layout->setVisible(true);
    weapons_layout->setVisible(false);
    pets_layout->setVisible(false);
    
    CCObject* obj = NULL;
    // clothes repertory slot
    CCARRAY_FOREACH(clothes_layout->getChildren(), obj)
    {
        UIWidget* child = dynamic_cast<UIWidget*>(obj);
        m_dicClothesSlot->setObject(child, child->getName());
    }
    // weapons repertory slot
    CCARRAY_FOREACH(weapons_layout->getChildren(), obj)
    {
        UIWidget* child = dynamic_cast<UIWidget*>(obj);
        m_dicWeaponsSlot->setObject(child, child->getName());
    }
    // pets repertory slot
    CCARRAY_FOREACH(pets_layout->getChildren(), obj)
    {
        UIWidget* child = dynamic_cast<UIWidget*>(obj);
        m_dicPetsSlot->setObject(child, child->getName());
    }
    
    // actor
    UIImageView* wallBG_iv = dynamic_cast<UIImageView*>(up_layout->getChildByName("wall"));
    UIImageView* wal_iv = UIImageView::create();
    wal_iv->loadTexture("cocosgui/gui_examples/equip_1/equip/eg/Haven_Alaric.png");         //英雄头像
    wal_iv->setAnchorPoint(ccp(0.5, 0.5));
    wal_iv->setScale(0.76);
    float wal_x = wallBG_iv->getSize().width / 2.04;
    float wal_y = wallBG_iv->getSize().height / 2.4;
    wal_iv->setPosition(ccp((-wallBG_iv->getSize().width / 2) +  wal_x,
                            (-wallBG_iv->getSize().height / 2) + wal_y));
    wallBG_iv->addChild(wal_iv);
    
    
    //默认上装位置
    UIImageView* originalClothesSlot_iv = dynamic_cast<UIImageView*>(up_layout->getChildByName("1"));
    UIImageView* originalClothes_iv = UIImageView::create();
    originalClothes_iv->loadTexture("cocosgui/gui_examples/equip_1/equip/eg/6.png");
    originalClothes_iv->setScale(0.3);
    originalClothesSlot_iv->addChild(originalClothes_iv);
    m_dicBeUsedSlot->setObject(originalClothesSlot_iv, originalClothesSlot_iv->getName());

    UIImageView* slot_2_iv = dynamic_cast<UIImageView*>(up_layout->getChildByName("2"));
    m_dicBeUsedSlot->setObject(slot_2_iv, slot_2_iv->getName());
    UIImageView* slot_3_iv = dynamic_cast<UIImageView*>(up_layout->getChildByName("3"));
    m_dicBeUsedSlot->setObject(slot_3_iv, slot_3_iv->getName());
    UIImageView* slot_4_iv = dynamic_cast<UIImageView*>(up_layout->getChildByName("4"));
    m_dicBeUsedSlot->setObject(slot_4_iv, slot_4_iv->getName());
    UIImageView* slot_5_iv = dynamic_cast<UIImageView*>(up_layout->getChildByName("5"));
    m_dicBeUsedSlot->setObject(slot_5_iv, slot_5_iv->getName());
    UIImageView* slot_6_iv = dynamic_cast<UIImageView*>(up_layout->getChildByName("6"));
    m_dicBeUsedSlot->setObject(slot_6_iv, slot_6_iv->getName());
    
    //背包(装备、武器、宠物)初始化
    create();
}

void CocosGUIExamplesEquipScene::create()
{
    createClothes();
    createWeapons();
    createPets();
}


void CocosGUIExamplesEquipScene::createClothes()
{
    Layout* clothes_layout = dynamic_cast<Layout*>(m_pUIlayer->getWidgetByTag(EQUIP_LAYOUT_TAG_CLOTHES));
    
    // clothes
    float parent_w = clothes_layout->getSize().width;
    float parent_h = clothes_layout->getSize().height;
    float offest_x = parent_w / 10;
    float offest_y = parent_h / 6;
    
    const short columnMax = 3;
    
    // jacket
    const char* jacket_png[columnMax] =
    {
        "cocosgui/gui_examples/equip_1/equip/eg/Clothes/3.png",
        "cocosgui/gui_examples/equip_1/equip/eg/Clothes/4.png",
        "cocosgui/gui_examples/equip_1/equip/eg/Clothes/5.png",
    };
    const char* jacket_name[columnMax] =
    {
        "jacket_taenia",
        "jacket_suit",
        "jacket_shoes",
    };
    // jacket imageview add to clothes slot
    for (int i = 0; i < columnMax; ++i)
    {
        UIImageView* jacket_iv = UIImageView::create();
        jacket_iv->loadTexture(jacket_png[i]);
        jacket_iv->setScale(0.3);
        jacket_iv->setAnchorPoint(ccp(0.5, 0.5));
        jacket_iv->setPosition(ccp(offest_x + i * offest_x * 4, parent_h - offest_y));
        UIWidget* lastChild = dynamic_cast<UIWidget*>(clothes_layout->getChildren()->lastObject());
        if (lastChild)
        {
            jacket_iv->setZOrder(lastChild->getZOrder() + 1);
        }
        jacket_iv->setName(jacket_name[i]);
        jacket_iv->setTouchEnabled(true);
        jacket_iv->setScale(0.3);
        jacket_iv->addTouchEventListener(this, toucheventselector(CocosGUIExamplesEquipScene::touchEvent));
        
        
        CCObject* obj = NULL;
        CCARRAY_FOREACH(clothes_layout->getChildren(), obj)
        {
            UIWidget* slot = dynamic_cast<UIWidget*>(obj);
            slot->setCascadeColorEnabled(false);
            if (slot->boundingBox().containsPoint(jacket_iv->getPosition()))
            {
                jacket_iv->setPosition(CCPointZero);
                slot->addChild(jacket_iv);
                break;
            }
        }
        
        m_dicClothes->setObject(jacket_iv, jacket_iv->getName());
    }
    
    // kimono
    const char* kimono_png[columnMax] =
    {
        "cocosgui/gui_examples/equip_1/equip/eg/Clothes/8.png",
        "cocosgui/gui_examples/equip_1/equip/eg/Clothes/10.png",
        "cocosgui/gui_examples/equip_1/equip/eg/Clothes/9.png",
    };
    const char* kimono_name[columnMax] =
    {
        "kimono_strawhat",
        "kimono_suit",
        "kimono_shoes",
    };
    // kimono imageview add to clothes slot
    for (int i = 0; i < columnMax; ++i)
    {
        UIImageView* kimono_iv = UIImageView::create();
        kimono_iv->loadTexture(kimono_png[i]);
        kimono_iv->setScale(0.3);
        kimono_iv->setPosition(ccp(offest_x + i * offest_x * 4, parent_h - offest_y * 3));
        UIWidget* lastChild = dynamic_cast<UIWidget*>(clothes_layout->getChildren()->lastObject());
        if (lastChild)
        {
            kimono_iv->setZOrder(lastChild->getZOrder() + 1);
        }
        kimono_iv->setName(kimono_name[i]);
        kimono_iv->setTouchEnabled(true);
        kimono_iv->addTouchEventListener(this, toucheventselector(CocosGUIExamplesEquipScene::touchEvent));

        CCObject* obj = NULL;
        CCARRAY_FOREACH(clothes_layout->getChildren(), obj)
        {
            UIWidget* slot = dynamic_cast<UIWidget*>(obj);
            slot->setCascadeColorEnabled(false);
            if (slot->boundingBox().containsPoint(kimono_iv->getPosition()))
            {
                kimono_iv->setPosition(CCPointZero);
                slot->addChild(kimono_iv);
                break;
            }
        }
    
        m_dicClothes->setObject(kimono_iv, kimono_iv->getName());
    }
}

void CocosGUIExamplesEquipScene::createWeapons()
{
    Layout* weapons_panel = dynamic_cast<Layout*>(m_pUIlayer->getWidgetByTag(EQUIP_LAYOUT_TAG_WEAPONS));
    
    // weapons
    float parent_w = weapons_panel->getSize().width;
    float parent_h = weapons_panel->getSize().height;
    float offest_x = parent_w / 10;
    float offest_y = parent_h / 6;
    
    // sword
    const short swordAmount = 3;
    const char* sword_png[swordAmount] =
    {
        "cocosgui/gui_examples/equip_1/equip/eg/weapons/train.png",
        "cocosgui/gui_examples/equip_1/equip/eg/weapons/research.png",
        "cocosgui/gui_examples/equip_1/equip/eg/weapons/upgrade.png",
    };
    const char* sword_name[swordAmount] =
    {
        "sword_sword",
        "sword_plus",
        "sword_hammer",
    };
    
    // sword imageview add to weapons slot
    for (int i = 0; i < swordAmount; ++i)
    {
        UIImageView* sword_iv = UIImageView::create();
        sword_iv->loadTexture(sword_png[i]);
        sword_iv->setScale(0.3);
        sword_iv->setPosition(ccp(offest_x, parent_h - offest_y - i * (offest_y * 2)));
        UIWidget* lastChild = dynamic_cast<UIWidget*>(weapons_panel->getChildren()->lastObject());
        if (lastChild)
        {
            sword_iv->setZOrder(lastChild->getZOrder() + 1);
        }
        sword_iv->setName(sword_name[i]);
        sword_iv->setScale(0.3);
        sword_iv->addTouchEventListener(this, toucheventselector(CocosGUIExamplesEquipScene::touchEvent));
        
        CCObject* obj = NULL;
        CCARRAY_FOREACH(weapons_panel->getChildren(), obj)
        {
            UIWidget* slot = dynamic_cast<UIWidget*>(obj);
            slot->setCascadeColorEnabled(false);
            if (slot->boundingBox().containsPoint(sword_iv->getPosition()))
            {
                sword_iv->setPosition(CCPointZero);
                slot->addChild(sword_iv);
                break;
            }
        }
        
        m_dicWeapons->setObject(sword_iv, sword_iv->getName());
    }
    

    // arrow
    const short arrowAmount = 3;
    const char* arrow_png[arrowAmount] =
    {
        "cocosgui/gui_examples/equip_1/equip/eg/weapons/shop_shield_1.png",
        "cocosgui/gui_examples/equip_1/equip/eg/weapons/shop_shield_2.png",
        "cocosgui/gui_examples/equip_1/equip/eg/weapons/shop_shield_3.png",
    };
    const char* arrow_name[arrowAmount] =
    {
        "arraw_normal",
        "arraw_hard",
        "arraw_devil",
    };
    // arrow imageview add to weapons slot
    for (int i = 0; i < arrowAmount; ++i)
    {
        UIImageView* arrow_iv = UIImageView::create();
        arrow_iv->loadTexture(arrow_png[i]);
        arrow_iv->setScale(0.16);
        arrow_iv->setPosition(ccp(offest_x * 5, parent_h - offest_y - i * (offest_y * 2)));
        UIWidget* lastChild = dynamic_cast<UIWidget*>(weapons_panel->getChildren()->lastObject());
        if (lastChild)
        {
            arrow_iv->setZOrder(lastChild->getZOrder() + 1);
        }
        arrow_iv->setName(arrow_name[i]);
        arrow_iv->addTouchEventListener(this, toucheventselector(CocosGUIExamplesEquipScene::touchEvent));
        
        
        CCObject* obj = NULL;
        CCARRAY_FOREACH(weapons_panel->getChildren(), obj)
        {
            UIWidget* slot = dynamic_cast<UIWidget*>(obj);
            slot->setCascadeColorEnabled(false);
            if (slot->boundingBox().containsPoint(arrow_iv->getPosition()))
            {
                arrow_iv->setPosition(CCPointZero);
                slot->addChild(arrow_iv);
                break;
            }
        }
        
        m_dicWeapons->setObject(arrow_iv, arrow_iv->getName());
    }
    
    // bomb
    const short bombAmount = 1;
    const char* bomb_png[bombAmount] =
    {
        "cocosgui/gui_examples/equip_1/equip/eg/weapons/sell.png",
    };
    const char* bomb_name[bombAmount] =
    {
        "bomb_normal",
    };
    // bomo imageview add to weapons slot
    for (int i = 0; i < bombAmount; ++i)
    {
        UIImageView* bomb_iv = UIImageView::create();
        bomb_iv->loadTexture(bomb_png[i]);
        bomb_iv->setScale(0.3);
        bomb_iv->setPosition(ccp(offest_x * 9, parent_h - offest_y - i * (offest_y * 2)));
        UIWidget* lastChild = dynamic_cast<UIWidget*>(weapons_panel->getChildren()->lastObject());
        if (lastChild)
        {
            bomb_iv->setZOrder(lastChild->getZOrder() + 1);
        }
        bomb_iv->setName(bomb_name[i]);
        bomb_iv->addTouchEventListener(this, toucheventselector(CocosGUIExamplesEquipScene::touchEvent));
        
        CCObject* obj = NULL;
        CCARRAY_FOREACH(weapons_panel->getChildren(), obj)
        {
            UIWidget* slot = dynamic_cast<UIWidget*>(obj);
            slot->setCascadeColorEnabled(false);
            if (slot->boundingBox().containsPoint(bomb_iv->getPosition()))
            {
                bomb_iv->setPosition(CCPointZero);
                slot->addChild(bomb_iv);
                break;
            }
        }
        
        m_dicWeapons->setObject(bomb_iv, bomb_iv->getName());
    }
}

void CocosGUIExamplesEquipScene::createPets()
{
    Layout* pets_layout = dynamic_cast<Layout*>(m_pUIlayer->getWidgetByTag(EQUIP_LAYOUT_TAG_PETS));
    
    // pets
    float parent_w = pets_layout->getSize().width;
    float parent_h = pets_layout->getSize().height;
    float offest_x = parent_w / 10;
    float offest_y = parent_h / 6;
    
    // dragon
    const short dragonAmount = 1;
    const char* dragon_png[dragonAmount] =
    {
        "cocosgui/gui_examples/equip_1/equip/eg/pets/7.png",
    };
    const char* dragon_name[dragonAmount] =
    {
        "pet_dragon",
    };
    // dragon imageview add to pets slot
    for (int i = 0; i < dragonAmount; ++i)
    {
        UIImageView* dragon_iv = UIImageView::create();
        dragon_iv->loadTexture(dragon_png[i]);
        dragon_iv->setPosition(ccp(offest_x, parent_h - offest_y - i * (offest_y * 2)));
        UIWidget* lastChild = dynamic_cast<UIWidget*>(pets_layout->getChildren()->lastObject());
        if (lastChild)
        {
            dragon_iv->setZOrder(lastChild->getZOrder() + 1);
        }
        dragon_iv->setName(dragon_name[i]);
        dragon_iv->addTouchEventListener(this, toucheventselector(CocosGUIExamplesEquipScene::touchEvent));
        dragon_iv->setScale(0.18);
        
        CCObject* obj = NULL;
        CCARRAY_FOREACH(pets_layout->getChildren(), obj)
        {
            UIWidget* slot = dynamic_cast<UIWidget*>(obj);
            slot->setCascadeColorEnabled(false);
            if (slot->boundingBox().containsPoint(dragon_iv->getPosition()))
            {
                dragon_iv->setPosition(CCPointZero);
                slot->addChild(dragon_iv);
                break;
            }
        }
        
        m_dicPets->setObject(dragon_iv, dragon_iv->getName());
    }
    
    // crab
    const short crabAmount = 1;
    const char* crab_png[crabAmount] =
    {
        "cocosgui/gui_examples/equip_1/equip/eg/pets/crab.png",
    };
    const char* crab_name[crabAmount] =
    {
        "pet_crab",
    };
    // crab imageview add to pets slot
    for (int i = 0; i < crabAmount; ++i)
    {
        UIImageView* crab_iv = UIImageView::create();
        crab_iv->loadTexture(crab_png[i]);
        crab_iv->setScale(0.18);
        crab_iv->setPosition(ccp(offest_x * 5, parent_h - offest_y - i * (offest_y * 2)));
        UIWidget* lastChild = dynamic_cast<UIWidget*>(pets_layout->getChildren()->lastObject());
        if (lastChild)
        {
            crab_iv->setZOrder(lastChild->getZOrder() + 1);
        }
        crab_iv->setName(crab_name[i]);
        crab_iv->setScale(0.18);
        crab_iv->addTouchEventListener(this, toucheventselector(CocosGUIExamplesEquipScene::touchEvent));
        
        CCObject* obj = NULL;
        CCARRAY_FOREACH(pets_layout->getChildren(), obj)
        {
            UIWidget* slot = dynamic_cast<UIWidget*>(obj);
            slot->setCascadeColorEnabled(false);
            if (slot->boundingBox().containsPoint(crab_iv->getPosition()))
            {
                crab_iv->setPosition(CCPointZero);
                slot->addChild(crab_iv);
                break;
            }
        }
        
        m_dicPets->setObject(crab_iv, crab_iv->getName());
    }

}


void CocosGUIExamplesEquipScene::switchBtnCallBack(cocos2d::CCObject *pSender)
{
    //CCLOG("有感觉");
    // switch button
    UIButton* button = dynamic_cast<UIButton*>(pSender);
    
    // equip root
    Layout* root = dynamic_cast<Layout*>(m_pUIlayer->getWidgetByTag(EQUIP_LAYOUT_TAG_ROOT));
    
    // equip repertory
    Layout* clothes_layout = dynamic_cast<Layout*>(root->getChildByTag(EQUIP_LAYOUT_TAG_CLOTHES));
    Layout* weapons_layout = dynamic_cast<Layout*>(root->getChildByTag(EQUIP_LAYOUT_TAG_WEAPONS));
    Layout* pets_layout = dynamic_cast<Layout*>(root->getChildByTag(EQUIP_LAYOUT_TAG_PETS));
    
    Layout* up_layout = dynamic_cast<Layout*>(root->getChildByTag(EQUIP_LAYOUT_TAG_UP));
    UITextButton* clothes_btn = dynamic_cast<UITextButton*>(up_layout->getChildByTag(EQUIP_SWITCH_LAYOUT_BUTTON_TAG_CLOTHES));
    UITextButton* weapons_btn = dynamic_cast<UITextButton*>(up_layout->getChildByTag(EQUIP_SWITCH_LAYOUT_BUTTON_TAG_WEAPONS));
    UITextButton* pets_btn = dynamic_cast<UITextButton*>(up_layout->getChildByTag(EQUIP_SWITCH_LAYOUT_BUTTON_TAG_PETS));
    
    clothes_btn->visit();
    weapons_btn->visit();
    pets_btn->visit();
    
    CCDictElement* element = NULL;

    // switch slot
    switch (button->getTag())
    {
        case EQUIP_SWITCH_LAYOUT_BUTTON_TAG_CLOTHES:
        {
            m_eEquipType = EQUIP_TYPE_CLOTHES;
            
            //clothes_btn->disable();
            
            clothes_btn->setBright(false);
            weapons_btn->setBright(true);
            pets_btn->setBright(true);
            
            //显示装备层
            clothes_layout->setVisible(true);
            weapons_layout->setVisible(false);
            pets_layout->setVisible(false);
            
            
            clothes_layout->setZOrder(container_1_Zorder);
            weapons_layout->setZOrder(container_2_Zorder);
            pets_layout->setZOrder(container_3_Zorder);
            
            clothes_layout->setPosition(container_1_Position);
            weapons_layout->setPosition(container_2_Position);
            pets_layout->setPosition(container_3_Position);
            
            // equip slot touch able
            clothes_layout->setTouchEnabled(true);
            CCDICT_FOREACH(m_dicClothesSlot, element)
            {
                UIWidget* child = dynamic_cast<UIWidget*>(element->getObject());
                child->setTouchEnabled(true);
            }
            CCDICT_FOREACH(m_dicClothes, element)
            {
                UIWidget* child = dynamic_cast<UIWidget*>(element->getObject());
                child->setTouchEnabled(true);
            }
            weapons_layout->setTouchEnabled(false);
            CCDICT_FOREACH(m_dicWeaponsSlot, element)
            {
                UIWidget* child = dynamic_cast<UIWidget*>(element->getObject());
                child->setTouchEnabled(false);
            }
            CCDICT_FOREACH(m_dicWeapons, element)
            {
                UIWidget* child = dynamic_cast<UIWidget*>(element->getObject());
                child->setTouchEnabled(false);
            }
            pets_layout->setTouchEnabled(false);
            CCDICT_FOREACH(m_dicPetsSlot, element)
            {
                UIWidget* child = dynamic_cast<UIWidget*>(element->getObject());
                child->setTouchEnabled(false);
            }
            CCDICT_FOREACH(m_dicPets, element)
            {
                UIWidget* child = dynamic_cast<UIWidget*>(element->getObject());
                child->setTouchEnabled(false);
            }
        }
            break;
            
        case EQUIP_SWITCH_LAYOUT_BUTTON_TAG_WEAPONS:
        {
            m_eEquipType = EQUIP_TYPE_WEAPONS;

            clothes_btn->setBright(true);
            weapons_btn->setBright(false);
            pets_btn->setBright(true);
            
            //显示武器层
            clothes_layout->setVisible(false);
            weapons_layout->setVisible(true);
            pets_layout->setVisible(false);
            
            clothes_layout->setZOrder(container_3_Zorder);
            weapons_layout->setZOrder(container_1_Zorder);
            pets_layout->setZOrder(container_2_Zorder);
            
            weapons_layout->setPosition(container_1_Position);
            pets_layout->setPosition(container_2_Position);
            clothes_layout->setPosition(container_3_Position);
            
            // equip slot touch able
            weapons_layout->setBright(true);
            CCDICT_FOREACH(m_dicWeaponsSlot, element)
            {
                UIWidget* child = dynamic_cast<UIWidget*>(element->getObject());
                child->setTouchEnabled(true);
            }
            CCDICT_FOREACH(m_dicWeapons, element)
            {
                UIWidget* child = dynamic_cast<UIWidget*>(element->getObject());
                child->setTouchEnabled(true);
            }
            clothes_layout->setTouchEnabled(false);
            CCDictElement* element = NULL;
            CCDICT_FOREACH(m_dicClothesSlot, element)
            {
                UIWidget* child = dynamic_cast<UIWidget*>(element->getObject());
                child->setTouchEnabled(false);
            }
            CCDICT_FOREACH(m_dicClothes, element)
            {
                UIWidget* child = dynamic_cast<UIWidget*>(element->getObject());
                child->setTouchEnabled(false);
            }
            pets_layout->setTouchEnabled(false);
            CCDICT_FOREACH(m_dicPetsSlot, element)
            {
                UIWidget* child = dynamic_cast<UIWidget*>(element->getObject());
                child->setTouchEnabled(false);
            }
            CCDICT_FOREACH(m_dicPets, element)
            {
                UIWidget* child = dynamic_cast<UIWidget*>(element->getObject());
                child->setTouchEnabled(false);
            }
        }
            break;
            
        case EQUIP_SWITCH_LAYOUT_BUTTON_TAG_PETS:
        {
            m_eEquipType = EQUIP_TYPE_PETS;
            
            clothes_btn->setBright(true);
            weapons_btn->setBright(true);
            pets_btn->setBright(false);
            
            //显示宠物层
            clothes_layout->setVisible(false);
            weapons_layout->setVisible(false);
            pets_layout->setVisible(true);
            
            pets_layout->setZOrder(container_1_Zorder);
            clothes_layout->setZOrder(container_2_Zorder);
            weapons_layout->setZOrder(container_3_Zorder);
            
            pets_layout->setPosition(container_1_Position);
            clothes_layout->setPosition(container_2_Position);
            weapons_layout->setPosition(container_3_Position);
            
            // equip slot touch able
            pets_layout->setTouchEnabled(true);
            CCDICT_FOREACH(m_dicPetsSlot, element)
            {
                UIWidget* child = dynamic_cast<UIWidget*>(element->getObject());
                child->setTouchEnabled(true);
            }
            CCDICT_FOREACH(m_dicPets, element)
            {
                UIWidget* child = dynamic_cast<UIWidget*>(element->getObject());
                child->setTouchEnabled(true);
            }
            clothes_layout->setTouchEnabled(false);
            CCDICT_FOREACH(m_dicClothesSlot, element)
            {
                UIWidget* child = dynamic_cast<UIWidget*>(element->getObject());
                child->setTouchEnabled(false);
            }
            CCDICT_FOREACH(m_dicClothes, element)
            {
                UIWidget* child = dynamic_cast<UIWidget*>(element->getObject());
                child->setTouchEnabled(false);
            }
            weapons_layout->setTouchEnabled(false);
            CCDICT_FOREACH(m_dicWeaponsSlot, element)
            {
                UIWidget* child = dynamic_cast<UIWidget*>(element->getObject());
                child->setTouchEnabled(false);
            }
            CCDICT_FOREACH(m_dicWeapons, element)
            {
                UIWidget* child = dynamic_cast<UIWidget*>(element->getObject());
                child->setTouchEnabled(false);
            }
        }
            break;
            
        default:
            break;
    }

    
}

void CocosGUIExamplesEquipScene::touchEvent(CCObject *pSender, TouchEventType type)
{
    switch (type)
    {
        case TOUCH_EVENT_BEGAN:
            touch(pSender);
            break;
        case TOUCH_EVENT_MOVED:
            move(pSender);
            break;
        case TOUCH_EVENT_ENDED:
            drop(pSender);
            break;
    }
}


//按下
void CocosGUIExamplesEquipScene::touch(cocos2d::CCObject *pSender)
{
    UIWidget* widget = dynamic_cast<UIWidget*>(pSender);
    CCPoint worldSpace = widget->convertToWorldSpace(CCPointZero);  //坐标转换到游戏世界坐标
    
    widgetLastWorldSpace = worldSpace;
    widgetLastNodeSpace = widget->getPosition();
    
    lastWidgetParent =(UIWidget* )(widget->getParent());
    widget->removeFromParentAndCleanup(false);          //删除节点
    
    m_pUIlayer->addWidget(widget);
    
    widget->setPosition(widget->getTouchStartPos());
    movePoint = widget->getTouchStartPos();
}

//移动
void CocosGUIExamplesEquipScene::move(CCObject* pSender)
{
    UIWidget* widget = dynamic_cast<UIWidget*>(pSender);
    
    lastPoint = movePoint;
    movePoint = widget->getTouchMovePos();
    CCPoint offset = ccpSub(movePoint, lastPoint);
    CCPoint toPoint = ccpAdd(widget->getPosition(), offset);
    widget->setPosition(toPoint);
}

//放下
void CocosGUIExamplesEquipScene::drop(cocos2d::CCObject *pSender)
{
    bool isInUsedSlot = false;
    bool isInEquipSlot = false;
    
    UIWidget* widget = dynamic_cast<UIWidget*>(pSender);
    
    CCDictElement* element = NULL;
    
     // drop into used slot
     CCDICT_FOREACH(m_dicBeUsedSlot, element)
    {
        UIWidget* usedSlot_wigt = dynamic_cast<UIWidget*>(element->getObject());
        if (usedSlot_wigt->getChildren()->count() > 0)
        {
            continue;
        }
        //碰撞检测
        if (usedSlot_wigt->hitTest(widget->getPosition()))
        {
            widget->removeFromParentAndCleanup(false);
            widget->setPosition(CCPointZero);
            usedSlot_wigt->setScale(1.1);
            usedSlot_wigt->addChild(widget);
            isInUsedSlot = true;
            break;
        }
    }
    
    //判断移到哪个类型仓库(衣服、武器、宠物)
    CCDictionary* equipSlot_dic = NULL;
    CCDictionary* equip_dic = NULL;
    switch (m_eEquipType)
    {
        case EQUIP_TYPE_CLOTHES:
            equipSlot_dic = m_dicClothesSlot;
            equip_dic = m_dicClothes;
            break;
            
        case EQUIP_TYPE_WEAPONS:
            equipSlot_dic = m_dicWeaponsSlot;
            equip_dic = m_dicWeapons;
            break;
            
        case EQUIP_TYPE_PETS:
            equipSlot_dic = m_dicPetsSlot;
            equip_dic = m_dicPets;
            break;
            
        default:
            break;
    }
    
    CCDICT_FOREACH(equipSlot_dic, element)
    {
        UIWidget* equipSlot = dynamic_cast<UIWidget*>(element->getObject());
        if (equipSlot->getChildren()->count() > 0)
        {
            continue;
        }
        
        if (equipSlot->hitTest(widget->getPosition()))
        {
            CCObject* obj = equip_dic->objectForKey(widget->getName());
            if (obj)
            {
                widget->removeFromParentAndCleanup(false);
                widget->setPosition(CCPointZero);
                equipSlot->addChild(widget);
                
                isInEquipSlot = true;
            }
            break;
        }
    }

    // back to last position if cannot drop other slot
    // 若仓库已有物品,返回原来位置
    if (!isInUsedSlot && !isInEquipSlot)
    {
        CCPoint point = widgetLastWorldSpace;
        CCMoveTo* moveTo = CCMoveTo::create(1.0f, point);
        CCEaseExponentialOut* ease = CCEaseExponentialOut::create(moveTo);
        CCCallFuncO* calllFunc0 = CCCallFuncO::create(this, callfuncO_selector(CocosGUIExamplesEquipScene::backOver), widget);
        CCSequence* seq = CCSequence::create(ease, calllFunc0, NULL);
        widget->runAction(seq);
        
        // widget in equip slot
        CCDICT_FOREACH(equip_dic, element)
        {
            UIWidget* widget = dynamic_cast<UIWidget*>(element->getObject());
            widget->setTouchEnabled(false);
        }
        
        // equip up layout
        Layout* equipe_root = dynamic_cast<Layout*>(m_pUIlayer->getWidgetByTag(EQUIP_LAYOUT_TAG_ROOT));
        Layout* up_layout = dynamic_cast<Layout*>(equipe_root->getChildByName("up_panel"));
        CCObject* obj = NULL;
        up_layout->setTouchEnabled(false);
        CCARRAY_FOREACH(up_layout->getChildren(), obj)
        {
            UIWidget* child = dynamic_cast<UIWidget*>(obj);
            child->setTouchEnabled(false);
        }
    }

}

//碰撞条件不满足返回原来位置
void CocosGUIExamplesEquipScene::backOver(CCObject *pObject)
{
    UIWidget* widget = dynamic_cast<UIWidget*>(pObject);
    
    widget->removeFromParentAndCleanup(false);
    lastWidgetParent->addChild(widget);
    widget->setPosition(widgetLastNodeSpace);
    
    CCDictElement* element = NULL;
    
    // equip
    CCDictionary* equip_dic = NULL;
    switch (m_eEquipType)
    {
        case EQUIP_TYPE_CLOTHES:
            equip_dic = m_dicClothes;
            break;
            
        case EQUIP_TYPE_WEAPONS:
            equip_dic = m_dicWeapons;
            break;
            
        case EQUIP_TYPE_PETS:
            equip_dic = m_dicPets;
            break;
            
        default:
            break;
    }
    CCDICT_FOREACH(equip_dic, element)
    {
        UIWidget* widget = dynamic_cast<UIWidget*>(element->getObject());
        widget->setTouchEnabled(true);
    }
    
    // equip up layout
    Layout* equip_root = dynamic_cast<Layout*>(m_pUIlayer->getWidgetByTag(EQUIP_LAYOUT_TAG_ROOT));
    Layout* up_layout = dynamic_cast<Layout*>(equip_root->getChildByName("up_panel"));
    up_layout->setTouchEnabled(true);
    CCObject* obj = NULL;
    CCARRAY_FOREACH(up_layout->getChildren(), obj)
    {
        UIWidget* child = dynamic_cast<UIWidget*>(obj);
        child->setTouchEnabled(true);
    }
}

//退出
void CocosGUIExamplesEquipScene::menuCloseCallback(CCObject* pSender)
{
    CCDirector::sharedDirector()->end();
    
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    exit(0);
#endif
}

    注:大家最好看下cocos2d-x ,容器及常用API使用方法,如:CCDictionary、hitTest(碰撞检测)等。

    如上,只是实现背包的基本功能,还有好多东西,需要改进。比如,仓库不应该使用已设定好的格子,最好使用动态变化的格子,这方便以后的格子扩展。

    在此,望广大网友,多多指教~~~


示例资源及代码:  https://github.com/chukong/CocoStudioSamples 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热血枫叶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值