Плавно перетащите спрайт в cocos2d - iPhone - PullRequest
5 голосов
/ 07 января 2010

Я реализовал перетаскивание объекта спрайта следующим образом.

-(BOOL)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {

UITouch * touch = [touches anyObject];
CGPoint location = [[Director sharedDirector] convertCoordinate: [touch locationInView:touch.view]];    
[diskSprite setPosition:ccp(location.x , location.y )];
return kEventHandled;
}

но это перетаскивание не гладкое ..... когда я быстро перетаскиваю большим пальцем объект, оставленный с пути.

Спасибо

Ответы [ 4 ]

10 голосов
/ 15 октября 2011

Возможно, немного поздно, но я искал похожую вещь. Я нашел этот замечательный учебник, который объяснил все: http://www.raywenderlich.com/2343/how-to-drag-and-drop-sprites-with-cocos2d

- (void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event {       
    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);    
    CGPoint newPos = ccpAdd(mySpriteToMove.position, translation);
    mySpriteToMove.position = newPos;
}
1 голос
/ 17 февраля 2010

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

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

0 голосов
/ 13 февраля 2012

посмотрите здесь, что я предлагаю вам попробовать в таком случае:

-(void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event {
    if (_binCaptured) {
        CGPoint location = [self convertTouchToNodeSpace:touch];

        [_sprite stopAllActions];

        id move = [CCEaseIn actionWithAction:[CCMoveTo actionWithDuration:0.1 position:ccp(location.x, _sprite.position.y)]];
        [_sprite runAction:move];
    }
} 

И это действительно работает гладко.

Мне понравился этот простой способ.

0 голосов
/ 08 января 2010

Я не совсем уверен, что вы подразумеваете под "объектом, оставленным с пути". Я предполагаю, что вы имеете в виду, что если вы проведете пальцем по экрану по дуге или по кругу, то спрайт будет «перепрыгивать» из точки в точку, а не точно следовать пальцу. Это правильно?

Если вы хотите, чтобы ваш спрайт следовал точному пути, вам нужно будет создать путь, а затем настроить спрайт для его следования. Теперь вы просто устанавливаете позицию спрайта в позицию касания, но «перетаскиваемое» касание не создаст событие для каждого пикселя, к которому он прикоснется.
Довольно просто создать путь для полученных прикосновений, и примеры кода можно найти здесь и там. Однако, если скорость спрайта (в пикселях на кадр) слишком высока, вы всегда увидите, что он «прыгает», даже если вы используете плавный путь.

Пример:
Вы можете анимировать спрайт по круговому пути. Если вы оживите это, чтобы завершить путь за 1 секунду, вы, скорее всего, увидите плавную анимацию. Но если он работает на высокой скорости, например, полный круг в 4 кадрах, вы увидите спрайт в 4 местах, а не в гладком круге. Если вы хотите «исправить» это, вам необходимо изучить смешивание или определить максимальную скорость для приемлемого движения и замедлить спрайт, когда он слишком быстрый.

Надеюсь, это ответит на ваш вопрос. Если неясно, отредактируйте свой вопрос или добавьте комментарий к моему ответу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...