zoukankan      html  css  js  c++  java
  • cocos2d-x 判断点击命中坐标的几种方法

    转自:http://www.cnblogs.com/jiackyan/archive/2013/04/14/3019893.html

    //重载
    virtual bool ccTouchBegan(CCTouch *touch, CCEvent *pEvent);
    virtual void ccTouchMoved(CCTouch *touch, CCEvent *pEvent);
    virtual void ccTouchEnded(CCTouch *touch, CCEvent *pEvent);
    virtual void onEnter();
    virtual void onExit();
     
    //添加支持触摸事件
    void CTestLayer::onEnter()
    {
      CCLayer::onEnter();
      this->setTouchEnabled(true);
      CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, true);
    }
     
    void CTestLayer::onExit()
    {
      CCLayer::onExit();
      CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    //用自己的坐标系相对于原点进行判断
    bool checkTouchInSelf(CCTouch *touch);
    //用自己的坐标系相对于锚点进行判断
    bool checkTouchInSelf_AR(CCTouch *touch);
    //用父元素坐标系及自己在父坐标中的位置进行判断
    bool checkTouchInSelf_Parent(CCTouch *touch);
     
    //______________________________________________________________________________________________
    //用自己的坐标系相对于原点进行判断
    bool CTestLayer::checkTouchInSelf(CCTouch *touch)
    {
      //方案一
      //将点击点转换成自己坐标系中的坐标,相对于0,0点
      CCPoint pt = convertTouchToNodeSpace(touch);
      printf("pt.x=%.1f pt.y=%.1fn", pt.x, pt.y);
      int nw = getContentSize().width;
      int nh = getContentSize().height;
      CCRect rc(0, 0, nw, nh);
      if(rc.containsPoint(pt))
      {
        //获得点击的OpenGL的世界坐标值
        CCPoint touchPoint = touch->getLocation();
        printf("ccTouchBegan x=%.1f y=%.1fn", touchPoint.x, touchPoint.y);
        return true;
      }
      return false;
    }
    //______________________________________________________________________________________________
    //用自己的坐标系相对于锚点进行判断
    bool CTestLayer::checkTouchInSelf_AR(CCTouch *touch)
    {
      //方案二
      //将点击点转换成自己坐标系中的坐标,相对于锚点
      CCPoint ptAR = convertTouchToNodeSpaceAR(touch);
      printf("ptAR.x=%.1f ptAR.y=%.1fn", ptAR.x, ptAR.y);
      CCPoint pp = this->getAnchorPoint();
      int nw = getContentSize().width;
      int nh = getContentSize().height;
      int nx = -(nw * pp.x);
      int ny = -(nh * pp.y);
      CCRect rcar(nx, ny, nw, nh);
      if(rcar.containsPoint(ptAR))
      {
        //获得点击的OpenGL的世界坐标值
        CCPoint touchPoint = touch->getLocation();
        printf("ccTouchBegan x=%.1f y=%.1fn", touchPoint.x, touchPoint.y);
        return true;
      }
      return false;
    }
    //______________________________________________________________________________________________
    //用父元素坐标系及自己在父坐标中的位置进行判断
    bool CTestLayer::checkTouchInSelf_Parent(CCTouch *touch)
    {
      //方案三
      //获得点击的OpenGL的世界坐标值
      CCPoint touchPoint = touch->getLocation();
      //将点击的位置转换成父元素坐标系中的相对坐标
      CCPoint pt=getParent()->convertToNodeSpace(touchPoint);
      printf("pt.x=%.1f, pt.y=%.1fn", pt.x, pt.y);
      //得到自己在父元素坐标系中的位置范围
      CCRect rect=boundingBox();
      printf("rect.l=%.1f, rect.b=%.1f, rect.r=%.1f, rect.t=%.1fn",
      rect.getMinX(), rect.getMinY(), rect.getMaxX(), rect.getMaxY());    
      //判断是否点击落在自己的范围当中, 以上判断全是在父元素坐标系中进行计算
      if(rect.containsPoint(pt))
      {
        printf("ccTouchBegan x=%.1f y=%.1fn", touchPoint.x, touchPoint.y);
        return true;
      }
      return false;
    }
  • 相关阅读:
    第10组 Beta冲刺 (3/5)
    第10组 Beta冲刺 (2/5)
    第10组 Beta冲刺 (1/5)
    软工实践个人总结
    第03组 每周小结(3/3)
    第03组 每周小结(2/3)
    第03组 每周小结(1/3)
    第03组 Beta冲刺 总结
    第03组 Beta冲刺 (5/5)
    第03组 Beta冲刺 (4/5)
  • 原文地址:https://www.cnblogs.com/sevenyuan/p/3191736.html
Copyright © 2011-2022 走看看