Comment bash des objects avec le mouvement des doigts dans Sprite Kit, Objective C

J'essaie de faire un jeu dans lequel j'ai quelques SKSpriteNodes et l'user peut les bash avec le mouvement des doigts, j'utilise le nouveau Sprite Kit d'Apple.

Pour faire cela, j'ai essayé une astuce – placer un Sprite – "X" (SKSpriteNode) où le doigt est, et quand l'user bouge le doigt – changer la position de ce sprite X,

le problème est qu'il ne touchera les autres sprites que s'il n'est pas en mouvement, je veux que les autres sprites réagissent à la vélocité actuelle du doigt en mouvement – plus le mouvement du doigt est rapide – plus la collision devrait être forte.

Pouvez-vous s'il vous plaît m'aider?

  • Bien que je pense que l'astuce n'est pas la bonne façon de le faire, je post le code aussi.

    -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { if([touches count]==1) { self.X= [[SKSpriteNode alloc]initWithImageNamed:@"X"]; self.X.name= @"X"; UITouch *t= touches.allObjects[0]; self.X.position= [t locationInNode:self.GameNode]; self.X.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:20]; self.X.physicsBody.dynamic=YES; // Tried NO too... self.X.zPosition=1; [self.GameNode addChild:self.X]; } } -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *t = touches.allObjects[0]; self.X.position = [t locationInNode:self.GameNode]; } -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { [self.X removeFromParent]; } 

Après avoir cherché et fait beaucoup d'expériences, j'ai enfin une réponse!

La première étape de la solution a été fournie par AyatollahAndy – find le point d'impact:

 SKNode *node = [self nodeAtPoint:location]; 

cette ligne obtient le nœud que nous avons frappé à l'location spécifié, si elle returnne zéro, nous n'avons rien touché.

deuxièmement, nous voulons "Hit" de l'object, à cet effet, nous devons ApplyImpulse:

 [node.physicsBody applyImpulse:CGVectorMake(thrustV.x, thrustV.y) atPoint:location]; 

Ici, vous pouvez voir que j'ai appliqué l'impulsion avec un vector que j'ai créé au point d'impact, c'est tout – plutôt simple, j'espère que cela aidera les autres.

Le partage est attentionné, merci d'avoir pris le time de lire mon message.

Vous pourriez faire quelque chose comme ça.

 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { touchOn=YES; UITouch *touch = [touches anyObject]; CGPoint location = [touch locationInNode:self.parent]; touchPos =location; [self.physicsBody setVelocity:CGVectorMake(0, 0)]; } -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { touchOn=YES; UITouch *touch = [touches anyObject]; CGPoint location = [touch locationInNode:self.parent]; touchPos =location; } -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { touchOn=NO; } -(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { touchOn=NO; } -(void)update:(NSTimeInterval)dt { if (touchOn) { CGVector vector = CGVectorMake((touchPos.x-self.position.x)/dt, (touchPos.y-self.position.y)/dt); self.physicsBody.velocity=vector; } } 

Sous-class un noeud et fabrique une méthode appelée mise à jour qui reçoit les mises à jour de la scène avec le changement de time. Ajoutez également des methods tactiles et gardez une trace de la position tactile actuelle.

Je n'ai pas eu le time d'exécuter réellement ceci mais que diriez-vous de quelque chose comme ceci: ne vous embêtez pas à mettre un noeud X comme décrit ci-dessus, plutôt:

Dans touchesBegan, garder une trace de l'heure et la position du toucher

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [touches anyObject]; CGPoint location = [touch locationInNode:self]; //store location of first touch self.firstTouch = location; //get time self.startTouch = [NSDate date]; } 

Dans touchesMoved, vérifiez si vous avez touché l'un des nœuds. Si oui, déterminez l'angle et la vitesse en fonction des positions de début et de fin du toucher, puis appliquez la vélocité au nœud impacté.

 - (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [touches anyObject]; CGPoint location = [touch locationInNode:self]; SKNode *node = [self nodeAtPoint:location]; //if you've touched one of your nodes if ([node.name isEqualToSsortingng:@"whateverNode"]) { //work out time between touches NSTimeInterval timeBetween = [[NSDate date] timeIntervalSinceDate:self.startTouch]; //work out angle between touches (if you want to send the impacted node in that direction) float angle = atan2f (location.y - self.firstTouch.y, location.x - self.firstTouch.y) ; //apply to node CGFloat thrust = 0.01/timeBetween; CGPoint thrustVector = CGPointMake(thrust*cosf(angle), thrust*sinf(angle)); [node.physicsBody applyTorque:thrustVector]; } } 

Notez que le bit de physique à la fin pourrait être (complètement) incorrect.