2010-01-18 4 views
5

J'essaye de changer mon point d'ancrage de Sprite de sorte que je puisse tourner sur un point d'ancrage de 0.0f, 0.0f. Au début, mon objet est la rotation au point d'ancrage par défaut (0.5f, 0.5f). Cependant, plus tard, j'en ai besoin pour tourner sur un AnchorPoint 0.0.0.0. Le problème est que je ne peux pas changer le point d'ancrage et changer la position en conséquence, de sorte qu'il reste sur la même position, sans que l'objet ne semble se déplacer rapidement et se repositionner à son point d'origine.Modifier Sprite Anchorpoint sans le déplacer?

Y at-il un moyen de définir le point d'ancrage et la position de mon Sprite à la fois, sans qu'il bouge du tout? Je vous remercie.

-Oscar

+0

De quel type de sprites parlez-vous? –

+0

Désolé j'ai oublié d'inclure cela. Je parle d'OpenGL 2.0 pour iPhone Sprites. –

+0

Peut-être que vous voulez dire cocos2d? OpenGL n'a pas de "iPhone Sprite". – bentford

Répondre

2

Ceci est une bonne question, et je ne sais pas encore la réponse complète.

Comme vous avez pu le remarquer, le point d'ancrage ne peut pas être changé sans affecter l'échelle et la rotation.

Pour redimensionnées sprites:

Vous devez changer simultanément la Anchorpoint et la position de l'image-objet. Voir this question for a hint

Pour sprites pivotés:

Intuition dit que vous auriez besoin de changer simultanément Anchorpoint, la rotation et la position. (Je ne sais pas comment calculer cela.)

REMARQUE: Je suis en train d'apprendre la programmation graphique, donc je ne suis pas 100% capable de calculer ce genre de choses encore.

3

J'ai trouvé une solution à cela avec un UIView ailleurs, et réécrite pour cocos2d:

- (void)setAnchorPoint:(CGPoint)anchorPoint forSprite:(CCSprite *)sprite 
{ 
    CGPoint newPoint = CGPointMake(sprite.contentSize.width * anchorPoint.x, sprite.contentSize.height * anchorPoint.y); 
    CGPoint oldPoint = CGPointMake(sprite.contentSize.width * sprite.anchorPoint.x, sprite.contentSize.height * sprite.anchorPoint.y); 

    newPoint = CGPointApplyAffineTransform(newPoint, [sprite nodeToWorldTransform]); 
    oldPoint = CGPointApplyAffineTransform(oldPoint, [sprite nodeToWorldTransform]); 

    CGPoint position = sprite.position; 

    position.x -= oldPoint.x; 
    position.x += newPoint.x; 

    position.y -= oldPoint.y; 
    position.y += newPoint.y; 

    sprite.position = position; 
    sprite.anchorPoint = anchorPoint; 
} 
+0

Je crois que "ailleurs" que vous avez mentionné est http://stackoverflow.com/a/5666430/108574. Néanmoins, encore +1 pour la solution de travail. –

2

J'ai besoin de ce deux ou trois fois et a décidé de faire une extension pour CCNode, testé et ABIT semble fonctionner correctement. Peut être vraiment utile à certains :)

Il a été testé avec 1.x mais il devrait fonctionner correctement dans 2.x aussi. Prend en charge les nœuds transformés et HD. Ajoutez simplement ceci à votre projet et importez quand vous en avez besoin - Il sera ajouté à toutes les classes dérivant de CCNode. (CCSprite, CCLayer)

Interface

#import "cocos2d.h" 

@interface CCNode (Extensions) 

// Returns the parent coordinate for an anchorpoint. Useful for aligning nodes with different anchorpoints for instance 
-(CGPoint)positionOfAnchorPoint:(CGPoint)anchor; 

// As above but using anchorpoint in points rather than percentage 
-(CGPoint)positionOfAnchorPointInPoints:(CGPoint)anchor; 

//Sets the anchorpoint, to not move the node set lockPosition to `YES`. Setting it to `NO` is equal to setAnchorPoint, I thought this would be good for readability so you always know what you do when you move the anchorpoint 
-(void)setAnchorPoint:(CGPoint)a lockPosition:(BOOL)lockPosition; 

@end 

mise en oeuvre

#import "CCNode+AnchorPos.h" 

@implementation CCNode (Extensions) 

-(CGPoint)positionOfAnchorPoint:(CGPoint)anchor 
{ 
    float x = anchor.x * self.contentSizeInPixels.width; 
    float y = anchor.y * self.contentSizeInPixels.height; 

    CGPoint pos = ccp(x,y); 

    pos = CGPointApplyAffineTransform(pos, [self nodeToParentTransform]); 

    return ccpMult(pos, 1/CC_CONTENT_SCALE_FACTOR()); 
} 

-(CGPoint)positionOfAnchorPointInPoints:(CGPoint)anchor; 
{ 
    CGPoint anchorPointInPercent = ccp(anchor.x/self.contentSize.width, anchor.y/self.contentSize.height); 
    return [self positionOfAnchorPoint:anchorPointInPercent]; 
} 

-(void)setAnchorPoint:(CGPoint)a lockPosition:(BOOL)lockPosition 
{ 
    CGPoint tempPos = [self positionOfAnchorPoint:a]; 
    self.anchorPoint = a; 

    if(lockPosition) 
    { 
     self.position = tempPos; 
    } 
} 

@end 
+0

Merci beaucoup: D –

0

Cocos2d-x + échelle fixe

YourClass.h

virtual cocos2d::Vec2 positionFromSprite(cocos2d::Vec2 newAnchorPoint, cocos2d::Sprite *sprite); 

VotreClasse.m

Vec2 YourClass::positionFromSprite(Vec2 newAnchorPoint, cocos2d::Sprite *sprite) { 
    Rect rect = sprite->getSpriteFrame()->getRect(); 
    Vec2 oldAnchorPoint = sprite->getAnchorPoint(); 
    float scaleX = sprite->getScaleX(); 
    float scaleY = sprite->getScaleY(); 

    Vec2 newPoint = Vec2(rect.size.width * newAnchorPoint.x * scaleX, rect.size.height * newAnchorPoint.y * scaleY); 
    Vec2 oldPoint = Vec2(rect.size.width * oldAnchorPoint.x * scaleX, rect.size.height * oldAnchorPoint.y * scaleY); 

    Vec2 position = sprite->getPosition(); 

    position.x -= oldPoint.x; 
    position.x += newPoint.x; 

    position.y -= oldPoint.y; 
    position.y += newPoint.y; 

    return position; 
} 
Questions connexes