首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将游戏级对象存储在Swift数组中?

如何将游戏级对象存储在Swift数组中?
EN

Stack Overflow用户
提问于 2015-08-16 11:46:51
回答 1查看 279关注 0票数 2

我想为我的游戏创建一个包含游戏级别对象信息的数组。但是我仍然坚持用这个信息创建一个适当的数组,以便稍后在循环中运行这个数组,在加载这个级别时放置所有的游戏对象。

这是我的阵列:

代码语言:javascript
运行
复制
let level1 =
[
    (
        id: 1,
        position: CGPointMake(0.5, 0.8),
        impulse: CGVectorMake(-40, 0)
    )
]
let level2 =
[
    (
        id: 1,
        position: CGPointMake(0.5, 0.8),
        impulse: CGVectorMake(-40, 0)
    ),
    (
        id: 2,
        position: CGPointMake(0.5, 0.8),
        impulse: CGVectorMake(-40, 0)
    )
]

这是我的负载级功能:

代码语言:javascript
运行
复制
func loadLevel(levelNumber: Int = 1) {
    var level = [[String:AnyObject]]()

    switch(levelNumber) {
    case 1:
        level = level1 //Cannot assign a value of type '[(id: Int, position: CGPoint, impulse: CGVector)]' to a value of type '[([String: AnyObject])]'
    case 2:
        level = level2 //Cannot assign a value of type '[(id: Int, position: CGPoint, impulse: CGVector)]' to a value of type '[([String: AnyObject])]'
    case 3:
        level = level3 //Cannot assign a value of type '[(id: Int, position: CGPoint, impulse: CGVector)]' to a value of type '[([String: AnyObject])]'
    default:
        level = level1 //Cannot assign a value of type '[(id: Int, position: CGPoint, impulse: CGVector)]' to a value of type '[([String: AnyObject])]'
    }

    for s in level {
        var newShip = Ship(ship: ships[s.id! - 1], position: s.position)
        self.addChild(newShip)
        ship.physicsBody?.applyImpulse(s.impulse)
    }
}

我甚至不知道这是否是保存/编辑级别对象信息的好方法。

当我使用:

代码语言:javascript
运行
复制
var level = [id:Int, position:CGPoint, impulse:CGVector]() //Use of unresolved identifier 'id'
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-16 12:01:28

level变量的类型错误。这不是一堆字典。它是一个名为元组的数组。尝试像这样声明level

代码语言:javascript
运行
复制
var level:[(id: Int, position: CGPoint, impulse: CGVector)]

如果将所有级别放入一个大数组中,则可以使用数组索引访问每个级别,而不需要一个大开关语句。我建议在声明数组时告诉Swift数组的类型:

代码语言:javascript
运行
复制
let levels: [[(id: Int, position: CGPoint, impulse: CGVector)]] = [
    // level 1
    [
        (
            id: 1,
            position: CGPointMake(0.5, 0.8),
            impulse: CGVectorMake(-40, 0)
        )
    ],
    // level 2
    [
        (
            id: 1,
            position: CGPointMake(0.5, 0.8),
            impulse: CGVectorMake(-40, 0)
        ),
        (
            id: 2,
            position: CGPointMake(0.5, 0.8),
            impulse: CGVectorMake(-40, 0)
        )
    ]
]

func loadLevel(levelNumber: Int = 1) {
    // Subtract 1 since array indices start at 0.  This will crash with Array
    // index out of range if the level doesn't exist.  Take proper precautions.
    let level = levels[levelNumber - 1]

    for s in level {
        var newShip = Ship(ship: ships[s.id - 1], position: s.position)
        self.addChild(newShip)
        ship.physicsBody?.applyImpulse(s.impulse)
    }
}

或者,您可以使levels成为一个级别编号为key的字典。

代码语言:javascript
运行
复制
let levels: [Int:[(id: Int, position: CGPoint, impulse: CGVector)]] = [
    // level 1
    1: [
        (
            id: 1,
            position: CGPointMake(0.5, 0.8),
            impulse: CGVectorMake(-40, 0)
        )
    ],
    // level 2
    2: [
        (
            id: 1,
            position: CGPointMake(0.5, 0.8),
            impulse: CGVectorMake(-40, 0)
        ),
        (
            id: 2,
            position: CGPointMake(0.5, 0.8),
            impulse: CGVectorMake(-40, 0)
        )
    ]
]

func loadLevel(levelNumber: Int = 1) {
    // Unwrap the level information.  This will crash if it isn't a valid
    // level number.  Take proper precautions.
    let level = levels[levelNumber]!

    for s in level {
        var newShip = Ship(ship: ships[s.id - 1], position: s.position)
        self.addChild(newShip)
        ship.physicsBody?.applyImpulse(s.impulse)
    }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32034729

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档