#include "HelloWorldScene.h"
using namespace cocos2d;
HelloWorld::HelloWorld()
{
}
//析构函数,用于释放new出来的CCAnimation*数组
HelloWorld::~HelloWorld(void)
{
for (int i = 0; i < 4; i++)
{
//释放数组中元素
CC_SAFE_RELEASE(walkAnimation[i]);
}
//释放数组本身
CC_SAFE_DELETE_ARRAY(walkAnimation);
}
CCScene* HelloWorld::scene()
{
CCScene * scene = NULL;
do
{
// 'scene' is an autorelease object
scene = CCScene::create();
CC_BREAK_IF(! scene);
// 'layer' is an autorelease object
HelloWorld *layer = HelloWorld::create();
CC_BREAK_IF(! layer);
// add layer as a child to scene
scene->addChild(layer);
} while (0);
// return the scene
return scene;
}
// on "init" you need to initialize your instance
bool HelloWorld::init()
{
bool bRet = false;
do
{
CC_BREAK_IF(! CCLayer::init());
CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
"CloseNormal.png",
"CloseSelected.png",
this,
menu_selector(HelloWorld::menuCloseCallback));
CC_BREAK_IF(! pCloseItem);
CCMenuItemImage *pDownItem = CCMenuItemImage::create(
"3a.png",
"3b.png",
this,
menu_selector(HelloWorld::menuCallDownBackMove));
CC_BREAK_IF(! pCloseItem);
CCMenuItemImage *pLeftItem = CCMenuItemImage::create(
"4a.png",
"4b.png",
this,
menu_selector(HelloWorld::menuCallLeftBackMove));
CC_BREAK_IF(! pCloseItem);
CCMenuItemImage *pRightItem = CCMenuItemImage::create(
"2a.png",
"2b.png",
this,
menu_selector(HelloWorld::menuCallRightBackMove));
CC_BREAK_IF(! pCloseItem);
CCMenuItemImage *pUpItem = CCMenuItemImage::create(
"1a.png",
"1b.png",
this,
menu_selector(HelloWorld::menuCallUpBackMove));
CC_BREAK_IF(! pCloseItem);
// Place the menu item bottom-right conner.
pCloseItem->setPosition(ccp(CCDirector::sharedDirector()->getWinSize().width - 20, 20));
pDownItem->setPosition(ccp(600, 300));
pLeftItem->setPosition(ccp(540, 360));
pRightItem->setPosition(ccp(660, 360));
pUpItem->setPosition(ccp(600, 420));
// Create a menu with the "close" menu item, it's an auto release object.
CCMenu* pMenu = CCMenu::create(pCloseItem,pDownItem,pLeftItem,pRightItem,pUpItem, NULL);
pMenu->setPosition(CCPointZero);
CC_BREAK_IF(! pMenu);
// Add the menu to HelloWorld layer as a child layer.
this->addChild(pMenu, 1);
map=CCTMXTiledMap::create("0.tmx");
addChild(map);
walkAnimation =new CCAnimation*[4];
walkAnimation[kLeft] = this->createAnimationByDirection(kLeft);
walkAnimation[kRight] = this->createAnimationByDirection(kRight);
walkAnimation[kUp] = this->createAnimationByDirection(kUp);
walkAnimation[kDown] = this->createAnimationByDirection(kDown);
heroSprite = CCSprite::createWithSpriteFrame((CCSpriteFrame*)animFrames->objectAtIndex(0));
heroSprite->setPosition(ccp(48,48));
addChild(heroSprite);
isHeroWalking=false;
bRet = true;
} while (0);
return bRet;
}
void HelloWorld::menuCloseCallback(CCObject* pSender)
{
// "close" menu item clicked
CCDirector::sharedDirector()->end();
}
CCAnimation* HelloWorld::createAnimationByDirection(HeroDirection direction)
{
//将图片生成纹理,保存到全局的纹理缓冲区
CCTexture2D *heroTexture=CCTextureCache::sharedTextureCache()->addImage("hero.png");
//第二个参数表示显示区域的x, y, width, height
CCSpriteFrame* frame0=CCSpriteFrame::createWithTexture(heroTexture,CCRectMake(32*0,32*direction,32,32));
CCSpriteFrame* frame1=CCSpriteFrame::createWithTexture(heroTexture,CCRectMake(32*1,32*direction,32,32));
CCSpriteFrame* frame2=CCSpriteFrame::createWithTexture(heroTexture,CCRectMake(32*2,32*direction,32,32));
CCSpriteFrame* frame3=CCSpriteFrame::createWithTexture(heroTexture,CCRectMake(32*3,32*direction,32,32));
//在2.0版本以后,CCMutableArray取消了
animFrames=CCArray::createWithCapacity(4);
//将创建的四个纹理保存到数组中
animFrames->addObject(frame0);
animFrames->addObject(frame1);
animFrames->addObject(frame2);
animFrames->addObject(frame3);
//创建一个动画,0.2f表示间隔时间
animation = CCAnimation::createWithSpriteFrames(animFrames, 0.2f);
animation->retain();
return animation;
}
void HelloWorld::menuCallDownBackMove(CCObject* pSender)
{
if(isHeroWalking==true)
return ;
else
{
targetDirection = kDown;
CCPoint moveByPosition;
switch(targetDirection)
{
case kDown:
moveByPosition=ccp(0,-32);
break;
case kLeft:
moveByPosition=ccp(-32,0);
break;
case kRight:
moveByPosition=ccp(32,0);
break;
case kUp:
moveByPosition=ccp(0,32);
break;
}
CCAction *action = CCSequence::create(
CCSpawn::create(
CCAnimate::create(walkAnimation[targetDirection]),
CCMoveBy::create(0.28f,moveByPosition),
NULL),
//把方向信息传递给onWalkDone方法
CCCallFuncND::create(this, callfuncND_selector(HelloWorld::onWalkDone), (void*)targetDirection),
NULL);
//主角执行动作
heroSprite->runAction(action);
isHeroWalking=true;
}
}
void HelloWorld::menuCallLeftBackMove(CCObject* pSender)
{
if(isHeroWalking==true)
return ;
else
{
targetDirection = kLeft;
CCPoint moveByPosition;
switch(targetDirection)
{
case kDown:
moveByPosition=ccp(0,-32);
break;
case kLeft:
moveByPosition=ccp(-32,0);
break;
case kRight:
moveByPosition=ccp(32,0);
break;
case kUp:
moveByPosition=ccp(0,32);
break;
}
CCAction *action = CCSequence::create(
CCSpawn::create(
CCAnimate::create(walkAnimation[targetDirection]),
CCMoveBy::create(0.28f,moveByPosition),
NULL),
//把方向信息传递给onWalkDone方法
CCCallFuncND::create(this, callfuncND_selector(HelloWorld::onWalkDone), (void*)targetDirection),
NULL);
//主角执行动作
heroSprite->runAction(action);
isHeroWalking=true;
}
}
void HelloWorld::menuCallRightBackMove(CCObject* pSender)
{
if(isHeroWalking==true)
return ;
else
{
targetDirection = kRight;
CCPoint moveByPosition;
switch(targetDirection)
{
case kDown:
moveByPosition=ccp(0,-32);
break;
case kLeft:
moveByPosition=ccp(-32,0);
break;
case kRight:
moveByPosition=ccp(32,0);
break;
case kUp:
moveByPosition=ccp(0,32);
break;
}
CCAction *action = CCSequence::create(
CCSpawn::create(
CCAnimate::create(walkAnimation[targetDirection]),
CCMoveBy::create(0.28f,moveByPosition),
NULL),
//把方向信息传递给onWalkDone方法
CCCallFuncND::create(this, callfuncND_selector(HelloWorld::onWalkDone), (void*)targetDirection),
NULL);
//主角执行动作
heroSprite->runAction(action);
isHeroWalking=true;
}
}
void HelloWorld::menuCallUpBackMove(CCObject* pSender)
{
if(isHeroWalking==true)
return ;
else
{
targetDirection = kUp;
CCPoint moveByPosition;
switch(targetDirection)
{
case kDown:
moveByPosition=ccp(0,-32);
break;
case kLeft:
moveByPosition=ccp(-32,0);
break;
case kRight:
moveByPosition=ccp(32,0);
break;
case kUp:
moveByPosition=ccp(0,32);
break;
}
CCAction *action = CCSequence::create(
CCSpawn::create(
CCAnimate::create(walkAnimation[targetDirection]),
CCMoveBy::create(0.28f,moveByPosition),
NULL),
//把方向信息传递给onWalkDone方法
CCCallFuncND::create(this, callfuncND_selector(HelloWorld::onWalkDone), (void*)targetDirection),
NULL);
//主角执行动作
heroSprite->runAction(action);
isHeroWalking=true;
}
}
void