2011-04-24 3 views
1

J'ai deux mains de chaque côté de l'écran qui ne bougent pas du tout et deux pouces qui tournent sur 360 degrés. Je veux limiter la rotation des pouces, ce qui signifie que je n'ai besoin que d'eux pour pouvoir tourner comme des pouces normaux. Je suis nouveau à cocos2d donc toute aide sera grandement appréciée. Voici ce que j'ai jusqu'à présentLimite Sprite Rotation - Cocos2d

#import "cocos2d.h" 


    @interface GameScene : CCLayer { 

     CGFloat lthumbRotation, rthumbRotation; 
     CCSprite *lthumb, *rthumb; 
    } 

    +(CCScene *) scene; 


    @end 
------------------------------------ 
#import "GameScene.h" 

@implementation GameScene 

+(CCScene *) scene 
{ 
    CCScene *scene = [CCScene node]; 
    GameScene *layer = [GameScene node]; 

    [scene addChild: layer]; 
    return scene; 
} 

-(id) init 
{ 
    if ((self = [super init])) 
    { 
     lthumb = [CCSprite spriteWithFile:@"lthumb.png" rect:CGRectMake(0,0, 145, 59)]; 
     lthumb.position = ccp(100, 140); 
     lthumb.anchorPoint = ccp(0.3, 0.8); 

     [self addChild:lthumb z:0]; 


     rthumb = [CCSprite spriteWithFile:@"rthumb.png" rect:CGRectMake(0,0, 145, 59)]; 
     rthumb.position = ccp(380, 140); 
     rthumb.anchorPoint = ccp(0.7, 0.8); 

     [self addChild:rthumb z:0]; 

     [self scheduleUpdate]; 

    } 
    return self; 
} 
-(void)update:(ccTime)delta 
{ 
    lthumb.rotation = lthumbRotation; 
    rthumb.rotation = rthumbRotation; 
} 
- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 

} 

- (void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 

    //acquire the previous touch location 
    CGPoint firstLocation = [touch previousLocationInView:[touch view]]; 
    CGPoint location = [touch locationInView:[touch view]]; 

    //preform all the same basic rig on both the current touch and previous touch 
    CGPoint touchingPoint = [[CCDirector sharedDirector] convertToGL:location]; 
    CGPoint firstTouchingPoint = [[CCDirector sharedDirector] convertToGL:firstLocation]; 

    CGPoint firstVector = ccpSub(firstTouchingPoint, rthumb.position); 
    CGFloat firstRotateAngle = -ccpToAngle(firstVector); 
    CGFloat previousTouch = CC_RADIANS_TO_DEGREES(firstRotateAngle); 

    CGPoint vector = ccpSub(touchingPoint, rthumb.position); 
    CGFloat rotateAngle = -ccpToAngle(vector); 
    CGFloat currentTouch = CC_RADIANS_TO_DEGREES(rotateAngle); 

    //keep adding the difference of the two angles to the dial rotation 
    lthumbRotation += currentTouch - previousTouch; 
    rthumbRotation -= currentTouch - previousTouch; 
} 

- (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 

} 

- (void) dealloc 
{ 
    CCLOG(@"%@: %@", NSStringFromSelector(_cmd), self); 
    [super dealloc]; 
} 

@end 

Cela permet à la fois des pouces se déplacent en même temps dans les angles haut/bas avec le point d'ancrage au fond des pouces (agissant comme un joint).

J'ai également besoin de la rotation des pouces pour revenir à 0 une fois les touches terminées.

Merci à l'avance

Répondre

1

Dans votre méthode ccTouchesMoved:withEvent:, vérifier simplement pour voir si la nouvelle rotation est à un seuil donné avant de l'appliquer à vos sprites.

Enfin, ccTouchesEnded:withEvent:, vous pouvez simplement définir les valeurs de rotation à 0:

lthumbRotation = 0; 
rthumbRotation = 0; 
+0

Désolé, je suis encore très nouveau à cela, pourriez-vous expliquer ce que vous entendez par vérifier si la nouvelle rotation est dans un seuil donné avant de l'appliquer aux sprites? En outre, le "lthumbRotation = 0;" travaillé. Pour une raison quelconque, j'essayais de mettre la position à 0 (ça a été une longue journée). Merci beaucoup. – Jonathan