Предельное вращение спрайта - Cocos2d - PullRequest
1 голос
/ 24 апреля 2011

У меня две руки по обе стороны экрана, которые не двигаются вообще, и два больших пальца, которые вращаются на 360 градусов.Я хочу ограничить вращение больших пальцев, то есть мне нужно, чтобы они вращались как обычные большие пальцы.Я новичок в 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

Это позволяет обоим пальцы двигаться в то же время в вверх / вниз углы с узловой точкой в ​​нижней части тумб (действуя как сустав).

Мне также нужно, чтобы вращение большого пальца вернулось к 0 после того, как касания закончились.

Заранее спасибо

1 Ответ

1 голос
/ 25 апреля 2011

В вашем методе ccTouchesMoved:withEvent: просто проверьте, находится ли новое вращение в пределах заданного порога, прежде чем применять его к своим спрайтам.

Наконец, в ccTouchesEnded:withEvent: вы можете просто установить значения вращения обратно в 0:

lthumbRotation = 0;
rthumbRotation = 0;
...