我正在使用序列来运行SKActions列表.然而,我想要做的是运行SKAction,然后立即运行两个,然后按顺序运行一个.
这是我的代码:
SKNode *ballNode = [self childNodeWithName:@"ball"];
if (ballNode != Nil){
ballNode.name = nil;
SKAction *delay = [SKAction waitForDuration:3];
SKAction *scale = [SKAction scaleTo:0 duration:1];
SKAction *fadeOut = [SKAction fadeOutWithDuration:1];
SKAction *remove = [SKAction removeFromParent];
//put actions in sequence
SKAction *moveSequence = [SKAction sequence:@[delay, (run scale and fadeout at the same time), remove]];
//run action from node (child of SKLabelNode)
[ballNode runAction:moveSequence];
}
Run Code Online (Sandbox Code Playgroud)
我怎么能做到这一点?我假设我不能使用序列?
我有一个SKSpriteNode(monsterNode)的子类.它会使用矢量自动在屏幕上运行以跟随播放器.我目前正在使用以下操作来使其运行:
SKAction *actionMove = [SKAction moveTo:actualDistance duration:time];
[self runAction:actionMove completion:^ {
_currentState = SVGMonsterStateIdle;
}];
Run Code Online (Sandbox Code Playgroud)
我想知道是否有可能使它如此怪物节点实际上STOPS运行动作,如果它击中iOS设备屏幕的边界.我目前在屏幕边缘有SKSpriteNode边界,与联系代表链接,以通知怪物和墙壁是否接触.但是,如果我无法阻止怪物的动作动作从完成开始,那就没有任何意义.怪物需要停在屏幕的边界.如果无法在执行中停止SKAction,是否有迂回的方法呢?
以下代码将为旋转设置动画.
let something:SKSpriteNode = SKSpriteNode()
func start(){
let rotateAction = SKAction.rotateToAngle(CGFloat(M_PI), duration: 10.0)
something.runAction(SKAction.sequence([rotateAction]))
}
Run Code Online (Sandbox Code Playgroud)
现在我想在动画持续时间内停止动画.有什么类似于以下内容吗?我想在用户触摸屏幕时停止动画.
func stop(){
something.SKAction.stop()
}
Run Code Online (Sandbox Code Playgroud) 我想在我的spriteNode上运行两个动画,具体取决于它的旋转.如果值为负,则运行其中一个动画,如果它是正向运行另一个动画.我设法做到了(有点),但我遇到了问题.如果Animation1正在运行,并且zRotation变为正数,则它们都会运行,因为它们会永远重复.所以我这样做了:
NSMutableArray *walkingTextures = [NSMutableArray arrayWithCapacity:14];
for (int i = 1; i < 15; i++) {
NSString *textureName =
[NSString stringWithFormat:@"character%d", i];
SKTexture *texture =
[SKTexture textureWithImageNamed:textureName];
[walkingTextures addObject:texture];
}
SKAction *spriteAnimation = [SKAction animateWithTextures:Textures timePerFrame:0.04];
repeatWalkAnimation = [SKAction repeatActionForever:spriteAnimation];
[sprite runAction:repeatWalkAnimation withKey:@"animation1"];
Run Code Online (Sandbox Code Playgroud)
然后当我希望它停止时:
[self removeActionForKey:@"animation1"];
Run Code Online (Sandbox Code Playgroud)
但它继续运行动作,我该如何停止动作呢?谢谢!
目标:我想呈现一个新场景:
[self.scene.view presentScene:level2 transition:reveal];
Run Code Online (Sandbox Code Playgroud)
并结束当前的背景音乐以启动新的背景音乐(2级的新背景音乐).
问题:在呈现新场景时,1.场景(level1)的背景音乐一直在播放,即使在离开迷你游戏时也不会停止,因为整个游戏由几个迷你游戏组成.
播放的音乐是SKAction:
@implementation WBMAnimalMiniGameLvL1
-(id)initWithSize:(CGSize)size {
if (self = [super initWithSize:size])
{
/* Setup your scene here */
self.temporaryScore = 0;
self.animalSKSprites = [[WBMAnimalsMiniGameModel alloc] init];
self.backgroundImage = [SKSpriteNode spriteNodeWithImageNamed:@"farmBackground1024x768.png"];
self.backgroundImage.position = CGPointMake(CGRectGetMidX(self.frame),
CGRectGetMidY(self.frame));
self.temporaryStartingPointIndex = -1;
[self addChild:self.backgroundImage];
self.playBackgroundSound = [SKAction playSoundFileNamed:@"farm.mp3" waitForCompletion:NO];
//SKAction *repeat = [SKAction repeatActionForever:playSound];
[self runAction:self.playBackgroundSound withKey:@"play"];
[self drawAllAnimalsOntoScreen];
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
这是向下一级别的过渡发生的:
-(void)transitionToNextLevel
{
NSLog(@"transitionToNextLevel");
SKTransition *reveal = [SKTransition moveInWithDirection:SKTransitionDirectionDown duration:0.5];
//SKView *skView = (SKView *)self.view;
SKScene *level2 …
Run Code Online (Sandbox Code Playgroud) 我有一个SKSpriteNode,我淡出了 baseNode.runAction(SKAction.fadeOutWithDuration(0.5))
精灵有一个孩子.也是一个SKSpriteNode.(图像中的红色块)
当baseNode淡出时,存在die子节点的轮廓.
什么是避免这种淡出与其子整个节点的最佳方式同时?我想在子节点中播放纹理动画.如此扁平化是没有解决方案的.
我是Swift和SpriteKit的新手.很多SpriteKit动作的样本都在Objective C中,我无法在Swift中映射,也无法工作.
如果运行SKAction,并且在SKAction完成后想要做其他事情,我如何在Swift中做到这一点?
spaceMan.runAction(spaceManDeathAnimation, completion: {
println("red box has faded out")
})
Run Code Online (Sandbox Code Playgroud)
任何想法将不胜感激.
编辑:
for i in 0...29 {
textures.append(SKTexture(imageNamed: "spaceManDeath_\(i)"))
}
spaceManDeathAnimation = SKAction.repeatActionForever(SKAction.animateWithTextures(textures, timePerFrame: 0.15625))
Run Code Online (Sandbox Code Playgroud) 我试图弄清楚为什么playSoundFileNamed在接到两个连续的电话后无效.实际上它只在收到第一个电话后才有效.再现步骤是:
在此之后,播放来自touchesBegan的声音仍然有效.
当我重复上面的步骤(跳过第一步)时,touchesBegan的机制停止工作.不确定为什么会发生这种情况......以下是可以产生描述行为的代码:
@interface GameScene()
@property (nonatomic, strong) SKAction *sound;
@end
@implementation GameScene
-(void)didMoveToView:(SKView *)view {
self.sound = [SKAction playSoundFileNamed:@"sound1.wav" waitForCompletion:NO];
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
/* Called when a touch begins */
[self runAction:self.sound];
}
@end
Run Code Online (Sandbox Code Playgroud)
我知道在SO上有一些与此相关的问题,但是给出的答案与解决方法有关.我对解决方法不感兴趣,但为什么会发生这种情况呢?它与AVAudioSession有什么关系吗?(可能不是)我知道我可以使用AVAudioPlayer作为一种解决方法,但仍然不确定播放大量简单短音的效果是多少......
好吧,我一直在开发一个应用程序,其中我有一个带有SKAction对象的NSMutableDictionary.SKAction用于播放声音.
这一切都运行良好,除了...应用程序崩溃进入后台时,使用以下堆栈跟踪:
* thread #1: tid = 0x187d7, 0x3461b932 libGPUSupportMercury.dylib`gpus_ReturnNotPermittedKillClient + 10, queue = 'com.apple.spritekit.renderQueue, stop reason = EXC_BAD_ACCESS (code=1, address=0x1)
frame #0: 0x3461b932 libGPUSupportMercury.dylib`gpus_ReturnNotPermittedKillClient + 10
frame #1: 0x3461c3d0 libGPUSupportMercury.dylib`gpusSubmitDataBuffers + 104
frame #2: 0x2eafc4a4 IMGSGX554GLDriver`SubmitPackets + 124
frame #3: 0x31f83cb0 GLEngine`gliPresentViewES + 168
frame #4: 0x31f8e136 OpenGLES`-[EAGLContext presentRenderbuffer:] + 62
frame #5: 0x002622e6 libglInterpose.dylib`EAGLContext_presentRenderbuffer(EAGLContext*, objc_selector*, unsigned int) + 370
frame #6: 0x323f9064 SpriteKit`-[SKView _renderContent] + 1220
frame #7: 0x3a90b0ae libdispatch.dylib`_dispatch_client_callout + 22
frame #8: 0x3a90f8f2 libdispatch.dylib`_dispatch_barrier_sync_f_invoke + 26 …
Run Code Online (Sandbox Code Playgroud) 无论我试图在项目中播放什么wav文件,我都会遇到同样的错误.错误指出:由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'资源namedfile.wav无法加载'
我无法使用SKAction.playSoundFilenamed加载任何类型的声音.我确保文件名称正确,似乎不是问题.
我在几个项目中测试了这个,包括以下测试游戏项目,其中除了调用SKAction之外我使用所有默认代码
class GameScene: SKScene {
override func didMoveToView(view: SKView) {
/* Setup your scene here */
let myLabel = SKLabelNode(fontNamed:"Chalkduster")
myLabel.text = "Hello, World!";
myLabel.fontSize = 65;
myLabel.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame));
let soundfile = SKAction.playSoundFileNamed("soundProject.wav", waitForCompletion: false)
runAction(soundfile)
self.addChild(myLabel)
}
Run Code Online (Sandbox Code Playgroud)
我无法使用SKAction.playSoundFilenamed加载任何类型的声音.我已经检查过以确保文件名称正确并且它在包中退出.任何帮助将不胜感激.谢谢
更新我把我附加的代码放在另一台计算机上,它完全融合并运行.我的xcode /模拟器一定有问题.有谁知道如何重置它?谢谢
skaction ×10
sprite-kit ×10
ios ×4
swift ×4
objective-c ×3
audio ×2
animation ×1
completion ×1
crash ×1
fadeout ×1
handler ×1
ios7 ×1
skscene ×1
skview ×1
xcode ×1