2017-07-18 5 views
3

Donc, dans mon projet, j'essaie fondamentalement de créer un labyrinthe généré aléatoirement avec des entrées et des sorties aléatoires. J'ai trois classes (une classe Maze, une classe GameScene et une classe Grid) dans la mesure où j'ai réussi à coder un labyrinthe généré aléatoirement.Comment appeler une image-objet de couleur à une certaine position (Swift 3)

Cependant, mon problème est que la classe Maze (qui est l'endroit où le code de génération aléatoire a lieu) contient uniquement les données pour le labyrinthe, mais pas de connexion actuelle aux graphiques. Donc, quand je cours mon application, un écran vide apparaît. Ce que j'essaie (mais je ne sais pas trop comment faire) est de placer une ligne (alias un sprite de couleur noire en forme de ligne) à l'endroit où se trouve le mur du labyrinthe. Donc, la façon dont fonctionne mon labyrinthe est qu'il s'agit d'une grille (tableau) dans laquelle les «murs» de chaque cellule de la matrice (haut, bas, gauche ou droite) sont définis comme vrai ou faux. Si la paroi cellulaire est fausse, alors il n'y a pas de mur de labyrinthe là; mais si c'est vrai, il y a un mur de labyrinthe là. L'état de chaque mur étant généré de manière aléatoire est ce qui crée le labyrinthe.

j'ai pu connecter le code à l'image-objet de couleur nommée "mazeWall" au sein de la classe GameScene (en utilisant ce code :)

var mazeWall: SKNode! 

[...]

mazeWall = self.childNode(withName: "mazeWall") 

En outre, J'ai pu accéder aux données de la classe Maze dans la classe GameScene en utilisant ce code pour créer un objet de type classe Maze:

var maze = Maze() 

Cependant, je ne sais plus comment appeler le sprite de couleur à la position des vrais murs sur la grille.

Ceci est le code que je tente de faire dans les données de classe GameScene classe pour accéder Maze et à boucle à travers les cellules du labyrinthe et vérifier les murs sont vraies:

class GameScene: SKScene { 
var mazeWall: SKNode! 
var maze = Maze() 
var backgroundColorCustom = UIColor(red: 255, green: 244, blue: 231, 
            alpha: 4.0) 



override func didMove(to view: SKView) { 
    /* Set reference to obstacle layer node */ 
    mazeWall = self.childNode(withName: "mazeWall") 

    //going through each cell and checking if it is true in order to place a wall 
    for x in 0..<self.maze.gridSize{ 
     for y in 0..<self.maze.gridSize{ 
      if (self.maze.down[x,y]) == true { 
       //code 
      } 

      if (self.maze.up[x,y]) == true { 
       //code 
      } 

      if (self.maze.left[x,y]) == true{ 
       //code 
      } 
      if (self.maze.right[x,y]) == true { 
       //code 
      } 

     }//end of y forloop 
    }//end of x for loop 

}//end of func didMove 

}//end of GameScene class 

S'il vous plaît laissez-moi savoir comment je peux appelez le sprite couleur mazeWall à la position des "vrais" murs de labyrinthe dans le labyrinthe. Aussi laissez-moi savoir si vous avez besoin de moi pour inclure plus de mon code (ma classe de labyrinthe, la classe de la grille, la génération de labyrinthe, etc) ...

Merci d'avance!

+0

Si vous pouviez inclure un lien vers un github ou une dropbox de votre projet exemple, cela serait utile! – Fluidity

+0

Je commencerais avec votre mode d'échelle gameScene réglé sur .aspectFit. et définissez la taille de la scène dans votre fichier SKS à la taille de votre carte. De cette façon, 1 point (pixel) = 1 position de la carte. Créez ensuite une image-objet de couleur de 1 point et définissez-la sur votre position de carte. – Knight0fDragon

Répondre

1

Ce que vous devez faire est d'utiliser SKTexture pour mettre en cache le même mur que vous utiliserez pour tous les SKSpriteNode créés.

Donc, vous chargez votre actif mural dans un let wallTexture = SKTexture(imageNamed: <NameOfYourWall>) puis dans chacun de vos 4 si, vous créez un SKSpriteNode(texture: wallTexture).

Maintenant vient le calcul où vous devez définir la position de chacun de ces SKSpriteNode.

Disons que vous voulez un labyrinthe qui correspond à l'écran, de sorte que vous devez obtenir la taille maximale d'une tuile faisant ce code pseudo:

let maxWidth = SCREEN_SIZE/maze.gridSize 
let maxHeight = SCREEN_SIZE/maze.gridSize 
let tileSize = max(maxWidth, maxHeight) 

Et vous pouvez enfin placer les murs dans votre logique. Ne pas oublier que par défaut, le Anchorpoint d'un SKSpriteKit est son centre et que la géométrie est comme ceci:

^ y 
| 
|-->x 

`

if self.maze.down[x,y] == true { 
    let wall = SKSpriteNode(texture: wallTexture) 
    let centerTile = CGPoint(x: (x * tileSize + tileSize/2), y: (y * tileSize + tileSize/2)) 
    let xPos = centerTile.x - wall.width /2 
    let yPos = centerTile.y - tileSize/2 + wall.height 
    wall.position = CGPoint(x: xPos, y: yPos) 
    yourScene.addChild(wall) 
} 

Vous aurez probablement à faire tourner le mur pour la laisser et la bonne taille (à moins que votre texture originale ne soit déjà verticale) ou vous devez juste créer un autre actif avec une version verticale et charger ce nouvel actif dans une autre texture. Il suffit de modifier les maths et vous aurez terminé.

1

Vous pourriez envisager d'ajouter une fonction qui convertirait les x, y de votre point de grille sur le labyrinthe en un CGPoint où le mur de labyrinthe devrait être placé. Une fois que vous obtenez le cgpoint pour les x, y d'un point de la grille, il suffit de créer un nouveau sprite avec la texture de mur et de l'ajouter comme un enfant à cette position cgpoint.

Définissez d'abord, en tant que constante, la taille de chaque point de la grille. Par la suite, vous devrez également faire référence à cette constante en dehors de la fonction ci-dessous (par exemple, lors de la définition de la taille de l'image-objet de labyrinthe), lui donner ainsi une portée plus élevée (par exemple en tant que propriété de votre scène).

let sizeOfEachGridPoint = CGSize(width: 32, height: 32) // 32 just an example 

Pour écrire la fonction requise, j'ai fait quelques suppositions; vous pouvez facilement adapter cette fonction si les hypothèses ne sont pas correctes.

  • x, y == (0,0) est le point de la grille en bas à gauche de votre labyrinthe
  • le coin inférieur gauche du point de la grille en bas à gauche sera à CGPoint.zero.
  • Les points d'ancrage du mur sprites seront 0.5,0.5

Sur la base de ces hypothèses, vous pourriez avoir:

func cgPointForGridPoint(x: Int, y: Int) -> CGPoint  
{ 
// Note that we are also adding half of the width and half of the 
// height since the anchor point of the grid point is at its center 

    let xOfPoint = CGFloat(x) * sizeOfEachGridPoint.width 
        + sizeOfEachGridPoint.width/2 

    let yOfPoint = CGFloat(y) * sizeOfEachGridPoint.height 
        + sizeOfEachGridPoint.height/2 

    return CGPoint(x: xOfPoint, y: yOfPoint) 
} 

Hope this helps!