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