2010-01-07 2 views
5

я реализовал перетащить на объект спрайта следующим образом ..Плавно перетащить Sprite в cocos2d - iPhone

-(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; 
} 

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

Благодаря

ответ

0

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

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

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

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

+1

Спасибо за ответ! Моя программа очень проста .... У меня есть спрайт на экране, как квадратный объект, я просто хочу, чтобы он следил за моим пальцем, когда я перетаскиваю палец на экран ... (это происходит с моим кодом, но не точно) когда я быстро нажимаю палец на экране, он не следует за моим пальцем. вы можете использовать вышеприведенный код в примерном проекте и можете видеть, что происходит ..... еще раз спасибо за ваш ответ .. оценил ..... – 2010-01-11 04:41:13

1

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

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

10

Возможно, немного поздно, но я искал аналогичную вещь. Я нашел большой учебник, который все объяснил: 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; 
} 
+0

Вы спасли мое время :) Upvote Ура! –

+0

Говоря о CocosSharp (порт Cocos2d-XNA), подход CCMoveTo не работал для меня, и он был очень лаги.Однако ваш метод a – OzB

0

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

-(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]; 
    } 
} 

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

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

Смежные вопросы