2017-05-31 4 views
0

Je pose cette question parce que je n'ai trouvé aucune solution pour ce genre de problèmes. En fait, le support de la carte Hex n'est pas très populaire.Spritekit Hexagonal map: détection de carreaux en fin SKAction.

Je fais un jeu avec le framework SpriteKit. J'utilise SktileMapNode avec une carte hexagonale, avec 1 ensemble de 4 groupes de tuiles. Le playernode se déplace sur chaque tuile, ce que je veux dire quand il se déplace sur des cases spécifiques, un événement peut être déclenché (print, function, Sktransition) mais pour le moment je suis bloqué sur la détection de ces tuiles.

Je configure les données utilisateur (en tant que booléen) et les applique dans le code, mais rien ne s'est produit, même avec un événement tactile sur une tuile.

extension GameScene { 



func move(theXAmount:CGFloat , theYAmount:CGFloat, theAnimation:String) { 


    let wait:SKAction = SKAction.wait(forDuration: 0.05) 

    let walkAnimation:SKAction = SKAction(named: theAnimation, duration: moveSpeed)! 

    let moveAction:SKAction = SKAction.moveBy(x: theXAmount, y: theYAmount, duration: moveSpeed) 

    let group:SKAction = SKAction.group([ walkAnimation, moveAction ]) 

    let finish:SKAction = SKAction.run { 



     let position = self.thePlayer.position 

     let column = self.galaxieMapnode.tileColumnIndex(fromPosition: position) 
     let row = self.galaxieMapnode.tileRowIndex(fromPosition: position) 


     if let tile:SKTileDefinition = self.galaxieMapnode.tileDefinition(atColumn: column, row: row) { 


      if let tileBoolData = tile.userData?["wormholeTile"] as? Bool { 

       if (tileBoolData == true) { 

        print("Wormhole touched") 


       } 



      } 




     } else { 


      print("different tile") 


     } 


    } 

Seule la sortie "Dalles différentes" est déclenchée.

Toute aide est la bienvenue.

Lien par exemple d'image: the thing I want

Répondre

0

Je pense que vous voulez exécuter votre bloc d'arrivée après les autres actions ont terminé? Vous pouvez le faire comme une séquence.

var sequence = [SKAction]() 
let action = SKAction.move(to: location, duration: 1) 
let completionHandler = SKAction.run({ 
    // Check tile info here 
}) 

sequence += [action, completionHandler] 

self.player.run(SKAction.sequence(sequence)) 

Généralement dans une carte hexagonale vous se déplacerait le joueur à une tuile adjacente et vérifiez les tuiles attributs, puis passez à la prochaine action de mouvement. Cela nécessite la fonctionnalité de graphique et de pathfinding de GameplayKit.

+0

J'ai écrit quelques [articles] (https://markbrownsword.com) et [exemples de projets] (https://github.com/markbrownsword?tab=repositories) sur les cartes de tuiles hexagonales dans SpriteKit. –

+0

Merci Mark, je regarde ce Gameplaykit. Merci pour les conseils. Puis-je revenir à vous pour une autre question? –

+0

Désolé edit: je reviens, il semble que je dois mettre en œuvre beaucoup de choses pour faire le graphique et la fonctionnalité de pathfinding et il semble que je dois reconstruire beaucoup de chose dans de nombreux fichiers que j'ai. GamePlay kit est le seul moyen de la chose que je veux faire? –