使用图像作为精灵字符

Posted

技术标签:

【中文标题】使用图像作为精灵字符【英文标题】: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


【问题讨论】:

this 的副本 【参考方案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!` 中,但是说游戏场景没有初始化程序会中断 在不了解为什么需要它以及为什么使用它的情况下,仅删除 ! 是无法解决问题的。

以上是关于使用图像作为精灵字符的主要内容,如果未能解决你的问题,请参考以下文章

如何使用我的精灵强制 gwt?

PNG的精灵动画[颤振]

Unity 2D精灵(Sprite)与2D物理组件

在 IE9 中悬停在精灵图像上时悬停不活动

如何识别非规则精灵图像的触摸?

将剪切图像之一分配给精灵渲染器