如何将颜色精灵调用到某个位置(Swift 3)
How to call a color sprite to a certain position (Swift 3)
所以在我的项目中,我基本上是在尝试制作一个随机生成的迷宫,带有随机入口和出口。我有三个 classes(一个 Maze class、一个 GameScene class 和一个 Grid Class),到目前为止我已经成功地编写了一个随机生成的迷宫。
但是我的问题是迷宫 class(这是随机生成代码发生的地方)纯粹包含迷宫的数据,但没有与图形的当前连接。所以当我 运行 我的应用程序时,出现一个空白屏幕。
我正在尝试(但不确定如何)做的基本上是在迷宫墙所在的位置放置一条线(又名黑色精灵,形状为一条线)。
因此,我的迷宫的工作方式是它是一个网格(数组),其中每个数组单元格的 "walls"(上、下、左或右)被定义为真或假。如果细胞壁是假的,那么那里就没有迷宫墙;但如果这是真的,那么那里有一堵迷宫墙。随机生成的每面墙的状态就是创建迷宫的原因。
我能够将代码连接到 GameScene class 中名为 "mazeWall" 的颜色精灵(使用此代码:)
var mazeWall: SKNode!
[...]
mazeWall = self.childNode(withName: "mazeWall")
此外,我能够使用此代码在 GameScene class 中访问迷宫 class 的数据,以创建迷宫 class 类型的对象:
var maze = Maze()
但是我现在不确定如何将颜色精灵调用到网格上真实墙壁的位置。
这是我试图在 GameScene Class 中使用的代码,用于访问迷宫 class' 数据并循环遍历迷宫的单元格并检查哪些墙是真实的:
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
请告诉我如何将 mazeWall 颜色精灵调用到迷宫内 "true" 迷宫墙的位置。
如果您需要我包含更多代码(我的迷宫 class、网格 class、迷宫生成等)也请告诉我...
提前致谢!
您可以考虑添加一个函数,将迷宫上网格点的 x,y 转换为应该放置迷宫墙的 CGPoint。一旦获得了网格点的 x,y 的 cgpoint,只需创建一个带有墙纹理的新精灵并将其作为子元素添加到该 cgpoint 位置即可。
首先将每个网格点的大小定义为常数。您很可能稍后还需要在下面的函数之外引用此常量(例如,当设置迷宫墙精灵的大小时),因此给它一些更高的范围(例如作为场景的 属性) .
let sizeOfEachGridPoint = CGSize(width: 32, height: 32) // 32 just an example
为了编写所需的函数,我做了一些假设;如果假设不正确,您可以轻松调整此功能。
- x,y == (0,0) 是你的迷宫左下角的网格点
- 左下网格点的左下角将在 CGPoint.zero。
- 墙壁精灵的锚点将为 0.5,0.5
基于这些假设,您可以:
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)
}
希望对您有所帮助!
您应该做的是使用 SKTexture
缓存您将用于所有 SKSpriteNode
创建的同一面墙。
因此,您将墙资产加载到 let wallTexture = SKTexture(imageNamed: <NameOfYourWall>)
中,然后在 4 个 if 中的每一个中创建一个 SKSpriteNode(texture: wallTexture)
。
现在是数学问题,您必须设置每个 SKSpriteNode 的位置。
假设您想要一个适合屏幕的迷宫,那么您需要通过执行此伪代码来获得图块的最大尺寸:
let maxWidth = SCREEN_SIZE / maze.gridSize
let maxHeight = SCREEN_SIZE / maze.gridSize
let tileSize = max(maxWidth, maxHeight)
你终于可以在你的逻辑中放置墙壁了。
不要忘记默认情况下 SKSpriteKit 的锚点是它的中心,几何形状是这样的:
^ 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)
}
您可能需要旋转墙壁以达到合适的大小(除非您的原始纹理已经是垂直的),或者您只需要创建另一个具有垂直版本的资产并将这个新资产加载到另一个纹理中。
只要稍微调整一下数学就可以了。
所以在我的项目中,我基本上是在尝试制作一个随机生成的迷宫,带有随机入口和出口。我有三个 classes(一个 Maze class、一个 GameScene class 和一个 Grid Class),到目前为止我已经成功地编写了一个随机生成的迷宫。
但是我的问题是迷宫 class(这是随机生成代码发生的地方)纯粹包含迷宫的数据,但没有与图形的当前连接。所以当我 运行 我的应用程序时,出现一个空白屏幕。
我正在尝试(但不确定如何)做的基本上是在迷宫墙所在的位置放置一条线(又名黑色精灵,形状为一条线)。
因此,我的迷宫的工作方式是它是一个网格(数组),其中每个数组单元格的 "walls"(上、下、左或右)被定义为真或假。如果细胞壁是假的,那么那里就没有迷宫墙;但如果这是真的,那么那里有一堵迷宫墙。随机生成的每面墙的状态就是创建迷宫的原因。
我能够将代码连接到 GameScene class 中名为 "mazeWall" 的颜色精灵(使用此代码:)
var mazeWall: SKNode!
[...]
mazeWall = self.childNode(withName: "mazeWall")
此外,我能够使用此代码在 GameScene class 中访问迷宫 class 的数据,以创建迷宫 class 类型的对象:
var maze = Maze()
但是我现在不确定如何将颜色精灵调用到网格上真实墙壁的位置。
这是我试图在 GameScene Class 中使用的代码,用于访问迷宫 class' 数据并循环遍历迷宫的单元格并检查哪些墙是真实的:
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
请告诉我如何将 mazeWall 颜色精灵调用到迷宫内 "true" 迷宫墙的位置。 如果您需要我包含更多代码(我的迷宫 class、网格 class、迷宫生成等)也请告诉我...
提前致谢!
您可以考虑添加一个函数,将迷宫上网格点的 x,y 转换为应该放置迷宫墙的 CGPoint。一旦获得了网格点的 x,y 的 cgpoint,只需创建一个带有墙纹理的新精灵并将其作为子元素添加到该 cgpoint 位置即可。
首先将每个网格点的大小定义为常数。您很可能稍后还需要在下面的函数之外引用此常量(例如,当设置迷宫墙精灵的大小时),因此给它一些更高的范围(例如作为场景的 属性) .
let sizeOfEachGridPoint = CGSize(width: 32, height: 32) // 32 just an example
为了编写所需的函数,我做了一些假设;如果假设不正确,您可以轻松调整此功能。
- x,y == (0,0) 是你的迷宫左下角的网格点
- 左下网格点的左下角将在 CGPoint.zero。
- 墙壁精灵的锚点将为 0.5,0.5
基于这些假设,您可以:
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)
}
希望对您有所帮助!
您应该做的是使用 SKTexture
缓存您将用于所有 SKSpriteNode
创建的同一面墙。
因此,您将墙资产加载到 let wallTexture = SKTexture(imageNamed: <NameOfYourWall>)
中,然后在 4 个 if 中的每一个中创建一个 SKSpriteNode(texture: wallTexture)
。
现在是数学问题,您必须设置每个 SKSpriteNode 的位置。
假设您想要一个适合屏幕的迷宫,那么您需要通过执行此伪代码来获得图块的最大尺寸:
let maxWidth = SCREEN_SIZE / maze.gridSize
let maxHeight = SCREEN_SIZE / maze.gridSize
let tileSize = max(maxWidth, maxHeight)
你终于可以在你的逻辑中放置墙壁了。 不要忘记默认情况下 SKSpriteKit 的锚点是它的中心,几何形状是这样的:
^ 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)
}
您可能需要旋转墙壁以达到合适的大小(除非您的原始纹理已经是垂直的),或者您只需要创建另一个具有垂直版本的资产并将这个新资产加载到另一个纹理中。
只要稍微调整一下数学就可以了。