• 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;
    }
  • 相关阅读:
    openssh升级
    Mysql基础学习_Windows版(一)
    centos7 取消Ctrl+Alt+Del重启功能
    linux shell数值比较和字符串比较
    linux 使用中括号进行条件判断
    VXLAN简介(摘抄)
    centos配置NTP服务器
    Centos配置网卡子接口
    组播___IGMP
    组播
  • 原文地址:https://www.cnblogs.com/jiackyan/p/3019893.html
Copyright © 2020-2023  润新知