2016-07-09 7 views
2

Я пытаюсь добавить изображение к своему шару в моей игре Swift 2 Sprite-kit. У меня есть функция make() мяча и нет никаких ошибок там, однако в игровой сцене, когда этот метод называется, я постоянно получаю эту ошибку:Присвоение изображения SKShapeNode в качестве шара - игра Spritekit

«Невозможно назначить SKShapeNode» для шарового типа

! Я не уверен, как это исправить, и я новичок в Swift

// ----- GameScene.Swift ---- 
class GameScene: SKScene, GameDelegate, SKPhysicsContactDelegate { 
    // ball part one 
    var ball: Ball! 
    let ballSpeedX = CGFloat(500) 
} 

override func didMoveToView(view: SKView) { 
    // ball 
    ball = Ball.make() // error!!! 
    ball.position.x = CGRectGetMidX(self.frame) 
    ball.position.y = CGRectGetMidY(self.frame) 
    ball.physicsBody!.categoryBitMask = CollideType.Ball.toMask() 
    ball.physicsBody!.collisionBitMask = CollideType.toMask([.Scene, .Ceil, .Floor]) | boards.usedCollideMasks 
    ball.physicsBody!.contactTestBitMask = CollideType.toMask([.Scene, .Ceil, .Floor]) | boards.usedCollideMasks 
    ball.hidden = true 
    self.addChild(ball) 
} 

и это Ball.swift где make() является:.

//Ball. Swift 

//imports... 

class Ball: SKShapeNode { 

    var speedXFirst = CGFloat(0) 
var speedXSecond = CGFloat(0) 
var lastFloor = -1 

var xSpeed: CGFloat { 
    get { 
     return speedXFirst + speedXSecond 
    } 
} 

var lastBoardNumber = 0 

private override init() { 
    super.init() 
} 

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

static func make()-> SKShapeNode { 

    let textureBall : SKTexture! = SKTexture(imageNamed:"colorBall.png") 
    let ballSize: CGSize = textureBall.size() 
    var ball = SKShapeNode.init(circleOfRadius: ballSize.width/2) 
    ball.fillTexture = textureBall 
    ball.strokeColor = UIColor.clearColor() 
    ball.name = "ball" 
    ball.zPosition = 1 
    ball.fillColor = UIColor.redColor() // use the color you want 
    return ball 
} 

func freezeX() { 
    self.speedXFirst = 0 
    self.speedXSecond = 0 
} 

}

ответ

1

Вы имеете этот вопрос, потому что вы пытаетесь присвоить регулярный инициализируются и настраиваемая SKShapeNode (построено ваш метод make()) к типу Ball, который не то же самое SKShapeNode типа (подклассы с определенным INIT) ,

Вы можете настроить свой Болл класс как это:

class Ball: SKShapeNode { 
    var speedXFirst = CGFloat(0) 
    var speedXSecond = CGFloat(0) 
    var lastFloor = -1 
    private var radius: CGFloat! 

    var xSpeed: CGFloat { 
     get { 
      return speedXFirst + speedXSecond 
     } 
    } 
    var lastBoardNumber = 0 

    init(imageNamed: String){ 
     super.init() 
     let textureBall : SKTexture! = SKTexture.init(imageNamed:imageNamed) 
     let ballSize: CGSize = textureBall.size() 
     self.radius = ballSize.width/2 
     self.path = CGPathCreateWithEllipseInRect(CGRect(origin: CGPointZero, size: CGSize(width: radius*2, height: radius*2)), nil) 
     self.strokeColor = UIColor.clearColor() 
     self.name = "ball" 
     self.zPosition = 1 
     self.fillTexture = textureBall 
     self.fillColor = UIColor.redColor() // use the color you want 
    } 
    required init(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 
    func freezeX() { 
     self.speedXFirst = 0 
     self.speedXSecond = 0 
    } 
} 

Так что, когда вы находитесь в вашей сцене, вы можете назвать это так:

var ball: Ball! 
ball = Ball(imageNamed:"colorBall.png") 
+0

спасибо, со всем этим кодом, в моей игровой сцене 'ball = Ball (imageNamed:" colorBall.png ")' throws error: Ожидаемое объявление. –

+0

Измените свой ball.swift с моим кодом в ответе –

+0

Я сделал, я также сделал gamescene, и он выбрасывает ожидаемую ошибку объявления –