#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);
	}
}