HTML5   发布时间:2022-04-27  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了ios – 使用SpriteKit和Swift的PhysicsBody是零大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在构建一个SpriteKit游戏,我正在从多维数组中加载一个级别. loadlevel函数第一次工作.如果我在physicsBody赋值之上执行physicsBody的println(在physicBody初始化之后),它确实会失败.当我用removeChildrenInArray删除所有的tile时,第二次运行load level时会抛出一个错误,说明致命的错误:在解包一个Optional时意外发现nil,它指向下面println正下方的行.而且println表明它是物理体,它是零.在我看来,没有理由新的初始化PhysicsBody应该是零. println打印physicsBody nil.我不知道为什么physicsBody会是零.我只是尝试通过删除所有块节点并根据级别映射在原始位置添加新节点来重置级别.

func loadLevel() {
    var levels = Levels().data
    var frameSize = view.frame.size
    var thisLevel = levels[currentLevel]
    println("running load level")
    for (rowIndex,row) in enumerate(thisLevel) {
        for (colIndex,col) in enumerate(row) {
            if col == 4 {
                conTinue
            }
            println("COL: \(col)")
            var tile = SKSpriteNode(texture: SKTexture(imagenamed: "brick_\(tileMap[col])"))
            tile.name = "tile_\(rowIndeX)_\(colIndeX)"
            tile.position.y = frameSize.height - (tile.size.height * CGFloat(rowIndeX)) - (tile.size.height/2)
            tile.position.x = tile.size.width  * CGFloat(colIndeX) + (tile.size.width/2)
            var physicsBody = SKPhysicsBody(rectangLeofSize: tile.sizE)
            tile.physicsBody = physicsBody
            tile.physicsBody.affectedByGravity = false
            tile.physicsBody.categoryBitMask = ColliderType.block.toRaw()
            tile.physicsBody.contactTESTBitMask = ColliderType.ball.toRaw()
            tile.physicsBody.collisionBitMask = ColliderType.ball.toRaw()
            scene.addChild(tilE)
            tileCount++
        }
    }
}

这是我的ColliderType

enum ColliderType:UInt32 {
    case Paddle = 1
    case Block = 2
    case Wall = 3
    case Ball = 4
}

这是我的重置功能内容

func reset() {
    tileCount = 0
    var removeTiles = [SKSpriteNode]()
    // remove all the tiles
    for child in scene.children {
        var a_tile = child as SKSpriteNode
        if a_tile.name.hasPrefix("tile_") {
            a_tile.removeFromParent()
            a_tile.name = ""
            removeTiles.append(a_tilE)
        }
    }
    removeTiles.removeAll(keepCapacity: falsE)
    ball!.position = CGPoint(x: 200,y: 200)
    ballVel = CGPoint(x: 0,y: -5)
    currentLeveL++
    loadLevel()
    lost = false
    won = false
}

这是我的关卡结构

struct Tile {
    let map = ["blue","green","purple","red"]
}

struct Levels {
    let data = [
        [
            [4,4,4],[4,1,2,3,4]
        ],[
            [0,0],[1,1],[2,2],[3,3]
        ]
    ]
}

如果这是Swift中的一个错误,我试图找到一个方法,@R_770_9447@让这个工作.

解决方法

看起来SKPhysicsBody是以空白大小实例化的.尝试使用显式大小创建物理主体对象,如下所示:

var physicsBody = SKPhysicsBody(rectangLeofSize: CGSizeMake(100,100))

或者,您可以直接在SKSpriteNode上设置大小,或者使用其构造函数之一,该构造函数采用CGSize构造,如initWithTexture:color:size:

大佬总结

以上是大佬教程为你收集整理的ios – 使用SpriteKit和Swift的PhysicsBody是零全部内容,希望文章能够帮你解决ios – 使用SpriteKit和Swift的PhysicsBody是零所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。