void GHBoneSkin::transform() { if(sprite == NULL || bone == NULL)return; float degrees = bone->degrees(); CCPoint posOffset = positionOffset; CCPoint bonePos = ccp(((GHBone*)bone->getParent())->getPosition().x, ((GHBone*)bone->getParent())->getPosition().y); CCAffineTransform transformOffset = CCAffineTransformTranslate(CCAffineTransformMakeIdentity(), bonePos.x, bonePos.y); CCAffineTransform transform = CCAffineTransformRotate(CCAffineTransformMakeIdentity(), CC_DEGREES_TO_RADIANS(degrees - angleOffset)); //we need 2 points //origin - upward point, in order to calculate new position and new angle CCPoint origin = ccp(0,0); CCPoint upward = ccp(0, -10); CCAffineTransform transform3 = CCAffineTransformRotate(CCAffineTransformMakeIdentity(), CC_DEGREES_TO_RADIANS(degrees - angleOffset - connectionAngle)); posOffset = CCPointApplyAffineTransform(posOffset, transform3); origin = CCPointApplyAffineTransform(origin, transform); upward = CCPointApplyAffineTransform(upward, transform); origin = CCPointApplyAffineTransform(origin, transformOffset); upward = CCPointApplyAffineTransform(upward, transformOffset); //now that we have the 2 points - lets calculate the angle float newAngle = (atan2(upward.y - origin.y, upward.x - origin.x)*180.0)/M_PI + 90.0; sprite->setPosition(ccp(origin.x + posOffset.x, origin.y - posOffset.y)); sprite->setRotation(newAngle); }
void MissileAttack::resetPosition() { CCPoint p(0, distance); CCAffineTransform transform = CCAffineTransformRotate(CCAffineTransformIdentity, angle); p = CCPointApplyAffineTransform(p, transform); missile->setRotation(-angle / M_PI * 180); missile->setPosition(p); p = CCPoint(0, 120); transform = CCAffineTransformRotate(CCAffineTransformIdentity, angle); p = CCPointApplyAffineTransform(p, transform); aim->setRotation(-angle / M_PI * 180); aim->setPosition(p); }
void NormalAttack::resetPosition() { CCPoint p(0, distance); CCAffineTransform transform = CCAffineTransformRotate(CCAffineTransformIdentity, angle); p = CCPointApplyAffineTransform(p, transform); sprite->setRotation(-angle / M_PI * 180); sprite->setPosition(p); }
bool MissileAttack::enable() { if (distance < 120) { CCPoint p(0, -10); CCAffineTransform transform = CCAffineTransformRotate(CCAffineTransformIdentity, angle); p = CCPointApplyAffineTransform(p, transform); CCMoveBy * move = CCMoveBy::create(0.1f, p); CCActionInterval * rev = move->reverse(); CCAction * seq = CCSequence::create(move, rev, NULL); getParent()->runAction(seq); return false; } return true; }
bool MissileAttack::hit(cocos2d::CCSprite *player) { if (isHit) return false; CCPoint p1(0, distance - missile->getContentSize().height / 2); CCAffineTransform transform = CCAffineTransformRotate(CCAffineTransformIdentity, angle); p1 = CCPointApplyAffineTransform(p1, transform); CCPoint p2 = player->getPosition(); float dist = sqrtf(powf(p1.x - p2.x, 2) + powf(p1.y - p2.y, 2)); if (dist < player->getContentSize().width / 2) return isHit = true; return false; }
CCAffineTransform CCNode::nodeToParentTransform(void) { if ( m_bIsTransformDirty ) { m_tTransform = CCAffineTransformIdentity; if( ! m_bIsRelativeAnchorPoint && ! CCPoint::CCPointEqualToPoint(m_tAnchorPointInPixels, CCPointZero) ) m_tTransform = CCAffineTransformTranslate(m_tTransform, m_tAnchorPointInPixels.x, m_tAnchorPointInPixels.y); if( ! CCPoint::CCPointEqualToPoint(m_tPositionInPixels, CCPointZero) ) m_tTransform = CCAffineTransformTranslate(m_tTransform, m_tPositionInPixels.x, m_tPositionInPixels.y); if( m_fRotation != 0 ) m_tTransform = CCAffineTransformRotate(m_tTransform, -CC_DEGREES_TO_RADIANS(m_fRotation)); if( ! (m_fScaleX == 1 && m_fScaleY == 1) ) m_tTransform = CCAffineTransformScale(m_tTransform, m_fScaleX, m_fScaleY); if( ! CCPoint::CCPointEqualToPoint(m_tAnchorPointInPixels, CCPointZero) ) m_tTransform = CCAffineTransformTranslate(m_tTransform, -m_tAnchorPointInPixels.x, -m_tAnchorPointInPixels.y); m_bIsTransformDirty = false; } return m_tTransform; }
bool CCScale9Sprite::updateWithBatchNode(CCSpriteBatchNode* batchnode, CCRect rect, bool rotated, CCRect capInsets) { GLubyte opacity = getOpacity(); ccColor3B color = getColor(); // Release old sprites this->removeAllChildrenWithCleanup(true); CC_SAFE_RELEASE(this->_centre); CC_SAFE_RELEASE(this->_top); CC_SAFE_RELEASE(this->_topLeft); CC_SAFE_RELEASE(this->_topRight); CC_SAFE_RELEASE(this->_left); CC_SAFE_RELEASE(this->_right); CC_SAFE_RELEASE(this->_bottomLeft); CC_SAFE_RELEASE(this->_bottom); CC_SAFE_RELEASE(this->_bottomRight); if(this->_scale9Image != batchnode) { CC_SAFE_RELEASE(this->_scale9Image); _scale9Image = batchnode; CC_SAFE_RETAIN(_scale9Image); } _scale9Image->removeAllChildrenWithCleanup(true); m_capInsets = capInsets; // If there is no given rect if ( rect.equals(CCRectZero) ) { // Get the texture size as original CCSize textureSize = _scale9Image->getTextureAtlas()->getTexture()->getContentSize(); rect = CCRectMake(0, 0, textureSize.width, textureSize.height); } // Set the given rect's size as original size m_spriteRect = rect; m_originalSize = rect.size; m_preferredSize = m_originalSize; m_capInsetsInternal = capInsets; float w = rect.size.width; float h = rect.size.height; // If there is no specified center region if ( m_capInsetsInternal.equals(CCRectZero) ) { // CCLog("... cap insets not specified : using default cap insets ..."); m_capInsetsInternal = CCRectMake(w/3, h/3, w/3, h/3); } float left_w = m_capInsetsInternal.origin.x; float center_w = m_capInsetsInternal.size.width; float right_w = rect.size.width - (left_w + center_w); float top_h = m_capInsetsInternal.origin.y; float center_h = m_capInsetsInternal.size.height; float bottom_h = rect.size.height - (top_h + center_h); // calculate rects // ... top row float x = 0.0; float y = 0.0; // top left CCRect lefttopbounds = CCRectMake(x, y, left_w, top_h); // top center TRANSLATE_X(x, y, left_w); CCRect centertopbounds = CCRectMake(x, y, center_w, top_h); // top right TRANSLATE_X(x, y, center_w); CCRect righttopbounds = CCRectMake(x, y, right_w, top_h); // ... center row x = 0.0; y = 0.0; TRANSLATE_Y(x, y, top_h); // center left CCRect leftcenterbounds = CCRectMake(x, y, left_w, center_h); // center center TRANSLATE_X(x, y, left_w); CCRect centerbounds = CCRectMake(x, y, center_w, center_h); // center right TRANSLATE_X(x, y, center_w); CCRect rightcenterbounds = CCRectMake(x, y, right_w, center_h); // ... bottom row x = 0.0; y = 0.0; TRANSLATE_Y(x, y, top_h); TRANSLATE_Y(x, y, center_h); // bottom left CCRect leftbottombounds = CCRectMake(x, y, left_w, bottom_h); // bottom center TRANSLATE_X(x, y, left_w); CCRect centerbottombounds = CCRectMake(x, y, center_w, bottom_h); // bottom right TRANSLATE_X(x, y, center_w); CCRect rightbottombounds = CCRectMake(x, y, right_w, bottom_h); if (!rotated) { // CCLog("!rotated"); CCAffineTransform t = CCAffineTransformMakeIdentity(); t = CCAffineTransformTranslate(t, rect.origin.x, rect.origin.y); centerbounds = CCRectApplyAffineTransform(centerbounds, t); rightbottombounds = CCRectApplyAffineTransform(rightbottombounds, t); leftbottombounds = CCRectApplyAffineTransform(leftbottombounds, t); righttopbounds = CCRectApplyAffineTransform(righttopbounds, t); lefttopbounds = CCRectApplyAffineTransform(lefttopbounds, t); rightcenterbounds = CCRectApplyAffineTransform(rightcenterbounds, t); leftcenterbounds = CCRectApplyAffineTransform(leftcenterbounds, t); centerbottombounds = CCRectApplyAffineTransform(centerbottombounds, t); centertopbounds = CCRectApplyAffineTransform(centertopbounds, t); // Centre _centre = new CCSprite(); _centre->initWithTexture(_scale9Image->getTexture(), centerbounds); _scale9Image->addChild(_centre, 0, pCentre); // Top _top = new CCSprite(); _top->initWithTexture(_scale9Image->getTexture(), centertopbounds); _scale9Image->addChild(_top, 1, pTop); // Bottom _bottom = new CCSprite(); _bottom->initWithTexture(_scale9Image->getTexture(), centerbottombounds); _scale9Image->addChild(_bottom, 1, pBottom); // Left _left = new CCSprite(); _left->initWithTexture(_scale9Image->getTexture(), leftcenterbounds); _scale9Image->addChild(_left, 1, pLeft); // Right _right = new CCSprite(); _right->initWithTexture(_scale9Image->getTexture(), rightcenterbounds); _scale9Image->addChild(_right, 1, pRight); // Top left _topLeft = new CCSprite(); _topLeft->initWithTexture(_scale9Image->getTexture(), lefttopbounds); _scale9Image->addChild(_topLeft, 2, pTopLeft); // Top right _topRight = new CCSprite(); _topRight->initWithTexture(_scale9Image->getTexture(), righttopbounds); _scale9Image->addChild(_topRight, 2, pTopRight); // Bottom left _bottomLeft = new CCSprite(); _bottomLeft->initWithTexture(_scale9Image->getTexture(), leftbottombounds); _scale9Image->addChild(_bottomLeft, 2, pBottomLeft); // Bottom right _bottomRight = new CCSprite(); _bottomRight->initWithTexture(_scale9Image->getTexture(), rightbottombounds); _scale9Image->addChild(_bottomRight, 2, pBottomRight); } else { // set up transformation of coordinates // to handle the case where the sprite is stored rotated // in the spritesheet // CCLog("rotated"); CCAffineTransform t = CCAffineTransformMakeIdentity(); CCRect rotatedcenterbounds = centerbounds; CCRect rotatedrightbottombounds = rightbottombounds; CCRect rotatedleftbottombounds = leftbottombounds; CCRect rotatedrighttopbounds = righttopbounds; CCRect rotatedlefttopbounds = lefttopbounds; CCRect rotatedrightcenterbounds = rightcenterbounds; CCRect rotatedleftcenterbounds = leftcenterbounds; CCRect rotatedcenterbottombounds = centerbottombounds; CCRect rotatedcentertopbounds = centertopbounds; t = CCAffineTransformTranslate(t, rect.size.height+rect.origin.x, rect.origin.y); t = CCAffineTransformRotate(t, 1.57079633f); centerbounds = CCRectApplyAffineTransform(centerbounds, t); rightbottombounds = CCRectApplyAffineTransform(rightbottombounds, t); leftbottombounds = CCRectApplyAffineTransform(leftbottombounds, t); righttopbounds = CCRectApplyAffineTransform(righttopbounds, t); lefttopbounds = CCRectApplyAffineTransform(lefttopbounds, t); rightcenterbounds = CCRectApplyAffineTransform(rightcenterbounds, t); leftcenterbounds = CCRectApplyAffineTransform(leftcenterbounds, t); centerbottombounds = CCRectApplyAffineTransform(centerbottombounds, t); centertopbounds = CCRectApplyAffineTransform(centertopbounds, t); rotatedcenterbounds.origin = centerbounds.origin; rotatedrightbottombounds.origin = rightbottombounds.origin; rotatedleftbottombounds.origin = leftbottombounds.origin; rotatedrighttopbounds.origin = righttopbounds.origin; rotatedlefttopbounds.origin = lefttopbounds.origin; rotatedrightcenterbounds.origin = rightcenterbounds.origin; rotatedleftcenterbounds.origin = leftcenterbounds.origin; rotatedcenterbottombounds.origin = centerbottombounds.origin; rotatedcentertopbounds.origin = centertopbounds.origin; // Centre _centre = new CCSprite(); _centre->initWithTexture(_scale9Image->getTexture(), rotatedcenterbounds, true); _scale9Image->addChild(_centre, 0, pCentre); // Top _top = new CCSprite(); _top->initWithTexture(_scale9Image->getTexture(), rotatedcentertopbounds, true); _scale9Image->addChild(_top, 1, pTop); // Bottom _bottom = new CCSprite(); _bottom->initWithTexture(_scale9Image->getTexture(), rotatedcenterbottombounds, true); _scale9Image->addChild(_bottom, 1, pBottom); // Left _left = new CCSprite(); _left->initWithTexture(_scale9Image->getTexture(), rotatedleftcenterbounds, true); _scale9Image->addChild(_left, 1, pLeft); // Right _right = new CCSprite(); _right->initWithTexture(_scale9Image->getTexture(), rotatedrightcenterbounds, true); _scale9Image->addChild(_right, 1, pRight); // Top left _topLeft = new CCSprite(); _topLeft->initWithTexture(_scale9Image->getTexture(), rotatedlefttopbounds, true); _scale9Image->addChild(_topLeft, 2, pTopLeft); // Top right _topRight = new CCSprite(); _topRight->initWithTexture(_scale9Image->getTexture(), rotatedrighttopbounds, true); _scale9Image->addChild(_topRight, 2, pTopRight); // Bottom left _bottomLeft = new CCSprite(); _bottomLeft->initWithTexture(_scale9Image->getTexture(), rotatedleftbottombounds, true); _scale9Image->addChild(_bottomLeft, 2, pBottomLeft); // Bottom right _bottomRight = new CCSprite(); _bottomRight->initWithTexture(_scale9Image->getTexture(), rotatedrightbottombounds, true); _scale9Image->addChild(_bottomRight, 2, pBottomRight); } this->setContentSize(rect.size); this->addChild(_scale9Image); if (m_bSpritesGenerated) { // Restore color and opacity this->setOpacity(opacity); this->setColor(color); } m_bSpritesGenerated = true; return true; }