智慧 + 毅力 = 无所不能

正确性、健壮性、可靠性、效率、易用性、可读性、可复用性、兼容性、可移植性...

导航

cocos2d-x 手势之简单实现

Posted on 2013-07-11 09:34  Bill Yuan  阅读(1889)  评论(0编辑  收藏  举报

转自:http://blog.sina.com.cn/s/blog_61ece099010187tl.html

  手势之前也发过一篇,但是我感觉那个还不够轻巧。 而且大多数游戏里面不会有那么复杂的手势,今天给大家分享下只有简单方向、圆形手势的代码。

   virtual void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent);
   virtual void ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent);
   virtual void ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent);

首先cocos2d中是通过以上三个方法判断玩家的触摸事件。 直接贴代码, 大家看后原理就知道了, 很简单。 就是通过水平、垂直的运动增量判断它的运行方向。

 

头文件

enum GDirection        //当前手势方向;
{
  kGDirectionUp = 0,
  kGDirectionDown,
  kGDirectionLeft,
  kGDirectionRight,
  kGDirectionNo
};

bool b_click;                   //判断当前是否是单击;
bool b_debug;                   //调试用;
bool b_circle;                  //其实这个圆形的判断不是很精确;
bool cache_directionshape[4];   //方向缓存,move中用它来判断是否是单向手势

GDirection gd_direction;        //手势方向;
CCPoint ccp_last,ccp_now;       //记录起始、当前坐标

处理cocos2d的触摸事件

void GeometricDirection::onStarted(CCSet *pTouches, CCEvent *pEvent)
{
  CCTouch *touch = (CCTouch *) pTouches->anyObject();
  ccp_last = touch->locationInView(touch->view());
  ccp_last = CCDirector::sharedDirector()->convertToGL(ccp_last);
 
  b_click = true;
  b_circle = false;
  gd_direction = kGDirectionNo;

  for (int i = 0 ; i < 4 ; i++)
  {
    cache_directionshape[i] = false;
  }
}
void GeometricDirection::onMoved(CCSet *pTouches, CCEvent *pEvent)
{
  b_click = false;
  CCTouch * touch = (CCTouch*)pTouches->anyObject();
  ccp_now = touch->locationInView(touch->view());
  ccp_now = CCDirector::sharedDirector()->convertToGL(ccp_now);
  float adsx = ccp_now.x - ccp_last.x;
  float adsy = ccp_now.y - ccp_last.y;

  if(abs(adsx) > abs(adsy))   //X方向增量大
  {
    if(adsx < 0)   //左移;
      cache_directionshape[0] = 1;
    else
      cache_directionshape[1] = 1;
  }
  else
  {
    if(adsy < 0)
      cache_directionshape[2] = 1;
    else
      cache_directionshape[3] = 1;
  }
  int x = 0;
  for (int i = 0 ; i< 4 ; i++)
  {
    if(cache_directionshape[i])
      x++;
  }
  if(x >= 2)
    b_circle = true;
}

void GeometricDirection::onEnded(CCSet *pTouches, CCEvent *pEvent)
{
  //圆形;
  if(b_circle || b_click) {
    return;
  }

  float adsx = ccp_now.x - ccp_last.x;
  float adsy = ccp_now.y - ccp_last.y;
  if(abs(adsx) > abs(adsy))   //X方向增量大
  {
    if(adsx < 0){
      gd_direction = kGDirectionLeft;
    }
    else{
      gd_direction = kGDirectionRight;
    }
  }
  else
  {
    if(adsy < 0){
      gd_direction = kGDirectionDown;
    }
    else{
      gd_direction = kGDirectionUp;
    }
  }

  //调试信息;
  //debug();
}