#include "TouchController.h" USING_NS_CC; bool TouchController::init(){ //super first if (!Node::init()){ return false; } //inicializamos el imput del usuario _tap = Point(-1,-1); //inicializamos el controlodor resetTouchController(); //Creamos un touchListener y le indicamos que debe hacer mediante los call back de cocos auto touchListener = EventListenerTouchOneByOne::create(); touchListener->onTouchBegan = std::bind(&TouchController::onTouchBegan, this, std::placeholders::_1, std::placeholders::_2); touchListener->onTouchMoved = CC_CALLBACK_2(TouchController::onTouchMoved, this); touchListener->onTouchEnded = CC_CALLBACK_2(TouchController::onTouchEnded, this); _eventDispatcher->addEventListenerWithSceneGraphPriority(touchListener, this); //mediante el schedule obtenemos el mismo efecto que llamando //al metodo update desde player. Aqui usaremos schedule solo para ver que //puede usarse en diversas situaciones, no solo en el GameLayer. this->schedule(schedule_selector(TouchController::update)); return true; } void TouchController::update(float dt){ resetTouchController(); if (_tap.x<0||_tap.y<0) return; Point tap = _tap; //donde esta posicionado el objeto al que se vincula el controlador //en este caso a la poicion del objeto player le restamos la mitad de su alto y la mitad de su ancho //para obtener la esquina inferior izquierda auto originX = getParent()->getPositionX() - getParent()->getBoundingBox().size.width*0.5; auto originY = getParent()->getPositionY() - getParent()->getBoundingBox().size.height*0.5; auto playerX = originX + getParent()->getBoundingBox().size.width; auto playerY = originY + getParent()->getBoundingBox().size.height; //en funcion de la posicion del player y de donde toque el usuario, //actualizamos hacia donde debe ir el sprite. if (tap.x > playerX && tap.y > playerY){ _controller.upRight = true; } else if (tap.x < originX && tap.y> playerY){ _controller.upLeft = true; } else if (tap.x > playerX && tap.y < originY){ _controller.downRight = true; } else if (tap.x < originX && tap.y < originY){ _controller.downLeft = true; } else if (tap.x < originX){ _controller.left = true; } else if (tap.x > playerX){ _controller.right = true; } else if (tap.y < originY){ _controller.down = true; } else if (tap.y > playerY){ _controller.up = true; } } void TouchController::resetTouchController(){ _controller.left = false; _controller.right = false; _controller.up = false; _controller.upLeft = false; _controller.upRight = false; _controller.down = false; _controller.downLeft = false; _controller.downRight = false; } bool TouchController::onTouchBegan(Touch *touch, Event *unused_event){ if (touch){ _tap = touch->getLocation(); } return true; } void TouchController::onTouchMoved(Touch *touch, Event *unused_event){ if (touch){ _tap = touch->getLocation(); } } void TouchController::onTouchEnded(Touch *touch, Event *unused_event){ if (touch){ _tap = Point(-1, -1); } }