【问题标题】:Accessing ints from another class从另一个类访问整数
【发布时间】:2015-03-31 05:40:58
【问题描述】:

我有另一个视图来处理上次会话的分数以及排行榜。如何从 GameOver 类中的 GameScene 类访问我的 score int?

没有多看,我试图通过这样做找到自己的方式:

class GameOver: SKScene {

let score = GameScene().score

init(size: CGSize, won:Bool) {

    super.init(size: size)

    backgroundColor = SKColor.whiteColor()

    var message = "\(score)"

    println(score)

    let label = SKLabelNode(fontNamed: "AvenirNextCondensed-Heavy")
    label.text = message
    label.fontSize = 40
    label.fontColor = SKColor.blackColor()
    label.position = CGPoint(x: size.width/2, y: size.height/2)
    addChild(label)
}

我认为如果我在 GameScene 中为我的分数创建一个变量,它会起作用,但它确实使用了等于 0 的分数变量。那么我将如何将分数从玩家死亡时转移到场景上面?

class GameScene: SKScene, SKPhysicsContactDelegate {

struct PhysicsCategory {
    static let None: UInt32 = 0
    static let All: UInt32 = UInt32.max
    static let Enemy: UInt32 = 0b1
    static let Player: UInt32 = 0b10
}

let player = SKSpriteNode(imageNamed: "Player")
var playerAlive: Bool = true

var touched:Bool = false
var location = CGPointMake(0, 0)

var difficulty = 1.0

var timer: NSTimer!
var scoreTimer: NSTimer!
var lastAddedTime : CFTimeInterval = 0

var score: Int = 0
var scoreLabel: SKLabelNode!


override func didMoveToView(view: SKView) {
    backgroundColor = SKColor.whiteColor()

    player.position = CGPoint(x: size.width * 0.5, y: size.height * 0.25)
    player.physicsBody = SKPhysicsBody(circleOfRadius: player.size.width/2)
    player.physicsBody?.dynamic = true
    player.physicsBody?.categoryBitMask = PhysicsCategory.Player
    player.physicsBody?.contactTestBitMask = PhysicsCategory.Enemy
    player.physicsBody?.collisionBitMask = PhysicsCategory.None
    player.physicsBody?.usesPreciseCollisionDetection = true
    addChild(player)

    physicsWorld.gravity = CGVectorMake(0, 0)
    physicsWorld.contactDelegate = self

    var timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "increaseDifficulty", userInfo: nil, repeats: true)

    var scoreTimer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "addScore", userInfo: nil, repeats: true)

    scoreLabel = SKLabelNode(fontNamed: "AvenirNextCondensed-Heavy")
    scoreLabel.text = "\(score)"
    scoreLabel.fontColor = SKColor.blackColor()
    scoreLabel.fontSize = 40
    scoreLabel.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame) + self.frame.size.height * 0.4)
    addChild(scoreLabel)

}

func addScore() {
    score += 1
    println(score)
}

【问题讨论】:

    标签: swift sprite-kit


    【解决方案1】:

    我认为您需要将 score 变量声明为类级别变量,但 Swift 不直接支持它,因此将 score var 包装在 struct 中,如下所示:

    private struct ScoreStruct { 
      static var score: Int = 0 
    }
    
    class var staticScore: Int {
       get { return ScoreStruct.score }
       set { ScoreStruct.score = newValue }
    }
    

    你可以像这样使用它:GameScene.staticScore

    【讨论】:

    • 只是一个简单的问题。我的 GameScene 或 GameOver 是否需要这个? @aks
    • 如果你在 GameScene 中修改 score var 然后在 GameScene 中声明这个结构,你可以像 GameScene 类中的 'staticScore++' 一样直接改变它的值。并使用“GameScene.staticScore”在 GameOver 类中使用它
    【解决方案2】:

    GameScene 是一个类。它在哪里实例化? 在您的项目中搜索“presentScene:”一词,应该有一些类似

    的语言
    let myGameScene = GameScene()
    skView.presentScene(myGameScene)
    

    您的项目中还必须有一个地方包含如下代码。添加带有注释的行

    let myGameOver = GameOverScene()
    if(conditionIsMet)
    {
        myGameOver.passScore(myGameScene.score) //add this line
        skView.presentScene(myGameOver)
    }
    

    【讨论】:

      猜你喜欢
      • 2013-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多