首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SpriteKit动画

SpriteKit动画
EN

Stack Overflow用户
提问于 2016-07-24 09:07:35
回答 3查看 361关注 0票数 2

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

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

EN

回答 3

Stack Overflow用户

发布于 2016-07-24 09:59:34

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

代码语言:javascript
复制
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移动它们。

随着这种方法,你的动画将是不同的,每次你启动它。

详细代码

代码语言:javascript
复制
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
    }
}
票数 2
EN

Stack Overflow用户

发布于 2016-10-04 00:44:56

要回答您的问题,解决方案3是您的CPU成本最低的方法。以下是这一事实的几个原因:

1.使用动画和纹理建议SKSpriteNode的第一个解决方案“要求计算机将纹理加载到视图中。如果您有多个.png文件,这将意味着计算机需要加载所有这些文件。但是如果要使用SKShapeNode,您将不必这样做,而且您将以低廉的价格创建与SKShapeNode不是基于图像的外观相同的外观。”

2.解决方案2对您的CPU来说是最昂贵的,因为它运行视频。这在你的记忆中占据了很大的空间,如果你在手机上运行它,甚至会造成延迟。

另外,需要注意的另一件事是:如果您要广泛使用解决方案1和2,您将最终使用如此多的内存。但是如果您使用解决方案3,您将不会处理这个问题。

票数 0
EN

Stack Overflow用户

发布于 2017-05-11 22:30:09

另一个选项,除了已经提出的,将是写一个GLSL着色器的背景。如果你只想要一个酷的背景,不与你的游戏其余部分互动,这可能是最具表现力的选择,因为这一切都会发生在GPU上。

你甚至可以,可以想象,渲染的矩形根本不需要任何图像,因为它们只是区域的颜色。

这里有一个很好的主题介绍:兄弟之战GLSL游戏攻略

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38550388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档