[cocos2dx筆記002] 坦克動畫
第一:沒有美術,只好自己用PS。先用PS在原來的4個方向上,做一個履帶差異的4方向坦克。
第二:用SpritePacker打包成tankbase.plist。然后用CCSpriteFrameCache加載到內存中。
CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("basetank.plist");
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>frames</key>
<dict>
<key>basetank_down.png</key>
<dict>
<key>frame</key>
<string>{{0,0},{32,32}}</string>
<key>offset</key>
<string>{0,0}</string>
<key>rotated</key>
<false/>
<key>sourceColorRect</key>
<string>{{0,0},{32,32}}</string>
<key>sourceSize</key>
<string>{32,32}</string>
</dict>
<key>basetank_down_a.png</key>
<dict>
<key>frame</key>
<string>{{0,132},{32,32}}</string>
<key>offset</key>
<string>{0,0}</string>
<key>rotated</key>
<false/>
<key>sourceColorRect</key>
<string>{{0,0},{32,32}}</string>
<key>sourceSize</key>
<string>{32,32}</string>
</dict>
<key>basetank_left.png</key>
<dict>
<key>frame</key>
<string>{{0,33},{32,32}}</string>
<key>offset</key>
<string>{0,0}</string>
<key>rotated</key>
<false/>
<key>sourceColorRect</key>
<string>{{0,0},{32,32}}</string>
<key>sourceSize</key>
<string>{32,32}</string>
</dict>
<key>basetank_left_a.png</key>
<dict>
<key>frame</key>
<string>{{0,165},{32,32}}</string>
<key>offset</key>
<string>{0,0}</string>
<key>rotated</key>
<false/>
<key>sourceColorRect</key>
<string>{{0,0},{32,32}}</string>
<key>sourceSize</key>
<string>{32,32}</string>
</dict>
<key>basetank_right.png</key>
<dict>
<key>frame</key>
<string>{{0,66},{32,32}}</string>
<key>offset</key>
<string>{0,0}</string>
<key>rotated</key>
<false/>
<key>sourceColorRect</key>
<string>{{0,0},{32,32}}</string>
<key>sourceSize</key>
<string>{32,32}</string>
</dict>
<key>basetank_right_a.png</key>
<dict>
<key>frame</key>
<string>{{0,198},{32,32}}</string>
<key>offset</key>
<string>{0,0}</string>
<key>rotated</key>
<false/>
<key>sourceColorRect</key>
<string>{{0,0},{32,32}}</string>
<key>sourceSize</key>
<string>{32,32}</string>
</dict>
<key>basetank_up.png</key>
<dict>
<key>frame</key>
<string>{{0,99},{32,32}}</string>
<key>offset</key>
<string>{0,0}</string>
<key>rotated</key>
<false/>
<key>sourceColorRect</key>
<string>{{0,0},{32,32}}</string>
<key>sourceSize</key>
<string>{32,32}</string>
</dict>
<key>basetank_up_a.png</key>
<dict>
<key>frame</key>
<string>{{0,231},{32,32}}</string>
<key>offset</key>
<string>{0,0}</string>
<key>rotated</key>
<false/>
<key>sourceColorRect</key>
<string>{{0,0},{32,32}}</string>
<key>sourceSize</key>
<string>{32,32}</string>
</dict>
</dict>
<key>metadata</key>
<dict>
<key>format</key>
<integer>2</integer>
<key>realTextureFileName</key>
<string>basetank.png</string>
<key>size</key>
<string>{32,512}</string>
<key>smartupdate</key>
<string>{None}</string>
<key>textureFileName</key>
<string>basetank.png</string>
</dict>
</dict>
</plist>
第三:封裝一個動畫的函數
/********************************************************************************
Title: 生成指定方向的坦克動畫Action
FullName: zdh::XGameGlobal::createBasetankAni
Access: public
@param [in] param_Direction 方向,參見EnumDirection,如果是無效方向,視為ED_UP
@return CCRepeatForever * 返回坦克動畫的Action對象
@author zdhsoft
@date 2014/03/24
@file xgameglobal.h
********************************************************************************/
CCRepeatForever * createBasetankAni(int param_Direction) const
{
//創建幀資源的數組
CCArray* st_frame_list = new CCArray(2);
CCSpriteFrame * pF1 = CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(getDirectionResName(param_Direction, 0));
CCSpriteFrame * pF2 = CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(getDirectionResName(param_Direction, 1));
st_frame_list->addObject(pF1);
st_frame_list->addObject(pF2);
//創建動畫對象 第二個參數是每幀間隔時間 這里是0.1秒
CCAnimation * pAni = CCAnimation::createWithSpriteFrames(st_frame_list, 0.1f);
//創建動畫Action
CCAnimate * pAniAction = CCAnimate::create(pAni);
//創建重復Action
CCRepeatForever *pAction = CCRepeatForever::create(pAniAction);
st_frame_list->release();
return pAction;
}
第四:在玩家對象設置方向和對象初始化的時候,設置動畫
初始化:
CCSprite * p1Pic = CCSprite::createWithSpriteFrameName(GAME_GLOBAL->getDirectionResName(ED_UP));
p1Pic->setPosition(GetPosition(pPlayerLayer, "Player1"));
p1Pic->setAnchorPoint(ccp(0, 0));
this->addChild(p1Pic);
p1Pic->runAction(GAME_GLOBAL->createBasetankAni(ED_UP));
m_Player1.setDraw(p1Pic);
設置方向:
/********************************************************************************
Title: 設置坦克的方向
FullName: zdh::XPlayer::setDirection
Access: public
@param [in] paramDirection 如果是無效的方向,會視為ED_UP
@return bool
- true 設置成功
- false 設置失敗
@author zdhsoft
@date 2014/03/24
@file xplayer.h
********************************************************************************/
bool setDirection(const int paramDirection)
{
if (paramDirection >= ED_UP &¶mDirection <= ED_RIGHT) //如果是無效方向,則設置不成功
{
if (paramDirection != m_Direction)
{
if (m_Draw != nullptr)
{
m_Draw->stopAllActions();
m_Draw->setDisplayFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(GAME_GLOBAL->getDirectionResName(paramDirection)));
m_Draw->runAction(GAME_GLOBAL->createBasetankAni(paramDirection));
}
m_Direction = paramDirection; //變更方向
return true;
}
}
return false;
}
這樣就OK了!