ios objective-c sprite-kit skphysicsbody

ios - Kit de Sprite: determina el vector del gesto de deslizar para deslizar el sprite



objective-c sprite-kit (3)

Tengo un juego donde los objetos circulares se disparan desde la parte inferior de la pantalla y me gustaría poder deslizarlos para moverlos en la dirección de mi deslizamiento. Mi problema es que no sé cómo calcular el vector / dirección del deslizamiento para hacer que el objeto circular se mueva en la dirección correcta con la velocidad adecuada.

El vector estático "(5,5)" que estoy usando debe calcularse mediante la velocidad de deslizamiento y la dirección del deslizamiento. Además, necesito asegurarme de que una vez que haga el primer contacto con el objeto, ya no ocurra, como para evitar golpear dos veces el objeto. Esto es lo que estoy haciendo actualmente:

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { for (UITouch *touch in touches) { CGPoint location = [touch locationInNode:self]; SKNode* node = [self nodeAtPoint:location]; [node.physicsBody applyImpulse:CGVectorMake(5, 5) atPoint:location]; } }


Aquí hay un ejemplo de cómo detectar un gesto de deslizamiento:

Primero, defina variables de instancia para almacenar la ubicación y la hora de inicio.

CGPoint start; NSTimeInterval startTime;

En touchesBegan, guarde la ubicación / hora de un evento táctil.

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { /* Avoid multi-touch gestures (optional) */ if ([touches count] > 1) { return; } UITouch *touch = [touches anyObject]; CGPoint location = [touch locationInNode:self]; // Save start location and time start = location; startTime = touch.timestamp; }

Definir los parámetros del gesto deslizar. Ajuste estos en consecuencia.

#define kMinDistance 25 #define kMinDuration 0.1 #define kMinSpeed 100 #define kMaxSpeed 500

En Toques Encendidos, determine si el gesto del usuario fue un golpe al comparar las diferencias entre las ubicaciones iniciales y finales y las marcas de tiempo.

- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [touches anyObject]; CGPoint location = [touch locationInNode:self]; // Determine distance from the starting point CGFloat dx = location.x - start.x; CGFloat dy = location.y - start.y; CGFloat magnitude = sqrt(dx*dx+dy*dy); if (magnitude >= kMinDistance) { // Determine time difference from start of the gesture CGFloat dt = touch.timestamp - startTime; if (dt > kMinDuration) { // Determine gesture speed in points/sec CGFloat speed = magnitude / dt; if (speed >= kMinSpeed && speed <= kMaxSpeed) { // Calculate normalized direction of the swipe dx = dx / magnitude; dy = dy / magnitude; NSLog(@"Swipe detected with speed = %g and direction (%g, %g)",speed, dx, dy); } } } }


En touchesBegan guarde la ubicación táctil como un CGPoint al que puede acceder a través de su aplicación.

En los touchesEnded calcule la distancia y la dirección de su toque inicial (toques Bean) y toque final (toquesEnded). Luego aplica el Impulso apropiado.

Para evitar el doble golpe, agrega un bool canHit que establezcas en NO cuando el impulso se aplica y regresa a SÍ cuando estés listo para golpear nuevamente. Antes de aplicar el impulso, asegúrese de que canHit esté establecido en SÍ.


Hay otra manera de hacerlo, puede agregar un gesto de panorámica y luego obtener la velocidad de la misma:

Primero agrega pan gesto en tu vista:

UIPanGestureRecognizer *gestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanFrom:)]; [self.view addGestureRecognizer:gestureRecognizer];

Luego maneja el gesto:

- (void)handlePanFrom:(UIPanGestureRecognizer *)recognizer { if (recognizer.state == UIGestureRecognizerStateBegan) { CGPoint location = [recognizer locationInView:recognizer.view]; if ([_object containsPoint:location]){ self.movingObject = YES; <.. object start moving ..> } } else if (recognizer.state == UIGestureRecognizerStateChanged) { if (!self.movingObject) return; CGPoint translation = [recognizer translationInView:recognizer.view]; object.position = CGPointMake(object.position.x + translation.x, object.position.y + translation.y); [recognizer setTranslation:CGPointZero inView:recognizer.view]; } else if (recognizer.state == UIGestureRecognizerStateEnded) { if (!self.movingObject) return; self.movingObject = NO; float force = 1.0f; CGPoint gestureVelocity = [recognizer velocityInView:recognizer.view]; CGVector impulse = CGVectorMake(gestureVelocity.x * force, gestureVelocity.y * force); <.. Move object with that impulse using an animation..> } }