我有以下代码:
-(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动作.目前,似乎输出立即运行所有操作,并且不会像它应该那样对它们进行排序.我已经阅读了文档,我现在所拥有的是他们所说的......
我目前正在使用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)
谢谢你的帮助!
在我的游戏中,我正在使用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) 我知道我可以创建一个SKAction.sequence,它将逐个运行一个节点的动作.但是如果我想用不同的节点做一个序列,我怎么能这样做呢.我想做那样的事情:
我有一个应用程序,每次触摸屏幕时播放声音文件.出于某种原因,应用程序会偶尔崩溃,并出现以下错误:
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次.大多数时候一切都按预期工作.我希望我知道我在做什么导致崩溃,但我不知道!我只是点击它看似没有什么不同于它没有崩溃的时间.然后突然间我得到了这个问题......
当我运行此代码时.
runAction(SKAction.playSoundFileNamed("Click.mp3", waitForCompletion: false))
我的应用程序崩溃了:
终止应用程序由于未捕获的异常"NSInvalidArgumentException",理由是:"资源Click.mp3不能在主束中找到"
我一直在研究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一样.
您传递所需操作的名称.我们将自动查看所有序列化操作文件中的应用程序包内部,找到具有相应名称的文件,然后将其显示给应用程序.
这看起来不错,但我找不到任何文档,或者在出错时弄清楚如何调试它.
我在做什么,我认为,这是一个非常简单的计时器栏,屏幕上没有别的东西.然而,这在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) 为什么从未调用完成?
我非常抱歉这是一个代码转储...因为我不知道为什么每个部分都有效,除了调用完成.
除了完成之外,没有调用完成的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) 我需要运行未知数量(来自字典数组)的 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) skaction ×10
sprite-kit ×10
ios ×5
swift ×4
objective-c ×2
audio ×1
closures ×1
completion ×1
ios7 ×1
ios9 ×1
iphone ×1
performance ×1
sequence ×1
skspritenode ×1
xcode ×1