2014-07-23 4 views
2

J'ai un certain nombre de nœuds individuels (tuiles) qui constituent l'arrière-plan de ma partie. Ils sont chacun 32x32p, et sont positionnés l'un à côté de l'autre pour former le sol/toit/obstacles. Je charge une carte à partir d'un fichier JSON et positionne les noeuds sur un calque d'arrière-plan/noeud en fonction du contenu du fichier JSON lorsque la scène est initialisée.SpriteKit - Les nœuds ajustent la position un petit peu

Cela fonctionne très bien, cependant, je rencontre quelques bugs lors du déplacement de la couche de fond/le moteur physique fait son truc. Certains nœuds se déplacent d'un point/pixel l'un de l'autre, créant ainsi un espace entre eux. Et comme l'arrière-plan est de couleur différente, cela a l'air vraiment mauvais. Le problème se produit principalement plus loin sur la carte (pas tout de suite), en même temps que j'applique des impulsions au joueur ou que le moteur de physique rebondit sur le joueur (ou similaire).

Voici une image qui illustre mon problème:

Illustrative image. Click to open in new tab (Click to open in separate tab)

Comme vous pouvez le voir, entre la o et d dans nœuds, il y a un écart (plus facilement visible dans l'image en taille réelle dans le lien). Il y a de nombreuses lacunes comme celles-ci survenant de temps en temps pendant le jeu, et elles n'apparaissent que pendant une fraction de seconde ou deux. Parfois, ils restent quand le joueur arrête de bouger. Je déplace le joueur dans le didSimulatePhysics en augmentant/diminuant son x-value. Puis enfin dans le didSimulatePhysics j'appelle cette méthode pour centrer le worldNode sur le joueur:

- (void)centerViewOn:(CGPoint)centerOn { 
    CGFloat x = Clamp(centerOn.x, self.size.width/2, _bgLayer.layerSize.width - self.size.width/2); 

    _worldNode.position = CGPointMake(-x, _worldNode.position.y); 
} 

Le worldNode contient à la fois le bgLayer qui contient tous les nœuds de fond individuels, et le joueur lui-même.

Quelle est la meilleure façon de résoudre ce problème? Une solution plausible pourrait être de faire chaque tuile 33x32p, de sorte qu'ils se chevauchent. Dans ce cas, vous ne verrez pas les lacunes se produire maintenant et puis. Mais je pense qu'il vaudrait mieux "tuer" le problème plutôt que de le cacher. Quelqu'un a-t-il de l'expérience dans l'élaboration de sa carte? Ou est-ce que quelqu'un a déjà connu les mêmes problèmes avant? Et si oui, comment l'avez-vous résolu?

Merci d'avance!

+4

meilleure façon est d'assurer les positions sont sur les limites des pixels, à savoir la position de cast int – LearnCocos2D

+0

@ LearnCocos2D comment pourrais-je faire cela? – Aleksander

+0

Haha, je l'ai maintenant. Merci beaucoup! Cela m'a embêté pour longtemps! – Aleksander

Répondre

1

C'est la coulée à la solution Int basée sur @ LearnCocos2D commentaire:

- (void)centerViewOn:(CGPoint)centerOn { 
    CGFloat x = Clamp(centerOn.x, self.size.width/2, _bgLayer.layerSize.width - self.size.width/2); 

    _worldNode.position = CGPointMake(Int(-x), Int(_worldNode.position.y)); 
} 
+0

Je l'ai compris il y a très longtemps, mais cela a effectivement résolu le problème :) – Aleksander

+0

Je sais, c'était pour les âmes perdues là-bas (: – oronbz

Questions connexes