2015-06-21 74 views
-1

我目前正在使用Swift制作一个应用程序,遵循教程。当我在XCode中运行代码时,出现标题中指出的错误。这是我的代码:二元运算符' - ='不能应用于类型'CGFloat'和'Int'的operends

import SpriteKit 

class GameScene: SKScene { 

    var currentLevel = 0 
    var currentLevelData:NSDictionary 
    var levels:Levels 
    var bg:SKSpriteNode 
    var man:SKSpriteNode 
    var levelType:SKSpriteNode 
    var manSpeed = 10 
    var runningManTextures = [SKTexture]() 
    var stageMaxLeft:CGFloat = 0 
    var stageMaxRight:CGFloat = 0 
    var x: CGFloat = 0 

    var manLeft = false 
    var manRight = false 


    override func didMoveToView(view: SKView) { 
     stageMaxRight = self.size.width/2 
     stageMaxLeft = -stageMaxRight 
     loadLevel() 
    } 

    func loadLevel() { 
     currentLevelData = levels.data[currentLevel] 
     loadBackground() 
     loadLevelType() 
     loadMan() 
    } 

    func loadBackground() { 
     var bgNum = currentLevelData["bg"] as! String 
     bg = SKSpriteNode(imageNamed: "bg_\(bgNum)") 
     bg.name = "bg" 
     bg.zPosition = 1.0 
     scene!.addChild(bg) 
    } 

    func loadLevelType() { 
     var levelTypeInfo = currentLevelData["type"] as! String 
     levelType = SKSpriteNode(imageNamed: levelTypeInfo) 
     levelType.name = "level_type" 
     levelType.position.y = -140 
     levelType.zPosition = 2.0 
     scene!.addChild(levelType) 
    } 

    func loadMan() { 
     loadManTextures() 
     man.position.y -= man.size.height/2 
     man.position.x = -(scene!.size.width/2) + man.size.width * 2 
     man.zPosition = 3.0 
     addChild(man) 
    } 

    func loadManTextures() { 
     var runningAtlas = SKTextureAtlas(named: "run") 
     for i in 1...3 { 
      var textureName = "run_\(i)" 
      var temp = runningAtlas.textureNamed(textureName) 
      runningManTextures.append(temp) 
     } 
    } 

    func moveMan(direction:String) { 
     if direction == "left" { 
      manLeft = true 
      man.xScale = -1 
      manRight = false 
      runMan() 
     } else { 
      manRight = true 
      man.xScale = 1 
      manLeft = false 
      runMan() 
     } 

    } 

    func runMan() { 
     man.runAction(SKAction.repeatActionForever(SKAction.animateWithTextures(runningManTextures, timePerFrame: 0.2, resize:false, restore:true))) 
    } 

    override func touchesBegan(touches:, Set<NSObject>, withEvent event: UIEvent) { 
     if event.allTouches()!.count == 1 { 
      let location = touches.first().locationInNode(self) //Error(2) reads: Cannot invoke 'locationInNode' with an argument list of type '(GameScene)'. 
      if location.x > 0 { 
       moveMan("right") 
      } else { 
       moveMan("left") 
      } 
     } else { 
      println("jump") 
     } 
    } 

    func cancelMoves() { 
     manLeft = false 
     manRight = false 
     man.removeAllActions() 
    } 

    override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) { 
     cancelMoves() 
    } 

    override init(size: CGSize) { 
     self.currentLevel = 0 
     self.currentLevelData = [:] 
     self.levels = Levels() 
     self.bg = SKSpriteNode() 
     self.man = SKSpriteNode(texture: SKTexture(imageNamed: "run_0")) 
     self.man.name = "man" 
     self.levelType = SKSpriteNode() 
     super.init(size: size) 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    func cleanScreen() { 
     bg.removeFromParent() 
     levelType.removeFromParent() 
    } 

    func nextScreen(level:Int) -> Bool { 
     if level >= 0 && level < levels.data.count { 
      currentLevel = level 
      currentLevelData = levels.data[currentLevel] 
      cleanScreen() 
      loadBackground() 
      loadLevelType() 
      return true 
     } 
     return false 
    } 

    func updateManPosition() { 
     if man.position.x < stageMaxLeft { 
      if nextScreen(currentLevel - 1) { 
       man.position.x = stageMaxRight 
      } 
      if manLeft { 
       return 
      } 
     } 
     if man.position.x > stageMaxRight { 
      if nextScreen(currentLevel + 1) { 
       man.position.x = stageMaxLeft 
      } 
      if manRight { 
       return 
      } 
     } 

     if manLeft { 
      man.position.x -= manSpeed //error here 
     } else if manRight { 
      man.position.x += manSpeed //error here also 
     } 
    } 

    override func update(currentTime: CFTimeInterval) { 
     updateManPosition() 
    } 
} 

我知道这可能是一个非常愚蠢的问题,但我很难过。我已经搜遍了,我发现了一个类似的问题,但解决方案没有奏效。

回答

2

幸运的是,编译器告诉你到底是什么问题,编译器不会让你混合类型。问题在这里:

var manSpeed = 10 

这是隐式创建manSpeed作为一个Int。所以,当你尝试 - 用CGFloat的=它(这是man.position.x是什么)编译器抱怨:

if manLeft { 
     man.position.x -= manSpeed //error here 
    } else if manRight { 
     man.position.x += manSpeed //error here also 
    } 

解决这个问题是明确键入manSpeed

var manSpeed: CGFloat = 10.0 
的最佳方式

这将确保类型匹配

+0

这固定它!我想这个教程是过时的。我完全复制了他所做的一切,但那不是我必须改变的第一件事。 – Dingo

+0

我其实还有一个问题,如果你不介意我的问题。我不想感到麻烦! – Dingo

+0

如果相关,请在此处询问。否则,请提出一个新问题。 –

相关问题