我做了一些研究,我似乎无法找到任何清楚解释如何在动画中预加载单个纹理和纹理的东西.我目前正在使用Atlas它Assets.xcassets来分组相关的动画图像.在Atlas中显示我的图像是否意味着它们是预装的?就单个图像而言,在GameScene此之前声明纹理是否有意义:let laserImage = SKTexture(imageNamed: "Sprites/laser.jpg")然后(例如)在我的一个SKSpriteNode子类中,我可以laserImage通过?
我最终想知道是否有一个明确定义的方法,或者我是否应该将每个纹理存储为常量GameScene.任何关于正确(和最有效)的方法的建议都会很棒.
我对Swift很陌生,而且我在游戏中实现排行榜时遇到了一些麻烦.我刚看了一个教程:'游戏中心排行榜!(Xcode中的Swift 2)'其中GameCenter信息都通过应用程序的一个视图.在我的游戏中,我希望用户能够玩游戏,然后只有当他们处于特定SKScene意愿时他们才能访问GameCenter.
因此,例如,在GameOverScene意志上他们将被用户认证,并且还能够上传他们的高分.我想我也错过了GameViewController(所有教程逻辑所在的位置)和我制作的众多场景之间的一些差异.
这是我的代码,我尝试使用GKGameCenterControllerDelegateon GameOverScene和创建各种函数来访问GameCenter.当用户在视图中点击某个标签时进行调用:(这显然不起作用,因为我试图访问这样的行上的场景:self.presentViewController(view!, animated:true, completion: nil)
class GameOverScene: SKScene, GKGameCenterControllerDelegate {
init(size: CGSize, theScore:Int) {
score = theScore
super.init(size: size)
}
...
override func didMoveToView(view: SKView) {
authPlayer()
leaderboardLabel.text = "Tap for Leaderboard"
leaderboardLabel.fontSize = 12
leaderboardLabel.fontColor = SKColor.redColor()
leaderboardLabel.position = CGPoint(x: size.width*0.85, y: size.height*0.1)
addChild(leaderboardLabel)
...
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
for touch : AnyObject in touches {
let location = touch.locationInNode(self)
if(CGRectContainsPoint(leaderBoardLabel.frame, location)){ …Run Code Online (Sandbox Code Playgroud) 我一直在开发利用SpriteKit和斯威夫特一场比赛,但是我似乎无法决定的真正区别是什么之间GameViewController我和任何一个SKScene秒.我正在尝试理解这些差异,因为我想在我的游戏中实现GameCenter或本地排行榜,但在我找到的所有教程中(就像这一个:游戏中心排行榜!(Xcode中的Swift 2))他们拥有所有的逻辑GameViewController因为他们正在使用单一视图应用程序.当我阅读文档时,我无法理解这种关系,所以任何帮助都会很棒.最终,我希望能够在我的一个场景中显示和推送来自GameCenter的数据GameOverScene.谢谢你的帮助!
uiviewcontroller gamekit sprite-kit game-center-leaderboard swift
我正在使用Swift和SpriteKit构建我的第一个游戏并想要添加背景.游戏发生在太空中,所以我想让背景中的星星以不同的速度移动.目前,我正在通过使较大的恒星比较小的恒星更快地在屏幕上移动来进行3D外观.有没有一种有效的方法来做到这一点,而不是像这样制作一个SKNode子类,并在一开始就将它作为一个孩子添加DidMoveToView?看起来这种方法非常密集,但我想我会一遍又一遍地重复使用相同的图像.
class BackGroundAnimation:SKNode{
let theView:SKView
init(aView:SKView){
theView = aView
super.init()
animate()
}
func animate(){
for _ in 1...200{
let randomSize = random(1, max: 3)
var randomPosx = random(1,max: 1000)
randomPosx = randomPosx/1000.0
var randomPosy = random(1,max: 1000)
randomPosy = randomPosy/1000.0
let star:SKSpriteNode = SKSpriteNode(texture:starTexture)
star.setScale(randomSize/60.0)
star.position = CGPoint(x:(theView.scene?.size.width)! * randomPosx,y:(theView.scene?.size.width)! * randomPosy)// (self.scene.size.width)*randomPosx, y:(self.scene.size.height) * randomPosy)
//star.position = CGPoint(x: 200,y: 200)
star.physicsBody = SKPhysicsBody(circleOfRadius: star.size.width/2 )
star.physicsBody?.collisionBitMask = 0
star.physicsBody?.categoryBitMask = 0
star.physicsBody?.contactTestBitMask = 0
star.physicsBody?.linearDamping = 0 …Run Code Online (Sandbox Code Playgroud) 我正在使用Swift和SpriteKit构建我的第一个游戏,而且我在CPU使用和电池寿命方面遇到了很多问题.我想知道在后台线程中运行某些任务(如实例化坏人)是否是常见的做法; 如果是这样我将如何实施呢?
我设计了一个SKSpriteNode子类Ship,我想知道如何用几个不同的图像来动画它.我目前正在传递原始图片:
class Ship:SKSpriteNode{
static var shipImage = SKTexture(imageNamed:"Sprites/fullShip.png")
init(startPosition startPos:CGPoint, controllerVector:CGVector){
super.init(texture: Ship.shipImage, color: UIColor.clearColor(), size: Ship.shipImage.size())
Run Code Online (Sandbox Code Playgroud)
但我不确定如何在之后循环播放图像地图集.我首先尝试在类中使用一个方法,然后在update函数中调用该方法:
func animateShip() {
self.runAction(SKAction.repeatActionForever(
SKAction.animateWithTextures(shipAnimationFrames,
timePerFrame: 0.2,
resize: false,
restore: true)),
withKey:"shipBlink")
print("animate")
}
Run Code Online (Sandbox Code Playgroud)
var shipAnimationFrames : [SKTexture]!在上面声明GameScene,这个块位于didMoveToView
//Ship animation
let shipAnimatedAtlas = SKTextureAtlas(named: "ShipImages")
var blinkFrames = [SKTexture]()
let numImages = shipAnimatedAtlas.textureNames.count
for var i=1; i<=numImages; i += 1 {
let shipTextureName = "samShip\(i).png"
blinkFrames.append(shipAnimatedAtlas.textureNamed(shipTextureName))
}
shipAnimationFrames = blinkFrames
Run Code Online (Sandbox Code Playgroud)
任何帮助都是极好的!
我正在与SpriteKit进行我的第一场比赛,其中敌人从一侧进入屏幕并在另一侧通过屏幕.我注意到在游戏后期,当不同类型的敌人被渲染时,FPS下降并且CPU使用率接近100%(~95-99%).我想知道是否有办法在场景上获得精确的节点数(不仅仅是在屏幕上呈现的节点),以告诉我是否没有正确删除它们.我已经有一个全局节点计数器,我更新它似乎正常工作 - 总节点数通常是一致的.还有其他事情我可以尝试和调试吗?谢谢!
sprite-kit ×7
swift ×7
gamekit ×2
animation ×1
background ×1
frame-rate ×1
ios ×1
preload ×1
textures ×1
xcode ×1