Cocos2d-x3.1 多点触摸

#include "cocos2d.h"
#include "ui/CocosGUI.h"
USING_NS_CC;
using namespace ui;

class HelloWorld : public cocos2d::Layer
{
public:
    // there's no 'id' in cpp, so we recommend returning the class instance pointer
    static cocos2d::Scene* createScene();

    // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone
    virtual bool init();  

    void onTouchesBegan(const std::vector<Touch*>& touches,cocos2d::Event* event);
    void onTouchesMoved(const std::vector<Touch*>& touches,cocos2d::Event* event);
    void onTouchesEnded(const std::vector<Touch*>& touches,cocos2d::Event* event);
    void onTouchesCancel(const std::vector<Touch*>& touches,cocos2d::Event* event);
    // a selector callback
    void menuCloseCallback(cocos2d::Ref* pSender);

    // implement the "static create()" method manually
    CREATE_FUNC(HelloWorld);
};

#include "HelloWorldScene.h"
#include "ui/CocosGUI.h"
USING_NS_CC;
using namespace ui;
static const Color3B* s_TouchColors[EventTouch::MAX_TOUCHES] = {
    &Color3B::YELLOW,
    &Color3B::BLUE,
    &Color3B::GREEN,
    &Color3B::RED,
    &Color3B::MAGENTA
};

class TouchPoint : public Node
{
public:
    //默认构造函数
    TouchPoint()
    {
        setGLProgramState(GLProgramState::getOrCreateWithGLProgramName(GLProgram::SHADER_NAME_POSITION_TEXTURE_COLOR));
    }
    //draw函数
    virtual void draw(Renderer *renderer,const Mat4 & transform, bool transformUpdated)
    {
        //设置线条颜色
        DrawPrimitives::setDrawColor4B(_touchColor.r, _touchColor.g, _touchColor.b, 255);
        //设置线条宽度
        glLineWidth(10);
        //画X、Y方向两条直线
        DrawPrimitives::drawLine(Vec2(0,_touchPoint.y),Vec2(getContentSize().width,_touchPoint.y));
        DrawPrimitives::drawLine(Vec2(_touchPoint.x,0),Vec2(_touchPoint.x,getContentSize().height));
        //设置线条宽度
        glLineWidth(1);
        //设置点大小
        DrawPrimitives::setPointSize(30);
        //画点
        DrawPrimitives::drawPoint(_touchPoint);
    }
    //设置触摸点位置
    void setTouchPos(const Vec2& pt)
    {
        _touchPoint = pt;
    }
    //设置触摸点颜色
    void setTouchColor(Color3B color)
    {
        _touchColor = color;
    }
    //构造触摸点
    static TouchPoint* touchPointWithParent(Node* pParent)
    {
        auto pRet = new TouchPoint();
        pRet->setContentSize(pParent->getContentSize());
        pRet->setAnchorPoint(Vec2::ZERO);
        pRet->autorelease();
        return pRet;
    }

private:
    Vec2 _touchPoint;
    Color3B _touchColor;
};

Scene* HelloWorld::createScene()
{
    // 'scene' is an autorelease object
    auto scene = Scene::create();

    // 'layer' is an autorelease object
    auto layer = HelloWorld::create();

    // add layer as a child to scene
    scene->addChild(layer);

    // return the scene
    return scene;
}

