• Cocos2dx中判断点击命中的几种方法


    /重载
    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;
    }
  • 相关阅读:
    ZOJ 3332 Strange Country II
    ZOJ 3331 Process the Tasks(双塔DP)
    ZOJ 3326 An Awful Problem(模拟)
    HDU 1796 How many integers can you find(容斥原理)
    HDU 4059 The Boss on Mars(容斥原理)
    HDU 4135 Co-prime(容斥原理)
    HDU 5677 ztr loves substring(回文串加多重背包)
    CodeForces 668B Little Artem and Dance
    CodeForces 667A Pouring Rain
    Java实现 LeetCode 764 最大加号标志(暴力递推)
  • 原文地址:https://www.cnblogs.com/jiackyan/p/3019893.html
Copyright © 2020-2023  润新知