2010-01-07 7 views
5

he implementado un lastre para un objeto Sprite de la siguiente manera ..arrastre suavemente un Sprite en 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; 
} 

pero esto no es suave arrastre ..... cuando me arrastre rápido con el pulgar el objeto a la izquierda del camino.

Gracias

Respuesta

0

No estoy exactamente seguro de lo que quiere decir con "el objeto a la izquierda del camino". Supongo que lo que quieres decir es que si arrastras el dedo sobre la pantalla en un arco o círculo, el sprite "saltará" de un punto a otro, en lugar de seguir tu dedo con precisión. ¿Es esto correcto?

Si quieres que tu sprite siga un camino exacto, deberás crear una ruta y luego configurar el sprite para seguirlo. Lo que debes hacer ahora es simplemente establecer la posición del sprite en la posición táctil, pero un toque "arrastrado" no creará un evento por cada píxel que toque.
Es bastante fácil crear una ruta para toques recibidos, y ejemplos de código se pueden encontrar aquí y allá. Sin embargo, si la velocidad del sprite (en píxeles por fotograma) es demasiado alta, siempre la verá "saltar", incluso si usa una ruta suave.

Ejemplo:
Puede animar un sprite sobre una trayectoria circular. Si lo anima para completar el recorrido en 1 segundo, es probable que vea una animación suave. Pero si funciona a alta velocidad, como un círculo completo en 4 cuadros, solo verá su sprite en 4 lugares, no en un círculo suave. Si desea 'corregir' eso, necesitará considerar la mezcla, o determinar cuál es la velocidad máxima para un movimiento aceptable, y desacelerar su sprite cuando es demasiado rápido.

Espero que responda a su pregunta. Si no está claro, puede editar su pregunta o agregar un comentario a mi respuesta.

+1

¡Gracias por su respuesta! Mi programa es muy simple ... tengo un objeto en la pantalla como un objeto cuadrado. Solo quiero que siga mi dedo cuando arrastro mi dedo en la pantalla ... (lo hace con mi código, pero no con precisión) Cuando arrastro mi dedo rápido en la pantalla, no sigue mi dedo. puede utilizar el código anterior en un proyecto de muestra y puede ver lo que sucede ..... gracias de nuevo por su respuesta ... apreciado ..... –

1

Tuve el mismo problema con mi juego. Las operaciones de arrastre parecían espasmódicas. Creo que la razón es que los eventos táctiles no se generan lo suficientemente rápido como para dar una apariencia suave.

Para resolver el problema alisé el movimiento ejecutando una acción en el sprite hacia la ubicación deseada, en lugar de establecer la posición inmediatamente.

10

Probablemente un poco tarde pero estaba buscando algo similar. me encontré con este gran tutorial que explicaba todo: 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

Usted salvó mi tiempo :) Voto ¡¡¡Hurra !!! –

+0

Hablando de CocosSharp (puerto de Cocos2d-XNA), el enfoque CCMoveTo no funcionó para mí y fue muy lento.Sin embargo, tu método a – OzB

0

vistazo aquí, lo que sugiero que pruebe en tal caso:

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

Y realmente trabajar sin problemas.

Disfruté de esta manera fácil.

Cuestiones relacionadas