#ifndef __FIGTH_H__ #define __FIGTH_H__ #include "cocos-ext.h" #include "include/ILayer.h" #include "kernel/BaseDefine.h" USING_NS_CC; USING_NS_CC_EXT; class CFigthLayer : public CBaseLayer { private: enum E_FIGHT { FIGHT_NIL = 0, FIGHT_NORTH = 4, // 北 FIGHT_NORTHEAST = 5, // 东北 FIGHT_EAST = 6, // 东 FIGHT_EASTSOUTH = 7, // 东南 FIGHT_SOUTH = 8, // 南 FIGHT_WESTSOUTH = 1, // 西南 FIGHT_WEST = 2, // 西 FIGHT_WESTNORTH = 3, // 西北 FIGHT_ACTION = 101, // 标记动作 FIGHT_IMG_RUN = 102, FIGHT_RUNACTION = 103, }; public: virtual bool Create(); virtual void OnTick(){} virtual void onEnter(); virtual void onEnterTransitionDidFinish(); virtual void onExit(); virtual void registerWithTouchDispatcher(); virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent); virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent); private: void SetDir(float x, float y); void RunDirect(E_FIGHT eFight); void RunActionFight(int nImgStart, int nImgEnd); private: CCPoint m_tPosCurrent; // 用于存放怪物的当前位置 CCPoint m_tPosEnd; // 这两个用于判断 CCAnimate* m_pAction; // 跑的动作 E_FIGHT m_eFight; bool m_bRun; }; #endif // __FIGTH_H__
#include "FightLayer.h" #include <math.h> #include "kernel/GlobalMgr.h" #include "kernel/UIMgr.h" bool CFigthLayer::Create() { if (!CBaseLayer::Create()) return false; m_eFight = FIGHT_NIL; m_pAction = NULL; m_bRun = false; setTouchEnabled(true); } void CFigthLayer::onEnter() { CBaseLayer::onEnter(); } void CFigthLayer::onEnterTransitionDidFinish() { CBaseLayer::onExitTransitionDidStart(); std::string g_ImgPath(CGlobalMgr::GetInstance()->GetResourcesEx()); std::string strPath; strPath = g_ImgPath + "rpg000.jpg"; CCSprite* pImgBg = CCSprite::create(strPath.c_str()); CC_ERROR(pImgBg, "【CFigthLayer::onEnterTransitionDidFinish】pImgBg为空") pImgBg->setPosition(ccp(320, 480)); pImgBg->setAnchorPoint(ccp(0.5, 0.5)); this->addChild(pImgBg); strPath = g_ImgPath + "image8.png"; CCSprite* pImgRun = CCSprite::create(strPath.c_str()); CC_ERROR(pImgRun, "【CFigthLayer::onEnterTransitionDidFinish】pImgRun为空") pImgRun->setPosition(ccp(320, 480)); pImgRun->setAnchorPoint(ccp(0.5, 0.5)); pImgRun->setTag(FIGHT_IMG_RUN); this->addChild(pImgRun); m_tPosCurrent = pImgBg->getPosition(); } void CFigthLayer::onExit() { CBaseLayer::onExit(); } void CFigthLayer::registerWithTouchDispatcher() { CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, true); } bool CFigthLayer::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent) { return true; } void CFigthLayer::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent) { m_tPosEnd = pTouch->getLocation(); this->SetDir(m_tPosEnd.x, m_tPosEnd.y); } void CFigthLayer::SetDir(float x, float y) { CCPoint pos = m_tPosCurrent; if (pos.equals(ccp(x, y))) return; if (x > pos.x) { float t = (y - pos.y) / (x - pos.x); if (t > tan(- M_PI_4 / 2) && t <= tan(M_PI_4 / 2)) { m_eFight = (E_FIGHT)2; } else if (t > tan(M_PI_4 - M_PI_4 / 2) && t <= tan(M_PI_4 + M_PI_4 / 2)) { m_eFight = (E_FIGHT)3; } else if (t > tan(M_PI_4 + M_PI_4 / 2)) { m_eFight = (E_FIGHT)4; } else if (t > tan(- M_PI_4 - M_PI_4 / 2) && t <= tan(- M_PI_4 + M_PI_4 / 2)) { m_eFight = (E_FIGHT)1; } else if (t <= tan(- M_PI_4 - M_PI_4 / 2)) { m_eFight = (E_FIGHT)8; } } else if (x < pos.x) { float t = (y - pos.y) / (x - pos.x); if (t > tan(M_PI - M_PI_4 / 2) && t <= tan(M_PI + M_PI_4 / 2)) { m_eFight = (E_FIGHT)6; } else if (t > tan(M_PI - M_PI_4 - M_PI_4 / 2) && t <= tan(M_PI - M_PI_4 + M_PI_4 / 2)) { m_eFight = (E_FIGHT)5; } else if (t <= tan(M_PI - M_PI_4 - M_PI_4 / 2)) { m_eFight = (E_FIGHT)4; } else if (t > tan(M_PI + M_PI_4 - M_PI_4 / 2) && t <= tan(M_PI + M_PI_4 + M_PI_4 / 2)) { m_eFight = (E_FIGHT)7; } else if (t > tan(M_PI + M_PI_4 + M_PI_4 / 2)) { m_eFight = (E_FIGHT)8; } } this->RunDirect(m_eFight); } void CFigthLayer::RunDirect(E_FIGHT eFight) { switch (eFight) { case CFigthLayer::FIGHT_NORTH: { this->RunActionFight(25, 28); } break; case CFigthLayer::FIGHT_NORTHEAST: { this->RunActionFight(21, 24); } break; case CFigthLayer::FIGHT_EAST: { this->RunActionFight(16, 20); } break; case CFigthLayer::FIGHT_EASTSOUTH: { this->RunActionFight(12, 15); } break; case CFigthLayer::FIGHT_SOUTH: { this->RunActionFight(8, 11); } break; case CFigthLayer::FIGHT_WESTSOUTH: { this->RunActionFight(74, 77); } break; case CFigthLayer::FIGHT_WEST: { this->RunActionFight(12, 15); } break; case CFigthLayer::FIGHT_WESTNORTH: { this->RunActionFight(12, 15); } break; default: break; } } void CFigthLayer::RunActionFight(int nImgStart, int nImgEnd) { std::string g_ImgPath(CGlobalMgr::GetInstance()->GetResourcesEx()); std::string strPath; CCSprite* pImgRun = (CCSprite*)this->getChildByTag(FIGHT_IMG_RUN); CC_ERROR(pImgRun, "【CFigthLayer::RunActionFight】pImgRun为空") pImgRun->stopAllActions(); CCActionManager* pActionManager = CCDirector::sharedDirector()->getActionManager(); CC_ERROR(pActionManager, "【CFigthLayer::RunActionFight】pActionManager为空") if (m_bRun == true) { pActionManager->removeActionByTag(FIGHT_ACTION, m_pAction); } m_bRun = true; CCAnimation* pAnimation = CCAnimation::create(); CC_ERROR(pAnimation, "【CFigthLayer::RunActionFight】pAnimation为空") for( int i = nImgStart; i < nImgEnd + 1; i++) { CCString* pStrPath = CCString::createWithFormat("%simage%d.png", g_ImgPath.c_str(), i); CC_ERROR(pStrPath, "【CFigthLayer::RunActionFight】pStrPath为空") pAnimation->addSpriteFrameWithFileName(pStrPath->getCString()); } pAnimation->setDelayPerUnit(0.4f); pAnimation->setRestoreOriginalFrame(true); m_pAction = CCAnimate::create(pAnimation); m_pAction->setTag(FIGHT_ACTION); CC_ERROR(m_pAction, "【CFigthLayer::RunActionFight】m_pAction为空") pImgRun->runAction(CCRepeatForever::create(m_pAction)); }