如何使用SpriteKit swift重新着色精灵

时间:2014-08-11 20:35:52

标签: swift sprite-kit xcode6

我正在创造一个游戏,你必须用彩弹枪射击从天而降的不同敌人,以及"彩弹射击"是一种随机颜色,其中彩弹来自一个继承自SKShapeNode的类。当彩弹击中敌人时,我想创建一个飞溅动画,如果每个都是相同的颜色,这样做很简单。如何在框架中运行动画?颜色是否继承了原始子弹的颜色?或者我可以使用SKEmitterNode类以某种方式使用类似的东西吗?

这是Bullet类和addBullet类

class Bullet:SKShapeNode {
    var color:SKColor?
    var dx:CGFloat?
    var dy:CGFloat?
    var move:SKAction {
    get {
        if dx != nil && dy != nil {
            return SKAction.moveByX(dx!, y: dy!, duration: 0.4)
        } else {
            return SKAction.moveByX(0, y: 0, duration: 0)
        }
    }
}

required override init() {
    super.init()
    let circle = CGRectMake(0, 0, 40, 40)
    self.antialiased = true
    self.setScale(0.5)
    self.path = UIBezierPath(ovalInRect: circle).CGPath
    self.lineWidth = 1
    self.color = Random.randomColor()
    if let c = self.color {
        self.fillColor = c
        self.strokeColor = c
    } else {
        self.fillColor = SKColor.whiteColor()
        self.strokeColor = SKColor.whiteColor()
    }
    self.physicsBody = SKPhysicsBody(circleOfRadius: circle.width/2)
    self.physicsBody.affectedByGravity = false
    self.physicsBody.categoryBitMask = Collision.bulletCategory
    self.physicsBody.contactTestBitMask = Collision.enemyCategory
}


required init(coder aDecoder: NSCoder!) {
    super.init(coder: aDecoder)
}

}

func generateBullet(loc:CGPoint) {
    let dx = loc.x - self.player.position.x
    let dy = loc.y - self.player.position.y
    let norm = CGVectorMake(dx, dy).normalize()
    let b = Bullet()
    b.dx = norm.dx * 600
    b.dy = norm.dy * 600
    let height = self.player.size.height/4
    b.position = CGPointMake(self.player.position.x + norm.dx * height, self.player.position.y + norm.dy * height)
    self.addChild(b)
    b.runAction(b.move, completion: {
        b.removeFromParent();
    })
}

1 个答案:

答案 0 :(得分:1)

尝试将此添加到您的SKScene子类...

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
    /* Called when a touch begins */

    for touch: AnyObject in touches {
        let location = touch.locationInNode(self)

        // Add paintball splat at tap point
        self.splat(location,color:self.pickColor())
    }
}

func skRandf() -> Float {
    return Float(Float(random()) / Float(RAND_MAX))
}

func skRand(low:Float, high:Float) -> Float {
    return skRandf() * (high - low) + low;
}

func splat(location:CGPoint, color:SKColor) -> Void
{
    let count = arc4random_uniform(7)+6
    let node = SKNode.node()
    let core = SKShapeNode(path: self.core())

    core.position = location;
    core.zRotation = CGFloat(skRand(0.0, high: Float(M_PI*2)))
    core.xScale = CGFloat(skRand(0.1, high: 0.25))
    core.yScale = CGFloat(skRand(0.1, high: 0.25))
    core.fillColor = color

    node.addChild(core)

    for index in 1...count {
        let shape = SKShapeNode(path:self.paintDrop())

        shape.xScale = CGFloat(skRand(0.075, high: 0.15))
        shape.yScale = CGFloat(skRand(0.05, high: 0.25))

        shape.zRotation = CGFloat(skRand(0.0, high: Float(M_PI*2)))

        shape.position = location
        shape.fillColor = color
        shape.strokeColor = color

        node.addChild(shape)
    }
    self.addChild(node)
}

func core() -> CGPathRef
{
    var bezierPath = UIBezierPath()
    bezierPath.moveToPoint(CGPointMake(-19.5, -8.5))
    bezierPath.addCurveToPoint(CGPointMake(-1.5, -16.5), controlPoint1: CGPointMake(-16.25, -16.25), controlPoint2: CGPointMake(-9.5, -14))
    bezierPath.addCurveToPoint(CGPointMake(18.5, -8.5), controlPoint1: CGPointMake(6.5, -19), controlPoint2: CGPointMake(13.75, -16.25))
    bezierPath.addCurveToPoint(CGPointMake(15.5, 12.5), controlPoint1: CGPointMake(23.25, -0.75), controlPoint2: CGPointMake(19.25, 5))
    bezierPath.addCurveToPoint(CGPointMake(1.5, 20.5), controlPoint1: CGPointMake(11.75, 20), controlPoint2: CGPointMake(6.5, 20.5))
    bezierPath.addCurveToPoint(CGPointMake(-13.5, 12.5), controlPoint1: CGPointMake(-3.5, 20.5), controlPoint2: CGPointMake(-9.25, 17.5))
    bezierPath.addCurveToPoint(CGPointMake(-19.5, -8.5), controlPoint1: CGPointMake(-17.75, 7.5), controlPoint2: CGPointMake(-22.75, -0.75))
    bezierPath.closePath()
    return bezierPath.CGPath;
}


func paintDrop() -> CGPathRef {
    var bezierPath = UIBezierPath()
    bezierPath.moveToPoint(CGPointMake(-8.5, 81.5))
    bezierPath.addCurveToPoint(CGPointMake(-15.5, 114.5), controlPoint1: CGPointMake(-9.5, 89.5), controlPoint2: CGPointMake(-15.5, 104.5))
    bezierPath.addCurveToPoint(CGPointMake(1.5, 130.5), controlPoint1: CGPointMake(-15.5, 124.5), controlPoint2: CGPointMake(-8.5, 130.5))
    bezierPath.addCurveToPoint(CGPointMake(17.5, 114.5), controlPoint1: CGPointMake(11.5, 130.5), controlPoint2: CGPointMake(17.5, 123.5))
    bezierPath.addCurveToPoint(CGPointMake(9.5, 81.5), controlPoint1: CGPointMake(17.5, 105.5), controlPoint2: CGPointMake(10.5, 88.5))
    bezierPath.addCurveToPoint(CGPointMake(9.5, 0.5), controlPoint1: CGPointMake(8.5, 74.5), controlPoint2: CGPointMake(9.5, 0.5))
    bezierPath.addLineToPoint(CGPointMake(-8.5, 0.5))
    bezierPath.addCurveToPoint(CGPointMake(-8.5, 81.5), controlPoint1: CGPointMake(-8.5, 0.5), controlPoint2: CGPointMake(-8.32, 80.09))
    bezierPath.closePath()

    return bezierPath.CGPath
}

func pickColor() -> SKColor
{
    var color:SKColor
    switch (arc4random_uniform(6)) {
    case 0:
        color = SKColor.greenColor()
    case 1:
        color = SKColor.blueColor()
    case 2:
        color = SKColor.yellowColor()
    case 3:
        color = SKColor.redColor()
    case 4:
        color = SKColor.purpleColor()
    default:
        color = SKColor.magentaColor()
    }
    return color
}