Swift 如何一次存储多个属性?
我正在与Swift、Xcode 6和SpriteKit合作 我想制作一个游戏,其中一些精灵从屏幕顶部掉落,但每个精灵都有一个定义的速度、位置和激活时间。我有这个工作代码,但我真的不认为这是最优化的方法:Swift 如何一次存储多个属性?,swift,sprite-kit,initialization,Swift,Sprite Kit,Initialization,我正在与Swift、Xcode 6和SpriteKit合作 我想制作一个游戏,其中一些精灵从屏幕顶部掉落,但每个精灵都有一个定义的速度、位置和激活时间。我有这个工作代码,但我真的不认为这是最优化的方法: class obstacles: SKSpriteNode { var isOnScreen = false var type: Int = 0 var initTime: Int = 0 } var obstacle = [obstacles]() // obstac
class obstacles: SKSpriteNode
{
var isOnScreen = false
var type: Int = 0
var initTime: Int = 0
}
var obstacle = [obstacles]() // obstacle is an array of SKSpriteNode
// type : initTime : speed : position : xScale : yScale
var level1: [String] = ["0:120:3:0:1:1", "0:130:4:80:2:2","1:140:8:120:6:1","0:150:6:240:2:2"]
override func didMoveToView(view: SKView)
{
initObstacles()
}
func initObstacles()
{
for var x = 0; x < level1.count; x++ // for each obstacle
{
var index = 0
var type = String("")
var initTime = String("")
var speed = String("")
var position = String("")
var xScale = String("")
var yScale = String("")
var lastIndex = obstacle.count
for Character in level1[x] // we read each character one by one
{
if Character == ":" { index++ } // if it's a ":" we change the variable
else
{
switch index
{
case 0:
type += String(Character)
case 1:
initTime += String(Character)
case 2:
speed += String(Character)
case 3:
position += String(Character)
case 4:
xScale += String(Character)
case 5:
yScale += String(Character)
default:
break;
}
}
}
obstacle.append(obstacles(imageNamed: "Rectangle")) // we add an element to the array
obstacle[lastIndex].type = type.toInt()! // we init all the values
obstacle[lastIndex].initTime = initTime.toInt()!
obstacle[lastIndex].speed = CGFloat(speed.toInt()!)
obstacle[lastIndex].size.width = DEFAULT_OBSTACLE_SIZE * CGFloat(xScale.toInt()!)
obstacle[lastIndex].size.height = DEFAULT_OBSTACLE_SIZE * CGFloat(yScale.toInt()!)
obstacle[lastIndex].position = CGPointMake(CGFloat(position.toInt()!) - obstacle[lastIndex].size.width/2, CGRectGetMaxY(frame) + obstacle[lastIndex].size.height/2)
}
}
类障碍:SKSpriteNode
{
var isOnScreen=false
变量类型:Int=0
var initTime:Int=0
}
var障碍=[障碍]()//障碍是一个SKSpriteNode数组
//类型:initTime:speed:position:xScale:yScale
变量level1:[字符串]=[“0:120:3:0:1:1”,“0:130:4:80:2:2”,“1:140:8:120:6:1”,“0:150:6:240:2:2”]
覆盖func didMoveToView(视图:SKView)
{
初始障碍()
}
func init()
{
对于var x=0;x
你知道我如何做同样的事情,但更“干净”我建议创建一个
类或结构,保存障碍物的所有必要数据,并将你的类型从标准数字更改为枚举
,例如:
enum ObstacleType {
case Block, Tree, WhatEverObstaclesYouHave...
}
struct Obstacle {
var type: ObstacleType
var initializationTime: NSTimeInterval
var speed: Double
// and similarly for position, your scales and what you may need in future
}
并使用创建它们,例如
Obstacle(type: .Block, initializationTime: 0, speed: 12.0, ...)
优点(显然)是解析字符串不再有问题(不再有字符串),并且可以直接使用适当的类型提供所有必要的信息。您可以很容易地为您的类型使用枚举,它应该是枚举,因为您的障碍不是1
,而是块、树或任何东西
您的level1
变量可以这样定义:
var level1 : [Obstacle] = [
Obstacle(type: .Block, initializationTime: 120, speed: 3.0, ...),
Obstacle(type: .Block, initializationTime: 130, speed: 4.0, ...),
Obstacle(type: .Tree, initializationTime: 140, speed: 8.0, ...),
Obstacle(type: .Block, initializationTime: 150, speed: 6.0, ...)
]
Obstacle(.Block, 120, 3.0, ...)
要去掉初始值设定项中的标签,只需定义自己的初始值设定项。只需将其添加到结构中:
init(_ type: ObstacleType, _ time: NSTimeInterval, _ speed: Double, ...) {
self.type = type
self.initializationTime = time
self.speed = speed
// other variables...
}
然后,您可以像这样创建每个障碍:
var level1 : [Obstacle] = [
Obstacle(type: .Block, initializationTime: 120, speed: 3.0, ...),
Obstacle(type: .Block, initializationTime: 130, speed: 4.0, ...),
Obstacle(type: .Tree, initializationTime: 140, speed: 8.0, ...),
Obstacle(type: .Block, initializationTime: 150, speed: 6.0, ...)
]
Obstacle(.Block, 120, 3.0, ...)
但是现在,通过读取实例化,您无法再轻松地分辨哪个数字具有什么意义。我不建议只键入较少的内容,因为autocomplete将向您展示大部分内容。好的,谢谢,但我需要定义级别,每个级别都是相同的,因此我必须在开始时用每个对应的值初始化该级别的每个障碍,我不知道如何操作,因为我可以轻松地在一个关卡中设置100个障碍…@Drakalex所以,你只是有太多障碍,不想手动设置所有值?不,我必须手动设置所有值,但这不是问题,我不知道设置所有值的最佳方式是什么?我想要类似于var level1:[String]=[“0:120:3:0:1:1”,“0:130:4:80:2:2”,“1:140:8:120:6:1”,“0:150:6:240:2:2”]
这代表了前4个障碍和它们的parameters@Drakalex我为您的level1
添加了一个示例。我将类型0转换为块,将类型1转换为树。根据需要调整。好的,谢谢。这正是我想要的,但是有没有办法避免键入类型:,初始化时间,速度等等?像障碍物(.Block,150,6.0,…)