Cocos2d-x3.1 multi-point touch
#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
& touches,cocos2d::Event* event); void onTouchesMoved(const std::vector
& touches,cocos2d::Event* event); void onTouchesEnded(const std::vector
& touches,cocos2d::Event* event); void onTouchesCancel(const std::vector
& 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: // default constructor TouchPoint () {setGLProgramState (GLProgramState: getOrCreateWithGLProgramName (GLProgram :: SHADER_NAME_POSITION_TEXTURE_CO LOR);} // draw function virtual void draw (Renderer * renderer, const Mat4 & transform, bool transformUpdated) {// set the line color DrawPrimitives: setDrawColor4B (_ touchColor. r, _ touchColor. g, _ touchColor. b, 255); // set the line width glLineWidth (10); // draw the DrawPrimitives: drawLine (Vec2 (0, _ touchPoint. y), Vec2 (getContentSize (). width, _ touchPoint. y); DrawPrimitives: drawLine (Vec2 (_ touchPoint. x, 0), Vec2 (_ touchPoint. x, getConte NtSize (). height); // set the line width glLineWidth (1); // set the vertex size DrawPrimitives: setPointSize (30); // draw vertex DrawPrimitives: drawPoint (_ touchPoint );} // set the touch point position void setTouchPos (const Vec2 & pt) {_ touchPoint = pt;} // set the touch point color void setTouchColor (Color3B color) {_ touchColor = color ;} // construct the touch point static TouchPoint * touchPointWithParent (Node * pParent) {auto pRet = new TouchPoint (); pRet-> setContentSize (pParent-> getConte NtSize (); 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 (); // 'player' is an autorelease object auto layer = HelloWorld: create (); // add layer as a child to scene-> addChild (layer ); // return the scene return scene;} // on "I Nit "you need to initialize your instancebool 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 autoreltailobject 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); // set event listening 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 ); // Add to event distributor ctor: getInstance ()-> getEventDispatcher ()-> addEventListenerWithSceneGraphPriority (listener, this); // tag auto title = Label :: createWithSystemFont ("Please touch the screen", "", 24); title-> setPosition (Vec2 (200,200); addChild (title); return true;} static Map
S_map; void HelloWorld: onTouchesBegan (const std: vector
& Touches, cocos2d: Event * event) {for (auto & item: touches) {auto touch = item; auto touchPoint = TouchPoint: touchPointWithParent (this ); // initialize the touch point auto location = touch-> getLocation (); touchPoint-> setTouchPos (location ); // set the touch position touchPoint-> setTouchColor (* s_TouchColors [touch-> getID ()]); // set the color addChild (touchPoint); s_map.insert (touch-> getID (), touchPoint) ;}} void HelloWorld: onTouchesMoved (const std: vector
& 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
& 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
& 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}