// on "init" you need to initialize your instance
bool HelloWorld::init()
{
    //////////////////////////////
    // 1. super init first
    if ( !Layer::init() )
    {
        return false;
    }

    Size visibleSize = Director::getInstance()->getVisibleSize();
    Vec2 origin = Director::getInstance()->getVisibleOrigin();

    /////////////////////////////
    // 2. add a menu item with "X" image, which is clicked to quit the program
    //    you may modify it.

    // add a "close" icon to exit the progress. it's an autorelease object
    auto closeItem = MenuItemImage::create(
                                           "CloseNormal.png",
                                           "CloseSelected.png",
                                           CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));

	closeItem->setPosition(Vec2(origin.x + visibleSize.width - closeItem->getContentSize().width/2 ,
                                origin.y + closeItem->getContentSize().height/2));

    // create menu, it's an autorelease object
    auto menu = Menu::create(closeItem, NULL);
    menu->setPosition(Vec2::ZERO);
    this->addChild(menu, 1);

    //设置事件监听
    auto listener = EventListenerTouchAllAtOnce::create();
    listener->onTouchesBegan = CC_CALLBACK_2(HelloWorld::onTouchesBegan,this);
    listener->onTouchesMoved = CC_CALLBACK_2(HelloWorld::onTouchesMoved,this);
    listener->onTouchesEnded = CC_CALLBACK_2(HelloWorld::onTouchesEnded,this);
    //添加到事件分发器
    Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, this);

    //标签
    auto title = Label::createWithSystemFont("Please touch the screen", "", 24);
    title->setPosition(Vec2(200,200));
    addChild(title);
    return true;
}

static Map<int, TouchPoint*> s_map;

void HelloWorld::onTouchesBegan(const std::vector<Touch *> &touches, cocos2d::Event *event)
{
    for(auto &item : touches)
    {
        auto touch = item;
        auto touchPoint = TouchPoint::touchPointWithParent(this);//初始化触摸点
        auto location = touch->getLocation();

        touchPoint->setTouchPos(location);//设置触摸位置
        touchPoint->setTouchColor(*s_TouchColors[touch->getID()]);//设置颜色
        addChild(touchPoint);
        s_map.insert(touch->getID(), touchPoint);
    }
}

void HelloWorld::onTouchesMoved(const std::vector<Touch *> &touches, cocos2d::Event *event)
{
    for(auto &item : touches)
    {
        auto touch = item;
        auto pTP = s_map.at(touch->getID());
        auto location = touch->getLocation();
        pTP->setTouchPos(location);
    }
}

void HelloWorld::onTouchesEnded(const std::vector<Touch *> &touches, cocos2d::Event *event)
{
    for(auto &item : touches)
    {
        auto touch = item;
        auto pTP = s_map.at(touch->getID());
        removeChild(pTP,true);
        s_map.erase(touch->getID());
    }
}

void HelloWorld::onTouchesCancel(const std::vector<Touch *> &touches, cocos2d::Event *event)
{
    onTouchesEnded(touches, event);
}
void HelloWorld::menuCloseCallback(Ref* pSender)
{
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WP8) || (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)
	MessageBox("You pressed the close button. Windows Store Apps do not implement a close button.","Alert");
    return;
#endif

    Director::getInstance()->end();

#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    exit(0);
#endif
}
时间: 2024-10-26 03:32:19

Cocos2d-x3.1 多点触摸的相关文章

Cocos2d-x 多点触摸

多点触摸的实现步骤与单点触摸类似,setTouchEnabled(true)开启触摸功能,注冊触摸事件,重载多点触摸函数:ccTouchesBegan(開始).ccTouchesMoved(移动).ccTouchesEnded(结束).ccTouchesCancelled(系统中断取消触摸事件),每一个多点触摸函数都能够通过遍历整个CCSet来获得全部的触点. 程序代码: 头文件增加触摸重载函数: virtual void registerWithTouchDispatcher(void); v

Cocos2d-x 3.0中实现多点触摸

Cocos2d-x 3.0中实现多点触摸 尊重原创:http://cn.cocos2d-x.org/tutorial/show?id=2713 在上一篇<Cocos2d-x 3.0 中使用单点触摸>中介绍了在Cocos2d-x 3.0中实现单点触摸,但是有些游戏还会用到多点触摸,其中最典型的游戏是节奏大师,在节奏大师中会不断产生运动的音符,玩家需要不停地点击音符以获得高分,而且玩家可以多个手指头一起点,多个手指头一起点就是使用多点触摸实现的. 下面通过一个小的例子介绍如何在Cocos2d-x

