示例#1
0
void RCDPad::processTouch(cocos2d::CCPoint point)
{
	CCSpriteFrameCache *cache = CCSpriteFrameCache::sharedSpriteFrameCache();
	setColor(ccc3(255,200,200));
	m_pressed = true;
	CCPoint center = ccp( rect().origin.x+rect().size.width/2, rect().origin.y+rect().size.height/2 );
	if(distanceBetweenPoints(point, center) < rect().size.width/10){
        setDisplayFrame(cache->spriteFrameByName("d_pad_normal.png"));
		setRotation(0);
		m_pressedVector = ccp(0,0);
		m_direction = kDPadNoDirection;
		return;
	}
	float radians = vectorToRadians( ccp(point.x-center.x, point.y-center.y) );
	float degrees = radiansToDegrees(radians) + 90;
    float sin45 = 0.7071067812f;
	if(degrees >= 337.5 || degrees < 22.5){
		setDisplayFrame(cache->spriteFrameByName("d_pad_horizontal.png"));
		setRotation(180);
        m_pressedVector = ccp(-1,0);
        m_direction = kDPadLeft;
	}else if(degrees >= 22.5 && degrees < 67.5){
		setDisplayFrame(cache->spriteFrameByName("d_pad_diagonal.png"));
		setRotation(-90);
        m_pressedVector = ccp(-sin45,sin45);
        m_direction = kDPadUpLeft;
	}else if(degrees >= 67.5 && degrees < 112.5){
		setDisplayFrame(cache->spriteFrameByName("d_pad_horizontal.png"));
		setRotation(-90);
        m_pressedVector = ccp(0,1);
        m_direction = kDPadUp;
	}else if(degrees >= 112.5 && degrees < 157.5){
		setDisplayFrame(cache->spriteFrameByName("d_pad_diagonal.png"));
		setRotation(0);
        m_pressedVector = ccp(sin45,sin45);
        m_direction = kkDPadUpRight;
	}else if(degrees >= 157.5 && degrees < 202.5){
		setDisplayFrame(cache->spriteFrameByName("d_pad_horizontal.png"));
		setRotation(0);
        m_pressedVector = ccp(1,0);
        m_direction = kkDPadRight;
	}else if(degrees >= 202.5 && degrees < 247.5){
		setDisplayFrame(cache->spriteFrameByName("d_pad_diagonal.png"));
		setRotation(90);
        m_pressedVector = ccp(sin45,-sin45);
        m_direction = kDPadDownRight;
	}else if(degrees >= 247.5 && degrees < 292.5){
		setDisplayFrame(cache->spriteFrameByName("d_pad_horizontal.png"));
		setRotation(90);
        m_pressedVector = ccp(0,-1);
        m_direction = kDPadDown;
	}else{
		setDisplayFrame(cache->spriteFrameByName("d_pad_diagonal.png"));
		setRotation(180);
        m_pressedVector = ccp(-sin45,-sin45);
        m_direction = kDPadDownLeft;
	}

}
CCPoint AnalogStick::getPressedVector ( KDvoid )
{
	KDfloat		fMagnitude = kdSqrtf ( kdPowf ( m_tPressedVector.x, 2 ) + kdPowf ( m_tPressedVector.y, 2 ) );
	fMagnitude += 0.25f;
	
	CCPoint		tPressedVector = ccp ( m_tPressedVector.x * 1.25f, m_tPressedVector.y * 1.25f );
	
	// 25% end deadzone to make it easier to hold highest magnitude
	if ( fMagnitude > 1 )
	{
		KDfloat		fRadians = vectorToRadians ( m_tPressedVector );
		tPressedVector = radiansToVector ( fRadians + KD_PI_F / 2 );
	}
	
	return tPressedVector;
}
KDvoid AnalogStick::resetDirection ( KDvoid )
{
	if ( m_tPressedVector.x == 0 && m_tPressedVector.y == 0 )
	{
		m_nDirection = AS_NO_DIRECTION;
		return;
	}

	KDfloat		fRadians = vectorToRadians ( m_tPressedVector );
	KDfloat		fDegrees = radiansToDegrees ( fRadians ) + 90;
	
	if ( fDegrees >= 337.5f || fDegrees < 22.5f )
	{
		m_nDirection = AS_LEFT;
	}
	else if ( fDegrees >= 22.5f && fDegrees < 67.5f )
	{
		m_nDirection = AS_UP_LEFT;
	}
	else if ( fDegrees >= 67.5f && fDegrees < 112.5f )
	{
		m_nDirection = AS_UP;
	}
	else if ( fDegrees >= 112.5f && fDegrees < 157.5f )
	{
		m_nDirection = AS_UP_RIGHT;
	}
	else if ( fDegrees >= 157.5f && fDegrees < 202.5f )
	{
		m_nDirection = AS_RIGHT;
	}
	else if ( fDegrees >= 202.5f && fDegrees < 247.5f )
	{
		m_nDirection = AS_DOWN_RIGHT;
	}
	else if ( fDegrees >= 247.5f && fDegrees < 292.5f )
	{
		m_nDirection = AS_DOWN;
	}
	else
	{
		m_nDirection = AS_DOWN_LEFT;
	}
}
KDvoid AnalogStick::repositionBarWithPoint ( const CCPoint& tPoint )
{
	const CCSize	tSize = this->getContentSize ( );

	// Rotation	
	KDfloat		fRadians = vectorToRadians ( m_tPressedVector );
	KDfloat		fDegrees = radiansToDegrees ( fRadians );	
	m_pBar->setRotation ( fDegrees );


	CCSpriteFrameCache*		pCache = CCSpriteFrameCache::sharedSpriteFrameCache ( );

	m_pBar->setDisplayFrame ( pCache->spriteFrameByName ( "analog_bar.png" ) );

	CCRect		tBarTexRect = m_pBar->getTextureRect ( );

	KDfloat		fDistFromCenter = distanceBetweenPoints ( tPoint, this->getPosition ( ) );
	KDfloat		fSizeMod = fDistFromCenter / tSize.cx;
	KDfloat		fOldHeight = tBarTexRect.size.cy;
	KDfloat		fNewHeight = fOldHeight * fSizeMod * 5;

	// Custom fixes
	if ( fNewHeight < 100 )
	{
		fNewHeight = 100.0f; 
	}
	if ( fDistFromCenter < 3 )
	{
		fNewHeight = 0.0f; 
	}

	m_pBar->setTextureRect ( CCRect ( tBarTexRect.origin.x, tBarTexRect.origin.y + ( fOldHeight - fNewHeight ), tBarTexRect.size.cx, fNewHeight ) );	
	m_pBar->setAnchorPoint ( ccp ( 0.5f, 0 ) );

	CCPoint		tDirectionVector = radiansToVector ( fRadians - KD_PI_F / 2 );
	m_pBar->setPosition ( ccp ( tSize.cx / 2 + tDirectionVector.x * tSize.cx / 4, tSize.cy / 2 + tDirectionVector.y * tSize.cy / 4 ) );
}