Вращающийся спрайт с помощью касания — Cocos2d

#iphone #cocos2d-iphone

#iPhone #cocos2d-iphone

Вопрос:

Есть ли у кого-нибудь лучший способ повернуть спрайт одним пальцем? Моя проблема в том, что я не могу заставить спрайт прекратить вращение после того, как он был полностью повернут дважды, и я периодически переворачиваю экран на 180 градусов (самовращение = 180;), затем переворачиваю его обратно (самовращение = 0). Но, когда я переворачиваю его на 180 градусов, спрайт не будет вращаться должным образом.

У кого-нибудь есть идеи получше этого?

 CGFloat gRotation;

- (void)update:(ccTime)delta
{
    g.rotation = gRotation;
}
    - (void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
    {
        UITouch *touch = [touches anyObject];
        CGPoint location = [touch locationInView:[touch view]];
        location = [[CCDirector sharedDirector] convertToGL:location];

        if (CGRectContainsPoint(g.boundingBox, location))
        {
            CGPoint firstLocation = [touch previousLocationInView:[touch view]];
            CGPoint location = [touch locationInView:[touch view]];

            CGPoint touchingPoint = [[CCDirector sharedDirector] convertToGL:location];
            CGPoint firstTouchingPoint = [[CCDirector sharedDirector] convertToGL:firstLocation];

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

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

            gRotation  = currentTouch - previousTouch;
        }
    }
  

Спасибо

Редактировать:

Я зашел в GameConfig.h и изменил #define GAME_AUTOROTATION kGameAutorotationUIViewController на #define GAME_AUTOROTATION kGameAutorotationNone

Затем зашел в AppDelegate.m и изменил #if GAME_AUTOROTATION == kGameAutorotationUIViewController на #if GAME_AUTOROTATION == kGameAutorotationNone

Это исправило вращение спрайта при переворачивании экрана, но у меня все еще возникают проблемы с остановкой вращения спрайта после двух полных оборотов.

Ответ №1:

добавьте новую строку в конце:

 gRotation  = currentTouch - previousTouch;
gRotation = fmod(gRotation,360.0); // <<< fix the angle
  

возможно, это решит вашу проблему, поскольку угол наклона останется в диапазоне 360

Другой способ поворота одним пальцем — распознаватель UIPanGestureRecognizer (но вам все равно нужно сохранять угол наклона в диапазоне 360):

 UIPanGestureRecognizer *gestureRecognizer = [[[UIPanGestureRecognizer alloc] initWithTarget:layer action:@selector(handlePanFrom:)] autorelease];
[[[CCDirector sharedDirector] openGLView] addGestureRecognizer:gestureRecognizer];

...

- (void)handlePanFrom:(UIPanGestureRecognizer *)recognizer 
{
  CGPoint translation = [recognizer translationInView:recognizer.view];
  ...
}
  

Взгляните на это руководство для получения более подробной информации (оно выполняется перетаскиванием, но показывает, как выполнить жест панорамирования):

http://www.raywenderlich.com/2343/how-to-drag-and-drop-sprites-with-cocos2d

Комментарии:

1. есть ли другой способ вращения спрайта? Потому что степень вращения шлифовальной машины зависит от текущего касания и предыдущего касания

2. вы могли бы использовать класс UIPanGestureRecognizer для обнаружения перетаскивания только одним пальцем (iOS 4 или выше).

3. Разве UIPanGestureRecognizer не предназначен больше для анимации? Мне нужно, чтобы спрайт вращался, пока вы двигаете пальцем, затем, когда вы поднимаете палец, он останавливается. Спрайт также должен вращаться так же быстро или так же медленно, как это делает ваш палец

4. это просто так. Распознаватель панорамирования выдает количество перемещений, когда пользователь проводит пальцем по экрану — речь идет не об анимации, а о сенсорном интерфейсе