ios - Swift 创建一个类来绘制瓦片 map 并将 map 添加到游戏场景

标签 ios sprite-kit swift

我创建了一个类,目前我正在尝试创建一个由 36 个彩色方 block 组成的瓦片 map ,这些方 block 是 SKSpriteNodes。我收到运行时错误,我认为问题是由于 SKSpriteNodes 没有正确添加到 SKNode。我是 SpriteKit 的新手,正在尝试用 Swift 编写它。

下面是我的 map 类(我知道它目前不是 Isometric)和我试图在其中使用它的 GameScene 类。

任何人都可以解释我哪里出错了,还有任何关于我是否以特别糟糕的方式做事的一般性评论将不胜感激。

class IsometricMap {

let map = SKNode()
let mapLayout = Array<Array<Int>>()
let numColumns: Int
let numRows: Int
let tileHeight: Int
let tileWidth:Int
let grassNode: SKSpriteNode
let wallNode: SKSpriteNode

init(mapLayout: Array<Array<Int>>,numColumns: Int, numRows: Int, tileHeight: Int, tileWidth: Int) {
    self.mapLayout = mapLayout
    self.numColumns = numColumns
    self.numRows = numRows
    self.tileHeight = tileHeight
    self.tileWidth = tileWidth
    self.grassNode = SKSpriteNode(color: UIColor.greenColor(), size: CGSizeMake(CGFloat(tileHeight), CGFloat(tileWidth)))
    self.wallNode = SKSpriteNode(color: UIColor.brownColor(), size: CGSizeMake(CGFloat(tileHeight), CGFloat(tileWidth)))
}

func drawMap() {
    var tileType: Int
    var columnCount = 0
    var rowCount = 0
    for column in mapLayout {
        for row in column {
            var xPos = columnCount * tileWidth
            var yPos = rowCount * tileHeight
            tileType = mapLayout[columnCount][rowCount]
            placeTile(tileType, xPos: CGFloat(xPos), yPos: CGFloat(yPos))
            ++rowCount
        }
        ++columnCount
    }
}

func placeTile(tileType: Int, xPos: CGFloat, yPos: CGFloat) {
    switch tileType{
    case 0:
        grassNode.position = CGPointMake(xPos, yPos)
        map.addChild(grassNode)
    case 1:
        wallNode.position = CGPointMake(xPos, yPos)
        map.addChild(wallNode)
    default:self
        println("Out of range error")
    }
}

class GameScene: SKScene {

let simpleMap = [[1, 1, 1, 1, 1, 1],
    [1, 0, 0, 0, 0, 1],
    [1, 0, 0, 0, 0, 1],
    [1, 0, 0, 0, 0, 1],
    [1, 0, 0, 0, 0, 1],
    [1, 1, 1, 1, 1, 1]]

override func didMoveToView(view: SKView) {
    /* Setup your scene here */
    let myLabel = SKLabelNode(fontNamed:"Chalkduster")
    myLabel.text = "Hello, World!";
    myLabel.fontSize = 65;
    myLabel.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame));

    let starterMap = IsometricMap(mapLayout: simpleMap, numColumns: 6, numRows: 6, tileHeight: 50, tileWidth: 50)
    starterMap.drawMap()
    self.addChild(starterMap.map)

    //self.addChild(myLabel)
}

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
    /* Called when a touch begins */
}

override func update(currentTime: CFTimeInterval) {
    /* Called before each frame is rendered */
}

最佳答案

据我所知,你不断地改变 grassNodewallNode 的位置,然后将其重新添加到 map节点。如果我正确理解了您的意图,您希望为每个 placeTile 重新创建一个 grass- 或 wallnode 并每次添加该(新创建的)节点。

我还会从 SKNode 继承 IsometricMap,我认为不需要额外的 map 变量。
期望类的用户调用 drawMap 使类处于一致状态也感觉很奇怪,但是没有足够的上下文来建议什么是最好的选择(我的第一个想法是把它init 方法中的功能)

关于ios - Swift 创建一个类来绘制瓦片 map 并将 map 添加到游戏场景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24140146/

相关文章:

ios - 如何在我的 iOS 应用程序中每 n 分钟更新一次后台位置?

ios - NSInvalidArgumentException',原因 : 'Resource count cannot be found in the main bundle'

swift - SpriteKit (Swift 3) 中的延迟功能不起作用

Swift SKShapeNode 不接受初始化程序

iOS - 更改 Root View Controller 时获取黑色 View

ios - 如果在 NSPredicate 中使用 OR,则无法成功过滤结果

ios - 你能以编程方式修改 UICollectionView的scrollDirection吗?

swift - 访问其他函数中本地定义的变量 - Swift

ios - NumberFormatter() 不强制小数位

Swift:从数据中提取 Int16 和 Int8