Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/117.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift创建一个类来绘制平铺贴图并将贴图添加到游戏场景中_Ios_Sprite Kit_Swift - Fatal编程技术网

Ios Swift创建一个类来绘制平铺贴图并将贴图添加到游戏场景中

Ios Swift创建一个类来绘制平铺贴图并将贴图添加到游戏场景中,ios,sprite-kit,swift,Ios,Sprite Kit,Swift,我已经创建了一个类,在这个类中,我正在尝试创建一个由36个彩色方块组成的平铺地图,这些方块是SKSpriteNodes。我收到一个运行时错误,我认为问题是由于没有将SKSpritEndodes正确添加到SKNode。我是SpriteKit的新手,尝试用Swift写这篇文章 下面是我的地图类(我知道它目前不是等轴测的)和我尝试使用它的游戏场景类 如果有人能解释一下我错在哪里,如果能对我是否做得特别糟糕给出一般性的评论,我将不胜感激 class IsometricMap { let map = S

我已经创建了一个类,在这个类中,我正在尝试创建一个由36个彩色方块组成的平铺地图,这些方块是SKSpriteNodes。我收到一个运行时错误,我认为问题是由于没有将SKSpritEndodes正确添加到SKNode。我是SpriteKit的新手,尝试用Swift写这篇文章

下面是我的地图类(我知道它目前不是等轴测的)和我尝试使用它的游戏场景类

如果有人能解释一下我错在哪里,如果能对我是否做得特别糟糕给出一般性的评论,我将不胜感激

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

}

据我所知,您正在不断更改
grassNode
wallNode
的位置,然后将其重新添加到
地图
节点。如果我正确理解了您的意图,您希望为每个
placeTile
重新创建一个草地或墙节点,并每次添加该(新创建的)节点

我还将从
SKNode
继承
IsometricMap
,我认为不需要额外的
map
变量。
期望类的用户调用
drawMap
以使类处于一致状态也让人感到奇怪,但是没有足够的上下文来建议什么是最好的替代方法(我的第一个想法是将该功能放在init方法中)

,这完全有意义。(Duh..对我来说)将尝试重写一些东西。同样在drawMap()中,我必须将rowCount放在第一个循环中。
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 */
}