在我的应用程序中,我有从屏幕底部随机弹出的项目。我设置代码的方式迫使我使用硬编码值来处理弹出项目的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
答案 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)
}