Intereting Posts

Как запустить функцию внутри действия в Sprite Kit?

У меня есть следующий код для игры, которую я делаю. В одной из частей у меня есть

let spawn = SKAction.run { self.createCars() } 

но по какой-то причине я все время получаю сообщение об ошибке «Значение типа» (NSObject -> () -> GameScene »не имеет членских« createCars », хотя createCars – это функция, определенная ниже в моем коде. Почему это происходит и что может Я могу это исправить?

 import SpriteKit import GameplayKit class GameScene: SKScene, SKPhysicsContactDelegate { var lanecounter:CGFloat = 0 var score:Int = 0 var player:SKSpriteNode? let scoreLabel = SKLabelNode() let highScoreLabel = SKLabelNode() var direction:Int? let noCategory:UInt32 = 0 let carCategory:UInt32 = 0b1 let playerCategory:UInt32 = 0b1 << 1 let pointCategory:UInt32 = 0b1 << 2 var died:Bool? var restartBTN = SKSpriteNode() let moveLeft:SKAction = SKAction.moveBy(x: -100, y: 0, duration: 0.065) let moveRight:SKAction = SKAction.moveBy(x: 100, y: 0, duration: 0.065) let moveDown:SKAction = SKAction.moveTo(y: -800, duration: 1.1) let spawn = SKAction.run { self.createCars() } let delay = SKAction.wait(forDuration: 4) func createCars(){ let middlePoints = SKSpriteNode() var openLane:CGFloat = 0 middlePoints.size = CGSize(width: 100, height: 10) middlePoints.physicsBody = SKPhysicsBody(rectangleOf: middlePoints.size) //middlePoints.color = SKColor.purple middlePoints.physicsBody?.categoryBitMask = pointCategory middlePoints.physicsBody?.collisionBitMask = playerCategory middlePoints.physicsBody?.contactTestBitMask = playerCategory var randInt:Int = 0 randInt = Int(arc4random_uniform(3)) if lanecounter == -2 { if randInt == 0 || randInt == 1 { openLane = -1 } if randInt == 2 { openLane = -2 } } if lanecounter == 2 { if randInt == 0 || randInt == 1 { openLane = 1 } if randInt == 2 { openLane = 2 } } if lanecounter == -1 || lanecounter == 0 || lanecounter == 1 { if randInt == 0 { openLane = lanecounter - 1 } if randInt == 1 { openLane = lanecounter } if randInt == 2 { openLane = lanecounter + 1 } } //print("lanecounter is", lanecounter) //print("open lane is", openLane) if openLane != -2 { spawnCar(xCord: -2) } if openLane != -1 { spawnCar(xCord: -1) } if openLane != 0 { spawnCar(xCord: 0) } if openLane != 1 { spawnCar(xCord: 1) } if openLane != 2 { spawnCar(xCord: 2) } middlePoints.position = CGPoint(x: (openLane*100), y: self.frame.height) self.addChild(middlePoints) middlePoints.run(moveDown) } } 

Минимальный, полный и поддающийся проверке

Прежде всего, нам нужен пример Minimal, Complete и Verifiable, например :

 class GameScene: SKScene { let spawn = SKAction.run { self.createCars() } func createCars() { } } 

error: значение типа '(NSObject) -> () -> GameScene' не имеет имени 'createCars'

проблема

Проблема возникает из-за того, что вы не можете заполнить свойство в той же строке, которую оно определяет с помощью self (infact self еще не существует).

Решение

Однако вы можете использовать ленивое свойство, которое будет оцениваться только при вызове (и в то время оно будет доступно).

 class GameScene: SKScene { lazy var spawn: SKAction = { SKAction.run { self.createCars() } }() func createCars() { } }