Hi,推荐文件给你 "捕鱼达人练习例子(6).zip" http://vdisk.weibo.com/s/J1XLb
CannonLayer.h
#include "cocos2d.h" #include "Weapon.h" USING_NS_CC; class CannonLayer:public CCLayer { public: CREATE_FUNC(CannonLayer); bool init(); //声明炮塔的整合类 CC_SYNTHESIZE_READONLY(Weapon*, _weapon, Weapon); //转换炮塔类型的方法 void switchCannon(CCMenuItemSprite* sender); //声明2个调整炮塔等级的按钮 CCMenuItemSprite* _subItem; CCMenuItemSprite* _addItem; };
#include "CannonLayer.h" #include "StaticData.h" USING_NS_CC; bool CannonLayer::init() { bool pRet = false; do { CC_BREAK_IF(!CCLayer::init()); CCSize winSize = CCDirector::sharedDirector()->getWinSize(); _weapon = Weapon::create(); _weapon->setPosition(winSize.width * 0.5 , _weapon->getCannon()->getCurCannonSprite()->getContentSize().height * 0.26); this->addChild(_weapon); //设置2个按钮一个是“+” 另一个是“-” _subItem = CCMenuItemSprite::create(CCSprite::createWithSpriteFrameName(STATIC_DATA_STRING("button_sub")), CCSprite::createWithSpriteFrameName(STATIC_DATA_STRING("button_sub")), this, menu_selector(CannonLayer::switchCannon)); _addItem = CCMenuItemSprite::create(CCSprite::createWithSpriteFrameName(STATIC_DATA_STRING("button_add")), CCSprite::createWithSpriteFrameName(STATIC_DATA_STRING("button_add")), this, menu_selector(CannonLayer::switchCannon)); CCMenu* menu = CCMenu::create(_subItem,_addItem,NULL); //添加两个按钮设置他们之间的间隔是多少,从_weapon对象中先找到炮塔对象(getCannon)再找到对应的精灵getCurCannonSprite(),再找到精灵的宽。 menu->alignItemsHorizontallyWithPadding(_weapon->getCannon()->getCurCannonSprite()->getContentSize().width + 10); menu->setPosition(ccp(winSize.width * 0.5, _subItem->getContentSize().height * 0.5)); this->addChild(menu); pRet = true; } while (0); return pRet; } void CannonLayer::switchCannon(cocos2d::CCMenuItemSprite *sender) { CannonType type = _weapon->getCannon()->getType(); if (sender == _addItem) { type++; } else if (sender == _subItem) { type--; } _weapon->getCannon()->setType(type); }
我们还要对GameScene类做如下修改
GameScene.h
#include "BackgroundLayer.h"
#include "FishLayer.h"
#include "CannonLayer.h"
USING_NS_CC;
class GameScene:publicCCScene
{
public:
//CREATE_FUNC这个宏定义能够调用create()方法和init()方法,就是初始化的意思
CREATE_FUNC(GameScene);
//初始化时在这个方法中赋值
bool init();
//本类的析构方法
~GameScene();
//载入资源的方法
void preloadResources();
CC_SYNTHESIZE_RETAIN(BackgroundLayer*, _backgroundLayer, BackgroundLayer);
//声明鱼层类的对象
CC_SYNTHESIZE_RETAIN(FishLayer*, _fishLayer, FishLayer);
//声明炮塔层的对象
CC_SYNTHESIZE_RETAIN(CannonLayer*, _cannonLayer, CannonLayer);
};
bool GameScene::init()
{
bool pRet = false;
do {
//调用父类的初始化方法,CC_BREAK_IF就是一个容错保护的方法
CC_BREAK_IF(!CCScene::init());
//调用预加载资源的方法
this->preloadResources();
//初始化背景层
_backgroundLayer =BackgroundLayer::create();
//将层添加到场景中
this->addChild(_backgroundLayer);
//初始化鱼的层
_fishLayer = FishLayer::create();
//将鱼的层添加到场景中
this->addChild(_fishLayer);
//创建炮塔层之后将其添加到场景中
_cannonLayer =CannonLayer::create();
this->addChild(_cannonLayer);
pRet = true;
} while (0);
return pRet;
}