背包基本功能:
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