2016-05-29 3 views
0

Я пытаюсь сделать клонированный клоун, и я получаю это сообщение ... «использование неразрешенного идентификатора для« Призрака »». Ошибка возникает при запуске функции касания. Мне все это известно, поэтому я не знаю, что происходит. Я следил за учебником, закодированным в swift 2.1, поэтому я не уверен, что это может быть проблемой, но я почти уверен, что скопировал его строку для строки.Swift: использование неразрешенного идентификатора

import SpriteKit 


struct PhysicsCategory { 
    static var Ghost : UInt32 = 0x1 << 1 
    static var Ground : UInt32 = 0x1 << 2 
    static var Wall : UInt32 = 0x1 << 3 
} 


class GameScene: SKScene { 
    override func didMoveToView(view: SKView) { 
     /* Setup your scene here */ 

    var Ground = SKSpriteNode() 
    var Ghost = SKSpriteNode() 


    Ground = SKSpriteNode(imageNamed: "Ground") 
    Ground.setScale(0.5) 
    Ground.position = CGPoint(x: self.frame.width/2, y:0 + Ground.frame.height/2) 

    Ground.physicsBody = SKPhysicsBody(rectangleOfSize: Ground.size) 
    Ground.physicsBody?.categoryBitMask = PhysicsCategory.Ground 
    Ground.physicsBody?.collisionBitMask = PhysicsCategory.Ghost 
    Ground.physicsBody?.contactTestBitMask = PhysicsCategory.Ghost 
    Ground.physicsBody?.affectedByGravity = false 
    Ground.physicsBody?.dynamic = false 


    self.addChild(Ground) 



    Ghost = SKSpriteNode(imageNamed: "Ghost") 
    Ghost.size = CGSize(width:60, height: 70) 
    Ghost.position = CGPoint(x: self.frame.width/2 - Ghost.frame.width, y: self.frame.height/2) 
    Ghost.physicsBody = SKPhysicsBody(circleOfRadius: Ghost.frame.height/2) 
    Ghost.physicsBody?.categoryBitMask = PhysicsCategory.Ghost 
    Ghost.physicsBody?.collisionBitMask = PhysicsCategory.Ground | PhysicsCategory.Wall 
    Ghost.physicsBody?.contactTestBitMask = PhysicsCategory.Ground | PhysicsCategory.Wall 
    Ghost.physicsBody?.affectedByGravity = true 
    Ghost.physicsBody?.dynamic = true 




    self.addChild(Ghost) 


    createWalls() 
} 

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
    /* Called when a touch begins */ 

    Ghost.physicsBody?.velocity = CGVectorMake(0,0) 
    Ghost.physicsBody?.applyImpulse(CGVectorMake(0, 60)) 



} 


func createWalls() { 

    let wallPair = SKNode() 

    let topWall = SKSpriteNode(imageNamed: "Wall") 
    let bottomWall = SKSpriteNode(imageNamed: "Wall") 

    topWall.position = CGPoint(x: self.frame.width/2, y:self.frame.height/2 + 350) 
    bottomWall.position = CGPoint(x: self.frame.width/2, y:self.frame.height/2 - 350) 

    topWall.setScale(0.5) 
    bottomWall.setScale(0.5) 

    topWall.zRotation = CGFloat(M_PI) 

    wallPair.addChild(topWall) 
    wallPair.addChild(bottomWall) 

    self.addChild(wallPair) 


} 


override func update(currentTime: CFTimeInterval) { 
    /* Called before each frame is rendered */ 
} 
} 

ответ

2

Ghost не является типом данных; это имя одной переменной, которую вы создаете в своем методе didMoveToView(). Вы должны сделать это свойством своего класса, чтобы он все еще мог быть инициализирован в didMoveToView(), но использовался в других методах, например touchesBegan(). Просто переместите свою декларацию var Ghost вне метода и сохраните Ghost = SKSpriteNode(...), где она есть.

Следует также упомянуть, что очень плохая идея иметь локальную переменную или свойство с тем же именем, что и один из ваших enum случаев; любой, кто читает код, может быть понятен путаным, хотя они совершенно законны, насколько это касается компилятора. Это также не очень похоже на Swift, чтобы использовать ваши переменные или имена свойств.

И, наконец, я должен умолять вас не, чтобы создать еще один клоун Flappy Bird! У нас их хватит на всю жизнь.

Смежные вопросы