作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Swift、Xcode 6 和 SpriteKit,
我想制作一个游戏,让一些 Sprite 从屏幕顶部掉落,但每个 Sprite 都有定义的速度、位置和激活时间。我有这段工作代码,但我真的不认为这是最优化的方法:
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)
}
}
你知道我怎样才能做到同样的事情,但更“干净”吗?
最佳答案
我建议创建一个 class
或 struct
来保存障碍物的所有必要数据,另外将您的类型从标准数字更改为 enum
,例如:
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
,而是 block 、树或其他任何东西。
您的 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, ...)
]
要摆脱初始化器中的标签,只需定义您自己的初始化器即可。只需将其添加到您的结构中:
init(_ type: ObstacleType, _ time: NSTimeInterval, _ speed: Double, ...) {
self.type = type
self.initializationTime = time
self.speed = speed
// other variables...
}
然后你可以像这样创建每个障碍物:
Obstacle(.Block, 120, 3.0, ...)
但是现在您不能再通过阅读实例轻松判断哪个数字有什么含义。我不推荐这样做只是为了减少输入,因为自动完成会为您提供大部分内容。
关于swift - 如何一次存储多个属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27512692/
我是一名优秀的程序员,十分优秀!