2017-07-18 1 views
3

In meinem Projekt versuche ich im Grunde, ein zufällig generiertes Labyrinth mit zufälligen Ein- und Ausgängen zu erstellen. Ich habe drei Klassen (eine Maze-Klasse, eine GameScene-Klasse und eine Grid-Klasse). Bislang konnte ich erfolgreich ein zufällig generiertes Labyrinth codieren.Wie man ein Farbsprite zu einer bestimmten Position ruft (Swift 3)

Mein Problem ist jedoch, dass die Maze-Klasse (wo der zufällige Generierungscode stattfindet) rein die Daten für das Labyrinth enthält, aber keine aktuelle Verbindung zu den Grafiken. Wenn ich meine App starte, erscheint ein leerer Bildschirm.

Was ich versuche (aber bin mir nicht sicher, wie) zu tun ist im Grunde eine Linie (aka eine schwarze Farbe Sprite in einer Linie geformt) an der Stelle, wo die Labyrinthwand ist.

So funktioniert mein Labyrinth, dass es ein Gitter (Array) ist, in dem die "Wände" jeder Zelle (oben, unten, links oder rechts) als wahr oder falsch definiert sind. Wenn die Zellwand falsch ist, dann gibt es dort keine Labyrinthwand; aber wenn es wahr ist, dann gibt es dort eine Labyrinthwand. Der Zustand jeder Wand, die zufällig erzeugt wird, erzeugt das Labyrinth.

Ich war in der Lage, den Code zu dem Farb Sprite namens "mazeWall" innerhalb der GameScene Klasse (mit diesem Code :)

var mazeWall: SKNode! 

[...]

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

Auch zu verbinden, Ich konnte mit diesem Code auf die Daten der Maze-Klasse innerhalb der GameScene-Klasse zugreifen, um ein Objekt der Maze-Klasse zu erstellen:

Ich bin mir jedoch nicht sicher, wie ich das Farbsprite an die Position der wahren Wände auf dem Gitter rufe.

Dies ist der Code, den ich in der GameScene Klasse zu haben versucht, auf Daten zuzugreifen Maze-Klasse und eine Schleife durch die Zellen des Labyrinths und überprüfen, welche Wände erfüllt sind:

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 

Bitte lassen Sie mich wissen, wie kann ich rufe das Labyrinth-Sprite an die Position der "wahren" Labyrinthwände innerhalb des Labyrinths. Auch lassen Sie mich wissen, wenn Sie mich brauchen, um mehr meines Codes (meine Labyrinthklasse, die Gitterklasse, Labyrinthgeneration, usw.) zu enthalten ...

Vielen Dank im Voraus!

+0

Wenn Sie einen Link zu einem Github oder Dropbox Ihres Beispielprojekts einfügen könnten, wäre das hilfreich! – Fluidity

+0

Ich würde mit Ihrem Spielmodus Scenesize auf .aspectFit eingestellt werden. und legen Sie die Szenengröße in Ihrer SKS-Datei auf die Größe Ihrer Karte fest. Auf diese Weise 1 Punkt (Pixel) = 1 Kartenposition. Dann erstelle ein Farb-Sprite von 1 Punkt und setze es an deiner Kartenposition – Knight0fDragon

Antwort

1

Was Sie tun sollten, ist SKTexture verwenden, um die gleiche Wand zu cachen, die Sie für alle SKSpriteNode erstellt verwenden werden.

So laden Sie Ihre Wand Asset in eine let wallTexture = SKTexture(imageNamed: <NameOfYourWall>) dann in jedem Ihrer 4 wenn, erstellen Sie eine SKSpriteNode(texture: wallTexture).

Jetzt kommt die Mathe, wo Sie die Position von jedem dieser SKSpriteNode setzen müssen.

Angenommen, Sie wollen ein Labyrinth, das den Bildschirm passt, so müssen Sie die maximale Größe einer Kachel Code tun, diese Pseudo zu bekommen:

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

Und Sie können schließlich die Wände in Ihrer Logik platzieren. Vergessen Sie nicht, dass die anchor eines SKSpriteKit standardmäßig sein Zentrum ist und dass die Geometrie ist wie folgt:

^ 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) 
} 

Sie müssen wahrscheinlich die Wand für die let drehen und richtige Größe (es sei denn, Ihre ursprüngliche Textur ist bereits vertikal) oder Sie müssen nur ein anderes Asset mit einer vertikalen Version erstellen und dieses neue Asset in eine andere Textur laden.

Machen Sie das Rechnen einfach und Sie werden es schaffen.

1

Sie könnten eine Funktion hinzufügen, die das x, y Ihres Rasterpunkts im Labyrinth in einen CGPoint umwandelt, in dem die Labyrinthwand platziert werden soll. Sobald Sie den cgpoint für das x, y eines Gitterpunkts erhalten haben, müssen Sie nur ein neues Sprite mit der Wandtextur erstellen und es an dieser Position als Kind hinzufügen.

Zuerst definieren Sie als Konstante, wie groß die Größe jedes Rasterpunkts sein sollte. Sie werden sich später wahrscheinlich auch auf diese Konstante außerhalb der unten stehenden Funktion beziehen müssen (z. B. wenn Sie die Größe des Labyrinthwand-Sprites einstellen), also geben Sie ihm einen höheren Bereich (z. B. als Eigenschaft Ihrer Szene).

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

Um die erforderliche Funktion zu schreiben, habe ich einige Annahmen gemacht; Sie könnten diese Funktion leicht anpassen, wenn die Annahmen nicht korrekt sind.

  • x, y == (0,0) ist der untere linke Gitterpunkt des Labyrinths
  • die linke untere Ecke des linken unteren Punktes Raster bei CGPoint.zero sein wird.
  • Die Ankerpunkte der Wand Sprites wird 0.5,0.5

basieren auf diesen Annahmen könnten Sie haben:

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) 
} 

hoffe, das hilft!

Verwandte Themen