8
votes

Traitement des collisions de collision (Spritekit 7.1)

J'utilise la propriété xscale de Sknode pour retourner mes sprites horizontalement. Maintenant, après la mise à jour de iOS à la version 7.1, la bascule horizontale provoque que mes objets s'enfoncent à l'intérieur du sol. (Voir Animation ci-dessous). Le problème ne se produit qu'avec la propriété xscale. Les flancs verticaux fonctionnent bien.

// Init
{
    SKSpriteNode* ground = [SKSpriteNode spriteNodeWithColor:[UIColor blackColor] size:CGSizeMake(winSize.width, 150)];
    ground.position = CGPointMake(winSize.width/2, ground.size.height/2);
    ground.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:ground.size center:CGPointZero];
    ground.physicsBody.dynamic = NO;
    ground.physicsBody.categoryBitMask = 0x01;
    ground.physicsBody.collisionBitMask = 0x02;
    ground.physicsBody.contactTestBitMask = 0x02;
    [self.world addChild:ground];

    SKSpriteNode* turtle = [SKSpriteNode spriteNodeWithImageNamed:@"turtle.png"];
    turtle.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:turtle.size.width/2];
    turtle.physicsBody.categoryBitMask = 0x02;
    turtle.physicsBody.collisionBitMask = 0x01;
    turtle.physicsBody.contactTestBitMask = 0x01;
    turtle.position = CGPointMake(winSize.width/2, winSize.height/2);
    [self.world addChild:turtle];
    self.turtle = turtle;
}

// Somewhere else
{
    self.turtle.xScale *= -1;
}


5 commentaires

Qu'est-ce que vous utilisez pour prendre des captures d'écran GIF de votre application?


@Johnriselvato J'utilise licode, c'est génial pour créer des gif d'animation de gameplay.


Tu es génial, merci mate.


J'ai un très grand jeu dans le développement qui a fonctionné parfaitement sur iOS 7. Mais sur 7.1, j'ouvre ce même problème, y compris les rappels de collision qui ne fonctionnent pas, uniquement lorsque le xscale est négatif. Ce qui est étrange, c'est que parfois la physique fonctionne un peu puis échoue. C'est un bug majeur et je suis surpris que cela réussisse. Va devoir essayer ce contournement de conteneur pour le moment.


Vient de passer un après-midi pour comprendre que le problème de collision f ** ING. Je suis content de savoir que c'est un bug Sprantikit.


3 Réponses :


12
votes

Je suis convaincu que c'est un bug de Spritekit.

Quoi qu'il en soit, voici une solution pour le problème (en réalité, c'est plus une solution de contournement qu'une véritable solution mais ...): envelopper le sprite Dans un nœud de conteneur. strong> aussi, le nœud de conteneur contient le corps de physique pendant que le nœud enfant est simplement un nœud graphique. De cette façon, vous pouvez retourner en toute sécurité le sprite en utilisant xscale sans affecter la physique du nœud. P>

// Init
{
    SKSpriteNode* turtleSprite = [SKSpriteNode spriteNodeWithImageNamed:@"turtle.png"];
    self.turtleSprite = turtleSprite;

    SKNode* turtleWrapper = [SKNode node]; 
    turtleWrapper.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:turtleSprite.size.width/2];
    turtleWrapper.physicsBody.categoryBitMask = 2;
    turtleWrapper.physicsBody.collisionBitMask = 1;
    turtleWrapper.physicsBody.contactTestBitMask = 1;

    [turtleWrapper addChild:turtleSprite];
    [self.world addChild:turtleWrapper];
}

// Elsewhere
{
    self.turtleSprite.xScale *= -1;
}


2 commentaires

Une solution de contournement est en effet une solution, tout simplement pas la solution idéale.


Voici un lien où cela est également confirmé. DIGITALENEAVES.COM/BLOG/2014/03/...



6
votes

J'ai rencontré ce problème il y a quelques jours. Je voulais inverser le sprite basé sur son mouvement (à droite ou à gauche) et je constatais que le réglage XSCALE désactive toutes les collisions / contacts.

Cependant, j'ai utilisé cette ligne chaque fois que je fixe la propriété Xscale et tout est retourné à la normale. < / p> xxx


2 commentaires

Solution simple et efficace. Je ne comprends pas comment réaffecter le même pointeur de cette question est résolu, mais cela fonctionne. Je fais des recherches et je remarque que la collision (après avoir renversé le sprite) continue de fonctionner, mais elle est toujours détectée de quelques distances ci-dessous de l'endroit où elle devrait être ... c'est comme si le corps de physique du sprite retourné devient plus petit ...


@Zeemoon intéressant. En fait, j'ai rencontré un problème similaire l'autre jour, mais dans mes collisions de cas, fonctionnent complètement aléatoires lors de l'utilisation de l'échelle. Parfois, ils travaillent comme ils le devraient, mais d'autres fois, ils sont complètement ou semi-cassés. J'ai réalisé que la définition de l'échelle sur les nœuds est la question, mais votre suggestion ne semble pas aider dans mon cas. J'apprécierais que si vous pouviez avoir un look: . Merci!



0
votes

solution alternative

dans mon cas i Généralement Sksprittenode de sous-classe Pour représenter des nœuds dans ma scène, puis encapsuler leur comportement (animation et mouvement) dans la sous-classe. La solution Sprite wrap dans le nœud de conteneur ne fonctionne pas dans mon cas car j'ai des actions qui animent la texture des sprites et déplacent également le sprite en séquence.

Par exemple: xxx

Solution de contournement

Dans mon cas, j'ai résolu ceci en ajoutant ces méthodes à ma classe "Player": < Pré> xxx

puis remplacez les méthodes Skscene: xxx

Ceci fonctionne car le nœud bascule est désactivé juste avant que la physique ne soit simulée pour la scène. Le nœud Flip est ensuite appliqué juste avant que le cadre ne soit rendu.


0 commentaires