我需要你的建议,我是SpriteKit的新手,我需要制作动画条。我有3个解决方案可以实现,但我需要更好,更便宜的CPU建议。
答案 0 :(得分:2)
这是一项简单的任务,您不需要构建地图集动画或使用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
}
}
答案 1 :(得分:1)
如果你的条纹只是简单的矩形,你可以使用SKSpriteNodes
并只给它们尺寸和颜色,然后使用动作来设置它们的动画。您可以旋转矩形以显示您在图片中显示的效果。
您可以使用编辑器在Xcode中构建整个动画,将其保存在自己的SKS文件中并使用SKReferenceNode
加载动画。
答案 2 :(得分:0)
要回答您的问题,解决方案3是您的CPU成本最低的方法。以下是几个原因:
1。您建议使用动画和纹理SKSpriteNode
的第一个解决方案“需要计算机将纹理加载到视图中。如果您有多个.png
文件,这意味着计算机需要加载所有这些文件。但如果你使用SKShapeNode
,你将避免必须这样做,你可以便宜地创建与{{1}相同的外观}不是基于图像。
2。由于运行视频,解决方案2对您的CPU来说成本最高。这会在你的记忆中占用大量空间,如果你在手机上运行它甚至会造成滞后。
另外,还有另外一点需要注意:如果你要广泛使用解决方案1和2,你最终会使用这么多内存。但是如果您使用解决方案3,则不会处理此问题。
答案 3 :(得分:0)
除了已经提出的选项之外,另一个选项是为背景编写GLSL着色器。如果你只想要一个不与游戏其他部分互动的酷炫背景,那么这可能是最高性能的选择,因为它将全部发生在GPU上。
你可以想象,渲染矩形而不需要任何图像,因为它们只是颜色区域。
这里有一个很好的介绍:Battle of Brothers GLSL Introduction。