nmhkyiuj的专栏

转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。 资源为网上寻找的,仅研究学习用,若是侵犯版权请通知本人整改。

上一篇:Cocos3.4 横版游戏制作-《KillBear》-加入Hero 在这一篇中, 上半部分我们将在控制层OperateLayer中加入一个摇杆,并通过摇杆控制Hero 下半部分我们控制Hero防止其跑出地图和跑上墙

开发环境代码构建A管理Operate

我们先做一个Joystick

摇杆Joystick.hclass Joystick : public Sprite{public:Joystick();~Joystick();virtual bool init();::vector<cocos2d::Touch*>& touches, cocos2d::Event *unused_event);::vector<cocos2d::Touch*>& touches, cocos2d::Event *unused_event);::vector<cocos2d::Touch*>& touches, cocos2d::Event *unused_event);void setJoystick(Vec2 point);CREATE_FUNC(Joystick);private:void showJoystick();void hideJoystick();void updateJoystick(Touch* touch);int m_pJoystickr;int m_pJoystickR;Sprite *m_pJoystick;Sprite *m_pJoystickBg;Vec2 start;};.cppbool Joystick::init(){bool ret = false;do {CC_BREAK_IF( !Sprite::init() );m_pJoystickBg = Sprite::create(“JoystickBg.png”);//背景m_pJoystick = Sprite::create(“Joystick.png”);//摇杆this->addChild(m_pJoystickBg, 0);this->addChild(m_pJoystick, 1);this->hideJoystick();//this->showJoystick();m_pJoystickR= m_pJoystickBg->getContentSize().width/2;m_pJoystickr= m_pJoystick->getContentSize().width/2;//新的API注册这么写auto listener = EventListenerTouchAllAtOnce::create();listener->onTouchesBegan = CC_CALLBACK_2(Joystick::onTouchesBegan, this);listener->onTouchesMoved = CC_CALLBACK_2(Joystick::onTouchesMoved, this);listener->onTouchesEnded = CC_CALLBACK_2(Joystick::onTouchesEnded, this);_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);ret = true;} while(0);return ret;}void Joystick::showJoystick(){//显示摇杆m_pJoystick->setVisible(true);m_pJoystickBg->setVisible(true);}void Joystick::hideJoystick(){//隐藏摇杆//m_pJoystick->setPosition(m_pJoystickBg->getPosition());m_pJoystick->setVisible(false);//m_pJoystickBg->setVisible(false);m_pJoystickBg->setVisible(true);}void Joystick::onTouchesBegan(const vector<Touch*>& touches, Event *unused_event){//按下事件处理std::vector<Touch*>::const_iterator touchIter = touches.begin();Touch* touch = (Touch*)(*touchIter);if(m_pJoystick->getBoundingBox().containsPoint(touch->getLocation())){this->showJoystick();updateJoystick(touch);CCLOG(“***************”);CCLOG(“update touch:%f %f”,touch->getLocation().x,touch->getLocation().y);return;}}void Joystick::onTouchesMoved(const vector<Touch*>& touches, Event *unused_event){//移动时处理std::vector<Touch*>::const_iterator touchIter = touches.begin();Touch* touch = (Touch*)(*touchIter);if(m_pJoystick->isVisible()){updateJoystick(touch);return;}}void Joystick::onTouchesEnded(const vector<Touch*>& touches, Event *unused_event){->hideJoystick();}void Joystick::setJoystick(Vec2 point){//将这个摇杆的放在某个坐标上start =point;m_pJoystickBg->setPosition(start);m_pJoystick->setPosition(m_pJoystickBg->getPosition());}void Joystick::updateJoystick(Touch* touch){//更新摇杆状态//我用向量来判断Vec2 hit = touch->getLocation();float distance = start.getDistance(hit);Vec2 direction = (hit – start).getNormalized();//为了防止摇杆移出摇杆背景if(distance < m_pJoystickr/2){m_pJoystick->setPosition(start + (direction * distance));}else if(distance >m_pJoystickr) {m_pJoystick->setPosition(start + (direction * m_pJoystickr));}else {m_pJoystick->setPosition(start + (direction * m_pJoystickr/2));}//global->hero->onMove(direction,distance);}

这个JoyStick的写法我用了向量,不用笛卡尔坐标(xOy),我认为这样写更好理解它. 而且这个摇杆分为2段,

使用双手头脑与心灵的是艺术家,只有合作双手

nmhkyiuj的专栏

相关文章:

你感兴趣的文章:

标签云: