如何避免硬编码值?

时间:2016-01-02 01:37:29

标签: ios swift sprite-kit

在我的应用程序中,我有从屏幕底部随机弹出的项目。我设置代码的方式迫使我使用硬编码值来处理弹出项目的x位置。我不想将这些x位置硬编码,而是将它们更改为例如GameScene.size.width / 4,以便应用程序的游戏对所有设备保持不变。以下是我设置代码的方法:

class Items{

var node = SKNode()
var item1 = SKSpriteNode(imageNamed: "CY")
var item2 = SKSpriteNode(imageNamed: "SY")
var item3 = SKSpriteNode(imageNamed: "PY")
var velocity = CGPoint.zero

var positionOffset = CGFloat(0)
var minVelocity = CGFloat(200)



init(pOffset: CGFloat) {
    positionOffset = pOffset
    node.zPosition = 1
    node.addChild(item1)
    node.addChild(item2)
    node.addChild(item3)
    node.hidden = true

}
....

class GameWorld{

var size = CGSize()
var node = SKNode()

var can1 = Items(pOffset: 208) //this is what is deciding the position
var can2 = Items(pOffset: 620)


init() {
    node.addChild(can1.node)
    node.addChild(can2.node)
}
....

GameWorld类中的偏移线决定了位置。为了能够说出#34; GameScene.size.width / 4"我可以改变什么? for can 1和can2的相似之处并没有问题?我确实尝试过不同的方法让它发挥作用,但似乎没有任何方法可行。当我能够说GameScene.size.width / 4时,由于某种原因,应用程序启动,但没有任何游戏加载。任何帮助将不胜感激。

这是我的GameScene课程:

class GameScene: SKScene {

... // added sprites but erased the code for now for space purposes


var touchLocation = CGPoint(x: 0, y: 0)
var nrTouches = 0
var rightTap: Bool = false
var leftTap: Bool = false

var delta: NSTimeInterval = 1/60

static var world = GameWorld()

override init(size: CGSize) {
    super.init(size: size)
    GameScene.world.size = size
}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}



override func didMoveToView(view: SKView) {
    backgroundColor = UIColor.whiteColor()
    let pos1 = CGPoint(x: size.width / 1.333, y: size.height / 1.1)

    addChild(GameScene.world.node)

    delta = NSTimeInterval(view.frameInterval) / 60



    sprite1.position = pos1
    sprite2.position = pos1
    sprite3.position = pos1

    sprite1.zPosition = 2
    sprite2.zPosition = 2
    sprite3.zPosition = 2
    sprite2.hidden = true
    sprite3.hidden = true



    addChild(sprite1)
    addChild(sprite2)
    addChild(sprite3)
}
.....

编辑:添加了GameScene Class

1 个答案:

答案 0 :(得分:2)

对于这种情况,您无法声明:

var can1 = Items(pOffset: 208)
var can2 = Items(pOffset: 620)

你现在这样做的方式。这是因为在编译时,游戏不知道屏幕尺寸是多少。相反,不要初始化变量,只需将其声明为:

var can1 : Items!
var can2 : Items!

然后下一部分很棘手,如果你正在进行自动布局,你需要确保在呈现场景之前已经创建并调整了视图大小。这不会发生在视图控制器中的viewDidAppear附近

在你的场景didMoveToView中,初始化变量:

override func didMoveToView(view : SKView)
{
    ... //super and other code
    can1 = Items(pOffset: view.frame.size.width/4)
    can2 = Items(pOffset: view.frame.size.width/2)


}