5.触摸touch,单点触摸,多点触摸,触摸优先和触摸事件的吞噬

 1 触摸 Coco2dx默认仅仅有CCLayer及其派生类才有触摸的功能. 2 单点触摸 打开触摸开关和触摸方式 setTouchEnabled(true); setTouchMode(kCCTouchesOneByOne); Cocos2dx 对触摸分三布来处理.分是是点触.移动.离开. 或是中间被打断. 其功能皆有对应的virtual 函数进行override 的. virtual bool ccTouchBegan(CCTouch *pTouch,CCEvent *pEvent);

双击改变图片大小和多点触摸改变图片大小

系统的 UIScrollView 就有多点触摸改变图片的大小的功能,如果在向添加别的触摸事件,如这次讲到的双击图片大小就可以自定义一个 scrollView,当然,这个 scrollView 是继承自系统的 UIScrollView  的,这样,它仍然具有系统 scrollView 的特性,另外,可以添加自己想要的特性. 新的 scrollView 只需要添加一个方法,就可以实现双击图片变大的功能 #import "ZYScrollView.h" @implementation ZYS

Android中的多点触摸

代码下载地址 代码一:自定义支持多点触摸的TextView http://download.csdn.net/detail/zhiyuan0932/9513852 什么是多点触摸 允许计算机用户同时通过多个手指来控制图形界面的一种技术 多点触摸的应用场景 对图片.文字.网页进行放大或者缩小 多手指手势操作自定义控件和布局 触摸事件的重要方法 event.getActionMasked(): 获取事件类型 在只使用单手指操作的时候,这个方法我们一般使用的是event.getAction(),来获取

ios开发——实用技术篇Swift篇&amp;多点触摸与手势识别

多点触摸与手势识别 1 2 //点击事件 3 var atap = UITapGestureRecognizer(target: self, action: "tapDo:") 4 self.view.addGestureRecognizer(atap) 5 atap.numberOfTapsRequired = 1 //单击次数 6 atap.numberOfTouchesRequired = 1 //手指个数 7 8 //拖动事件 9 var aPan = UIPanGesture

Quick cocos2dx-Lua(V3.3R1)学习笔记(十三)-----继续触摸事件之多点触摸

在前面,我们提过了单点触摸,下面我们就试一下多点触摸的用法(我用的是cocos code ide进行手机调试,不会的,进入前一篇查看) function MainScene:ctor() local sprite = display.newSprite("close.png") --自己随便找个图片资源吧 sprite:align(display.CENTER, display.cx, display.cy) sprite:addTo(self) sprite:setTouchEnab

Android 中多点触摸协议

http://blog.csdn.net/zuosifengli/article/details/7398661 Android 中多点触摸协议: 参考: http://www.kernel.org/doc/Documentation/input/multi-touch-protocol.txt 1, 两种多点触摸协议: 1)A类: 处理无关联的接触: 用于直接发送原始数据: B类: 处理跟踪识别类的接触: 通过事件slot发送相关联的独立接触更新. 2,  触摸协议的使用: A类协议: A类协

多点触摸与单点触摸接口主要区别【转】

转自:http://blog.csdn.net/eleven_yy/article/details/7723079 上发单点触摸事件 input_report_key(input,ABS_MT_TRACKING_ID,0); input_report_key(input, BTN_TOUCH, 1); input_report_abs(input, ABS_MT_POSITION_X, ts->tc.x1); input_report_abs(input, ABS_MT_POSITION_Y,

Linux Android 多点触摸协议 原文出自【比特网】,转载请保留原文链接:http://soft.chinabyte.com/os/71/12306571.shtml

为了使用功能强大的多点触控设备.就须要一种方案去上报用户层所需的具体的手指触摸数据. 这个文档所描写叙述的多点触控协议能够让内核驱动程序向用户层上报随意多指的数据信息. 使用说明 单点触摸信息是以ABS承载并按一定顺序发送,如BTN_TOUCH.ABS_X.ABS_Y.SYNC.而多点触摸信息则是以ABS_MT承载并按一定顺序发送.如ABS_MT_POSITION_X.ABS_MT_POSITION_Y,然后通过调用input_mt_sync()产生一个 SYN_MT_REPORT event来