【问题标题】:Using image as sprite character使用图像作为精灵字符
【发布时间】:2016-07-09 07:38:03
【问题描述】:

所以我在我的 swift 2 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.斯威夫特

//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
}
}

【问题讨论】:

标签: xcode swift sprite-kit swift2 skspritenode


【解决方案1】:

要成功执行ball = Ball.make()make()方法的返回类型需要是Ball,而不是SKSpriteNode

要从make() 返回值Ball,您需要创建Ball 的实例,而不是SKSpriteNode

static func make() -> Ball {  //the return type of `make()` method needs to be `Ball`

    let textureBall : SKTexture! = SKTexture(imageNamed:"colorBall.png")
    let ballSize: CGSize = textureBall.size()
    let ball = Ball(circleOfRadius: ballSize.width/2) //you need to create an instance of `Ball`
    ball.fillTexture = textureBall
    ball.strokeColor = UIColor.clearColor()
    ball.name = "ball"
    ball.zPosition = 1
    ball.fillColor = UIColor.redColor()
    return ball
}

【讨论】:

  • 感谢我调整了代码以反映您的建议,但是程序在启动屏幕上崩溃并且日志抛出此错误:致命错误:在展开可选值时意外发现 nil
  • 首先,当你得到“unexpectedly found nil”时,检查所有强制解包!。通常,只有当您 100% 确定在那里找不到 nil 时,您才应该使用 !。检查代码中的所有!
  • 我尝试删除 !在 'var ball: Ball!` 中,但是说游戏场景没有初始化程序会中断
  • 在不了解为什么需要它以及为什么使用它的情况下,仅删除 ! 是无法解决问题的。
猜你喜欢
  • 2015-01-13
  • 2014-02-01
  • 2014-04-07
  • 1970-01-01
  • 2012-02-10
  • 1970-01-01
  • 1970-01-01
  • 2011-08-09
  • 1970-01-01
相关资源
最近更新 更多