您的位置:首页 > 其它

根据点中坐标,调整怪物动作方向

2014-01-24 19:28 141 查看
#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));
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: