标签: skaction

SKAction序列是否实际等到行动结束?

我有以下代码:

-(void)aggravatedSeek:(SKSpriteNode *)target{
    _isAggravated = YES;

    SKAction *action = [SKAction runBlock:^{
        double randTime = 0.2;
        NSLog(@"%f", randTime);
        [self moveToSpriteNode:target withTimeInterval:randTime];
    }];

    //SKAction *repeatAction = [SKAction repeatAction:action count:6];
    SKAction *rep = [SKAction sequence:@[action, action, action, action, action]]; //Test Sequence

   [self runAction:rep completion:^{
       [self runAction:blackColorAction];
       _isAggravated = NO;

    }];
}
Run Code Online (Sandbox Code Playgroud)

我希望我的行动能够等到上一个动作完成.意思是,我的动作需要进行排序,以便动作在对象完成移动之前rep不会重复action动作.目前,似乎输出立即运行所有操作,并且不会像它应该那样对它们进行排序.我已经阅读了文档,我现在所拥有的是他们所说的......

objective-c ios sprite-kit skaction

5
推荐指数
1
解决办法
7376
查看次数

Spritekit停止声音

我目前正在使用Apple的SpriteKit库开发游戏,但是在开始播放之后我无法停止声音.我已经尝试使用文档中列出的方法来阻止Skaction运行,但似乎没有任何东西阻止播放声音.这些是我试图阻止声音的尝试.

//Playing sound action:

SKAction *music = [SKAction playSoundFileNamed:@"menu.wav" waitForCompletion:YES];
    [musicNode runAction:[SKAction repeatActionForever:[SKAction sequence:@[
                                                    music,
                                                    [SKAction waitForDuration:0],
                                                    ]]] withKey:@"MUSIC_PLAYING"];

//Later when i want to stop the sound:

[musicNode removeActionForKey:@"MUSIC_PLAYING"]; //Removing the action from the node
[musicNode runAction:[SKAction waitForDuration:0] withKey:@"MUSIC_PLAYING"]; //"Overriding" with another action with the same key
[musicNode removeAllActions]; //Removing all actions from the node
[musicNode removeFromParent]; //Removing the node from the parent
Run Code Online (Sandbox Code Playgroud)

musicNode只是一个运行动作的SkpriteNode,虽然我直接从场景中尝试了相同的方法,即:场景播放声音,然后尝试删除它.或者,由于waitForCompletion设置为YES,动作不会停止,但是再次尝试使用NO和相同的结果.有没有办法使用AVaudioSession的sharedInstante来停止声音?我也试过以下方法但也失败了:

 [[AVAudioSession sharedInstance]setActive:FALSE error:nil];
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助!

audio avaudiosession sprite-kit skaction

5
推荐指数
1
解决办法
2444
查看次数

在Sprite Kit中停止repeatActionForever

在我的游戏中,我正在使用SKAction repeatActionForever:方法定期调用某些方法performSelector:.正如我所见,没有办法阻止这一点.我试图阻止通过removeActionForKey:removeAllActions- 没有结果.我不想递归地调用这个动作,所以我需要帮助.

更新: 我的SKAction代码

levelTimer=[SKAction repeatActionForever:[SKAction sequence:@[[SKAction waitForDuration:30.0],[SKAction performSelector:@selector(moveToNextLevel) onTarget:self]]]];
[self runAction:levelTimer withKey:@"levelTimerAction"];
Run Code Online (Sandbox Code Playgroud)

ios sprite-kit skaction

5
推荐指数
1
解决办法
927
查看次数

使用不同的节点运行SKActions序列

我知道我可以创建一个SKAction.sequence,它将逐个运行一个节点的动作.但是如果我想用不同的节点做一个序列,我怎么能这样做呢.我想做那样的事情:

  1. 从节点A运行操作
  2. 等2秒
  3. 从节点B运行操作.

objective-c sequence sprite-kit skaction

5
推荐指数
1
解决办法
1351
查看次数

声源无法加载Swift SKAction

我有一个应用程序,每次触摸屏幕时播放声音文件.出于某种原因,应用程序会偶尔崩溃,并出现以下错误:

reason: 'Resource tick.mp3 can not be loaded'
Run Code Online (Sandbox Code Playgroud)

如果您需要它,这里是我每次点击屏幕时播放文件的方式:

runAction(SKAction.playSoundFileNamed("tick.mp3", waitForCompletion: false))
Run Code Online (Sandbox Code Playgroud)

这种情况不会经常发生,可能是应用程序的10次运行中的1次.大多数时候一切都按预期工作.我希望我知道我在做什么导致崩溃,但我不知道!我只是点击它看似没有什么不同于它没有崩溃的时间.然后突然间我得到了这个问题......

ios sprite-kit skaction swift

5
推荐指数
1
解决办法
1666
查看次数

在Swift SpriteKit项目中播放声音?

当我运行此代码时.

runAction(SKAction.playSoundFileNamed("Click.mp3", waitForCompletion: false))

我的应用程序崩溃了:

终止应用程序由于未捕获的异常"NSInvalidArgumentException",理由是:"资源Click.mp3不能在主束中找到"

iphone ios7 sprite-kit skaction swift

5
推荐指数
1
解决办法
7925
查看次数

如何让SKAction(名称:)可靠地工作?

我一直在研究DemoBots示例,并且很难让它在所有设备上运行.

https://developer.apple.com/library/prerelease/ios/samplecode/DemoBots/Introduction/Intro.html

我目前遇到的问题是,在iPad Mini上,应用程序启动但在加载动画时崩溃.它在从一个文件加载动作的行上的AnimationComponent.swift中崩溃:

let bodyAction: SKAction?  
if let name = bodyActionName {
    // crash here  
    bodyAction = SKAction(named: name)  
}  
else {  
    bodyAction = nil  
}  
Run Code Online (Sandbox Code Playgroud)

调试应用程序显示它试图加载一个名为"ZappedShake"的SKAction,但是在数组超出范围异常时崩溃.

在iPhone 5S上运行正常.我最好的猜测是它的竞争状态,速度较快的iPhone 5S正在加载文件,并在其中序列化动作,并且到执行时到达此时动作可用.但在单核较旧的iPad上,文件尚未加载,呼叫失败.

两者都是运行iOS9 13A4325c的真实硬件,在XCode Version 7.0 beta 4(7A165t)上编译.

使问题更加困难的是我无法看到显然创建"ZappedShake"的文件 - ReferenceActions.sks - 实际上已加载.它引用的是ReferenceScene.sks,但在任何代码或项目的任何其他地方都没有,我可以看到该文件被引用.

SKActions是否有某种名称约定魔法文件加载机制?为什么它适用于iPhone 5S而不适用于iPad?

更新:在此处找到更多信息:http://asciiwwdc.com/2015/sessions/604

今年我们也专注于参考和实例化.我们知道您花了很多时间为您的游戏设计高质量的内容和动画,我们希望您能够在任何您想要的地方重复使用该内容.

我们允许您为节点和操作创建序列化数据文件,然后将它们添加为参考,而不是仅将它们加载到场景中.

这样,每次您对源资产进行更改时,都会自动反映在游戏内容中.

我如何为节点执行此操作?对于节点,我设计了我的场景的一部分,也许是背景元素,或者在我们的编辑器中使用Xcode的一些场景,然后我可以将这些文件拖放到Xcode中的主场景中,它将自动创建一个引用,它都是为你准备好的.

如果你想在代码中也这样做,你可以手动构建一个SKReferenceNode,为它分配一个文件名甚至一个URL,当你的游戏中首次出现该内容时,我们将根据最新内容加载该内容.捆绑包中的文件版本.我们也可以为行动做同样的事情.通过操作,查看我们出色的新动作编辑器,除了在Xcode中创建和编写动作之外,您还可以为它们命名.

这些名称是在游戏中使用它们的关键.我们在SKAction中添加了一个名为actionNamed的选择器.这就像它对SKTexture和textureNamed一样.

您传递所需操作的名称.我们将自动查看所有序列化操作文件中的应用程序包内部,找到具有相应名称的文件,然后将其显示给应用程序.

这看起来不错,但我找不到任何文档,或者在出错时弄清楚如何调试它.

xcode ios sprite-kit skaction ios9

5
推荐指数
1
解决办法
660
查看次数

计时器栏使用比例SKAction,可怕的SpriteKit渲染性能

我在做什么,我认为,这是一个非常简单的计时器栏,屏幕上没有别的东西.然而,这在iPad Pro上无法保持60fps ......我做的事情显然是重而错吗?

let previewTime: TimeInterval = 3.0

func timerBar(){

    let tbW: CGFloat = frame.size.width / 2
    let tbH: CGFloat = 64
    let tbSize = CGSize(width: tbW, height: tbH)

    let timerBox = SKSpriteNode(color: SKColor.black, size: tbSize)
    timerBox.anchorPoint = CGPoint(x: 0.0, y: 0.0)
    timerBox.position = CGPoint(x: frame.size.width / 2 - (tbW / 2), y: 500)
    timerBox.zPosition = 8
    addChild(timerBox)

    let timerBoxBar = SKSpriteNode(color: .white, size: tbSize)
        timerBoxBar.anchorPoint = CGPoint(x: 0.0, y: 0.0)
        timerBoxBar.position.x = 0.0
        timerBoxBar.position.y = 0.0
        timerBoxBar.xScale = 0.0 …
Run Code Online (Sandbox Code Playgroud)

performance ios sprite-kit skaction skspritenode

5
推荐指数
0
解决办法
68
查看次数

完成块从未在组的SKAction序列结束时调用

为什么从未调用完成?

我非常抱歉这是一个代码转储...因为我不知道为什么每个部分都有效,除了调用完成.

除了完成之外,没有调用完成的SKAction运行.就是这个:

curtain.run(fadeMoveWipeAndReveal, completion: {onDone(), print("I'm done!!!!")})
Run Code Online (Sandbox Code Playgroud)

在以下课程中:

import SpriteKit

class WipeCurtain: SKSpriteNode {

    var wipeCurtainBase: SKSpriteNode?
    var returnable = SKNode()
    var moveRight = SKAction()
    var node = SKNode()

    init(     color: SKColor,
              size: CGSize,
              time: TimeInterval,
              reveal: @escaping () -> (),
              onDone: @escaping () -> ())
    {
        super.init(texture: nil, color: color, size: size)
        wipeCurtainBase = SKSpriteNode(color: color, size: size)

        let show = SKAction.run(reveal)

        let fadeIn = createFadeIn(duration: time)
        let moveRight = createMoveRight(duration: time)
        let wipeRight = createWipeRight(duration: time)

        let …
Run Code Online (Sandbox Code Playgroud)

closures sprite-kit skaction swift completion

5
推荐指数
1
解决办法
578
查看次数

如何循环动态延迟的 SKActions 序列

我需要运行未知数量(来自字典数组)的 SKAction 序列,这些序列是在循环中动态创建和偏移的,延迟会随着我通过循环而增加。循环的打印输出应按以下顺序出现

show line 5
hiding everything
show line 6
hiding everything
show line 2
hiding everything
Run Code Online (Sandbox Code Playgroud)

要获得此功能,我使用此代码

func display(winningLines: [Int : AnyObject]) {

    var delay = 0.0
    var actions = [SKAction]()

    let hideAction = SKAction.run {
        print("hiding everything")
    }

    for winningLine in winningLines {

        let displayAction = SKAction.run {
            print("line \(winningLine.key)")
        }

        let wait = SKAction.wait(forDuration: delay)            
        var action: SKAction!

        //repeatForever = true
        if !repeatForever {
             action = SKAction.sequence([wait, displayAction, SKAction.wait(forDuration: 1.0), hideAction])
        }
        else {
            let seq …
Run Code Online (Sandbox Code Playgroud)

sprite-kit skaction swift

5
推荐指数
1
解决办法
791
查看次数