Как реализовать эффект увеличения / уменьшения масштаба на изображении спрайта cocos2d? - PullRequest
0 голосов
/ 19 мая 2010

Я занимаюсь разработкой модуля, в котором я выбираю изображение из библиотеки фотографий и помещаю в спрайт. Я хочу реализовать эффект увеличения / уменьшения масштаба для спрайтового изображения, такой же, как эффект увеличения / уменьшения изображений в альбоме камеры. Может кто-нибудь подсказать, как мне это реализовать?

Я вижу где-то, что я должен обнаружить два события касания в ccTouchBegan и затем отрегулировать размер шкалы спрайта вверх или вниз в зависимости от расстояния между значениями касания двумя пальцами.

Может кто-нибудь сказать мне, пожалуйста:

  • Как определить значения касания двумя пальцами в ccTouchBegan?
  • Как разрешить пользователю касаться и увеличивать / уменьшать изображение спрайта? Пожалуйста, дайте мне образцы. Я уже пробовал кое-что из этого URL , но не работает для моего требования.

Спасибо.

Ответы [ 2 ]

1 голос
/ 21 мая 2012

1) Для первого шага необходимо создать две переменные.

BOOL canPinch; 
float oldScale;

2) Используйте ответ бригадира :) и добавьте его в свой метод инициализации

UIPinchGestureRecognizer* pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action: @selector (zoom:)];
[[[CCDirector sharedDirector] openGLView] addGestureRecognizer:pinchGesture];

3)

- (void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{     
    NSArray* allTouches = [[event allTouches] allObjects];
    UITouch* touch = [touches anyObject]; 
    CGPoint location = [self convertTouchToNodeSpace:touch];;

    CGRect particularSpriteRect = CGRectMake(spriteToZoom.position.x-[spriteToZoom boundingBox].size.width/2, spriteToZoom.position.y-[spriteToZoom boundingBox].size.height/2, [spriteToZoom boundingBox].size.width, [spriteToZoom boundingBox].size.height);

    if(CGRectContainsPoint(particularSpriteRect, location)) 
    {  
        if ([allTouches count] == 2) 
        {     
            canPinch = YES; 
            return;
        }   
        else if ([allTouches count] == 1)
        {  
            CGPoint touchLocation = [self convertTouchToNodeSpace:touch];

            CGPoint oldTouchLocation = [touch previousLocationInView:touch.view];
            oldTouchLocation = [[CCDirector sharedDirector] convertToGL:oldTouchLocation];
            oldTouchLocation = [self convertToNodeSpace:oldTouchLocation];

            CGPoint translation = ccpSub(touchLocation, oldTouchLocation);    
            [self panForTranslation:translation]; 
        }

    }
    canPinch = NO;
}

- (void)panForTranslation:(CGPoint)translation 
{     
    CGPoint newPos = ccpAdd(spriteToZoom.position, translation);
    spriteToZoom.position = newPos; 
}

- (void)zoom: (UIPinchGestureRecognizer*) gestureRecognizer
{
    if (canPinch) 
    {
        if (([gestureRecognizer state] == UIGestureRecognizerStateBegan) || ([gestureRecognizer state] == UIGestureRecognizerStateChanged))
        {       
            spriteToZoom.scale = oldScale + [gestureRecognizer scale]-(oldScale != 0 ? 1 : 0);  
        }
        if ([gestureRecognizer state] == UIGestureRecognizerStateEnded)
        { 
            oldScale = spriteToZoom.scale; 
        } 
    } 
}
1 голос
/ 07 мая 2012

Было бы проще использовать распознаватель жестов для увеличения:

    // on initializing your scene:
    UIPinchGestureRecognizer* PinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget: self action: @selector (zoom:)];
    [[[Director sharedDirector] openGLView] addGestureRecognizer: PinchGesture];
...
/// zoom callback:
-(void) zoom: (UIPinchGestureRecognizer*) gestureRecognizer
{
    if (([gestureRecognizer state] == UIGestureRecognizerStateBegan) || ([gestureRecognizer state] == UIGestureRecognizerStateChanged))
        yourSprite.scale = [gestureRecognizer scale];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...