Ios 精灵动画

Ios 精灵动画,ios,animation,sprite-kit,Ios,Animation,Sprite Kit,我需要你的建议,我是SpriteKit的新手,我需要制作动画条。我有3个解决方案,使它,但我需要的建议,更好,更便宜的CPU 1解决方案:每个条纹-带动画和纹理的SKSpriteNode 2解决方案:背景视频 3解决方案:每个条纹-带动画的SKShapeNode 这是一项简单的任务,您不需要构建atlas动画或使用SKShapeNode,您可以使用SKSpriteNode作为以下代码: var bar = SKSpriteNode(color: SKColor.greenColor(), s

我需要你的建议,我是SpriteKit的新手,我需要制作动画条。我有3个解决方案,使它,但我需要的建议,更好,更便宜的CPU

  • 1解决方案:每个条纹-带动画和纹理的SKSpriteNode
  • 2解决方案:背景视频
  • 3解决方案:每个条纹-带动画的SKShapeNode

这是一项简单的任务,您不需要构建atlas动画或使用
SKShapeNode
,您可以使用
SKSpriteNode
作为以下代码:

var bar = SKSpriteNode(color: SKColor.greenColor(), size: CGSizeMake(40, 200))
barra.position = CGPoint(x: CGRectGetMidX(self.frame), y: CGRectGetMidY(self.frame))
self.addChild(barra)
构建n个随机大小的条,并使用
SKAction
移动它们

使用这种方法,每次启动动画时,动画都会有所不同

详细编码

class GameScene: SKScene {
    var bars: [SKSpriteNode]!
    var totBars : Int = 50
    override func didMoveToView(view: SKView) {
        self.backgroundColor = SKColor(red: 131/255, green: 190/255, blue: 177/255, alpha: 1)
        let redBarColor = SKColor(red: 204/255, green: 75/255, blue: 75/255, alpha: 1)
        let yellowBar = SKColor(red: 253/255, green: 242/255, blue: 160/255, alpha: 1)
        // add here your colors
        var colorSelected:SKColor = redBarColor
        bars = [SKSpriteNode]()
        for i in 0..<totBars-1 {
            let colorNum = randomNumber(1...2)
            switch (colorNum) {
            case 1:
                colorSelected = redBarColor
            case 2:
                colorSelected = yellowBar
            default:
            break
            }
            let randomWidth = randomCGFloat(5,max:40)
            let randomHeight = randomCGFloat(30,max:400)
            let bar = SKSpriteNode.init(color: colorSelected, size: CGSizeMake(randomWidth, randomHeight))
            bar.zRotation = -45 * CGFloat(M_PI / 180.0)
            bar.name = "bar\(i)"
            self.addChild(bar)
            bars.append(bar)
        }
        animateBars()
    }
    func animateBar(bar:SKSpriteNode) {
        print("- \(bar.name) start!")
        let deltaX = self.randomCGFloat(0,max:self.frame.maxX)
        let deltaY:CGFloat  = self.frame.maxY/2
        let rightPoint = CGPointMake(self.frame.maxX + deltaX,self.frame.maxY + deltaY)
        let leftPoint = CGPointMake(-self.frame.maxX + deltaX,-self.frame.maxY + deltaY)
        bar.position = rightPoint
        let waitBeforeExit = SKAction.waitForDuration(Double(self.randomCGFloat(1.0,max:2.0)))
        let speed = self.randomCGFloat(150,max:300)
        let move = SKAction.moveTo(leftPoint, duration: self.getDuration(rightPoint, pointB: leftPoint, speed: speed))
        bar.runAction(SKAction.sequence([waitBeforeExit,move]), completion: {
           print("\(bar.name) reached position")
           self.animateBar(bar)
        })
    }
    func animateBars() {
        for bar in bars {
            animateBar(bar)
        }
    }
    func getDuration(pointA:CGPoint,pointB:CGPoint,speed:CGFloat)->NSTimeInterval {
        let xDist = (pointB.x - pointA.x)
        let yDist = (pointB.y - pointA.y)
        let distance = sqrt((xDist * xDist) + (yDist * yDist));
        let duration : NSTimeInterval = NSTimeInterval(distance/speed)
        return duration
    }
    func randomCGFloat(min: CGFloat, max: CGFloat) -> CGFloat {
        return CGFloat(Float(arc4random()) / Float(UINT32_MAX)) * (max - min) + min
    }
    func randomNumber(range: Range<Int> = 1...6) -> Int {
        let min = range.startIndex
        let max = range.endIndex
        return Int(arc4random_uniform(UInt32(max - min))) + min
    }
}
class游戏场景:SKScene{
变量条:[SKSpriteNode]!
var totBars:Int=50
覆盖func didMoveToView(视图:SKView){
self.backgroundColor=SKColor(红色:131/255,绿色:190/255,蓝色:177/255,alpha:1)
设redBarColor=SKColor(红色:204/255,绿色:75/255,蓝色:75/255,alpha:1)
让黄条=SKColor(红色:253/255,绿色:242/255,蓝色:160/255,alpha:1)
//在这里加上你的颜色
var colorSelected:SKColor=redBarColor
棒材=[SKSpriteNode]()
对于0..n时间间隔中的i{
设xDist=(pointB.x-pointA.x)
设yDist=(pointB.y-pointA.y)
设距离=sqrt((xDist*xDist)+(yDist*yDist));
让车持续时间:NSTimeInterval=NSTimeInterval(距离/速度)
返回持续时间
}
func randomCGFloat(最小:CGFloat,最大:CGFloat)->CGFloat{
返回CGFloat(Float(arc4random())/Float(UINT32_MAX))*(MAX-min)+min
}
func随机数(范围:范围=1…6)->Int{
设min=range.startIndex
设max=range.endIndex
返回Int(arc4random_uniform(UInt32(max-min))+min
}
}

为了回答您的问题,解决方案3是CPU成本最低的方法。下面是几个原因:

1。您建议的第一个解决方案是
SKSpriteNode
动画和纹理"要求计算机将纹理加载到视图中。如果您有多个
.png
文件,这意味着计算机将需要加载所有这些文件。但是如果您要使用
SKShapeNode
,则可以避免这样做,并且可以便宜地创建与
SKShapeNode
不基于的外观相同的外观图像

2.解决方案2对CPU的成本最高,因为运行视频会占用大量内存空间,如果在手机上运行视频,甚至可能会造成延迟


另外,还有一件事需要注意:如果广泛使用解决方案1和2,最终会占用大量内存。但如果使用解决方案3,则不会处理此问题。

如果条纹只是简单的矩形,则可以使用
SKSpriteNodes
并仅为其指定尺寸和颜色,然后使用动作来设置t的动画哼哼。你可以旋转矩形,以产生你在图片中显示的效果


实际上,您可以使用编辑器在Xcode中构建整个动画,将其保存在自己的SKS文件中,并使用
SKReferenceNode
加载动画。除了已经提出的选项外,另一个选项是为背景编写GLSL着色器。如果您只想要一个不与res交互的酷背景对于你的游戏来说,这可能是性能最好的选择,因为这一切都发生在GPU上

可以想象,您甚至可以在不需要任何图像的情况下渲染矩形,因为它们只是颜色区域


这里有一个很好的主题介绍:。

好的,谢谢。我认为skspitenode是一个更好的方法,但我对此表示怀疑。你的怀疑是什么?关于性能。我在cpu性能方面有很多问题,我想找到最好的解决方案。如果你需要,你可以在这里下载项目源:@AlessandroOrnano我只是想指出你处理颜色的聪明方法,在处理浮动时从来没有想过做这样的事情!非常感谢!CPU使用率方面的最高性能是使用一系列PNG图像,这些图像先解码,然后用SKAction制作动画。这种方法的缺点是占用大量内存。背景d视频可能无法处理60 FPS的帧速率。SKShapeNode方法可能会消耗大量CPU,因为每个帧都需要渲染。简单的彩色精灵比纹理精灵快,并且可以制作任意尺寸。@MoDJ我同意在这种情况下,不需要纹理…我不知道原始海报是什么要做的是,如果此人使用方法3,根据矢量信息渲染形状,那么就不需要纹理。但是,从矢量渲染可能更快,也可能更快,这取决于实现。我知道背景视频不会以这种FPS速率工作。实际上,
SKShapeNode
是这里最糟糕的解决方案,不管是什么至少,它要求每个节点调用一次draw,如果不节约使用,性能会大大降低……顺便问一下,在这种特殊情况下,为什么要使用
SKShapeNode
,而不是彩色的
SKSpriteNode
,它与
SKShapeNode
不同,可以成批渲染?依我看,
SKShapeNode
甚至不是麦汁对于当前的问题,h是值得一提的。