标签: skaction

SKSpriteNode不会使用顺序Sprite Kit中的SKAction进行fadeInWithDuration

我按顺序运行3个SKActions,前两个运行正常,但fadeInWithDuration不会在节点中淡入,当视图加载时,节点会立即添加.我是否必须将节点的初始Alpha通道设置为0?有人可以解决问题吗?

- (void)setUpButtonStart
{
    SKSpriteNode *buttonStart = [SKSpriteNode spriteNodeWithImageNamed:@"start"];
    buttonStart.name = @"buttonStart";
    buttonStart.position = CGPointMake(900,50);
    [self addChild:buttonStart];

    SKAction *wait = [SKAction waitForDuration:2.5];
    SKAction *readIntro = [SKAction playSoundFileNamed:@"intro.mp3" waitForCompletion:NO];
    SKAction *fadeIn = [SKAction fadeInWithDuration:1.0];

    SKAction *sequence = [SKAction sequence:@[wait, readIntro, fadeIn]];

    [buttonStart runAction: sequence];
}
Run Code Online (Sandbox Code Playgroud)

xcode sprite-kit skaction

6
推荐指数
1
解决办法
8483
查看次数

SKAction更改SKShapeNode的颜色

我正在使用SKAction中的repeatActionForever方法来更改SKShapeNode的颜色.这是我的代码:

SKShapeNode *ship = [SKShapeNode node];
[ship setPath:CGPathCreateWithRoundedRect(CGRectMake(-15, -15, 40, 17), 6.25, 6.25, nil)];
ship.fillColor = [SKColor redColor];
ship.glowWidth = 3;

[ship runAction:[SKAction repeatActionForever:[SKAction sequence:@[
[SKAction colorizeWithColor:[SKColor blueColor] colorBlendFactor:1.0 duration:0.5],
[SKAction waitForDuration:0.3],[SKAction colorizeWithColorBlendFactor:1.0 duration:0.5],
[SKAction colorizeWithColor:[SKColor redColor] colorBlendFactor:1.0 duration:0.5],
[SKAction waitForDuration:0.3],
[SKAction colorizeWithColorBlendFactor:1.0 duration:0.5],
[SKAction waitForDuration:0.3]]]]];
return ship; //because it's a method
Run Code Online (Sandbox Code Playgroud)

它看起来对我来说,但船不改变颜色.我做错了什么,谢谢.

xcode ios sprite-kit skaction skshapenode

6
推荐指数
1
解决办法
3651
查看次数

SpriteKit中的Animate路径绘图

我试图在路径上绘制笔画的动画SpriteKit.我已经实现了使用的工作解决方案SKActions和使用的单独实现CABasicAnimations.该SKAction解决方案是不是很优雅; 它在每次SKAction.repeatAction(action:count:)调用迭代时创建并描绘一个新路径,每个新路径比前一个稍微完整.

func start() {
    var i:Double = 1.0
    let spinAction:SKAction = SKAction.repeatAction(SKAction.sequence([
        SKAction.runBlock({
            self.drawCirclePercent(i * 0.01)

            if (++i > 100.0) {
                i = 1.0
            }
        }),
        SKAction.waitForDuration(0.01)
    ]), count: 100)
    runAction(spinAction)
}

func drawCirclePercent(percent:Double) {
    UIGraphicsBeginImageContext(self.size)

    let ctx:CGContextRef = UIGraphicsGetCurrentContext()
    CGContextSaveGState(ctx)
    CGContextSetLineWidth(ctx, lineWidth)
    CGContextSetRGBStrokeColor(ctx, 1.0, 1.0, 1.0, 1.0)
    CGContextAddArc(ctx, CGFloat(self.size.width/2.0), CGFloat(self.size.height/2.0), radius/2.0, CGFloat(M_PI * 1.5), CGFloat(M_PI * (1.5 + 2.0 * percent)), 0)
    CGContextStrokePath(ctx)

    let textureImage:UIImage = UIGraphicsGetImageFromCurrentImageContext()
    texture …
Run Code Online (Sandbox Code Playgroud)

ios sprite-kit skaction swift ios8

6
推荐指数
1
解决办法
2502
查看次数

以有限的旋转速度触摸旋转精灵

我试图让我的spriteNode旋转手指触摸.

到目前为止,我可以做到,但我想要的是我的节点具有"旋转速度".所以我计算角度的长度然后设置一个不同的时间与它一起旋转(如果弧很长,则需要时间......).

这是我的代码:

override func touchesMoved(touches: NSSet, withEvent event: UIEvent) {
    _isTouched = true
    for touch in touches {
        let location:CGVector = touch.locationInNode(self) - miner.position

        miner.weaponRotation = location.angle() - CGFloat(M_PI_2)
    }
}

var wantedRotation: CGFloat {
    get { return _wantedRotation }
    set(rotation) {
        if rotation > CGFloat(M_PI) || rotation < -CGFloat(M_PI) {
            _wantedRotation = CGFloat(M_PI) + rotation % CGFloat(M_PI)
        }
        else {
            _wantedRotation = rotation
        }

        removeActionForKey("rotation")
        let arc: CGFloat = CGFloat(abs(_wantedRotation - zRotation))
        let shortestArc: CGFloat = min(arc, CGFloat(M_PI …
Run Code Online (Sandbox Code Playgroud)

rotation ios sprite-kit skaction swift

6
推荐指数
1
解决办法
1927
查看次数

如何将敌人移向一个移动的玩家?

我正在创建一个简单的精灵套件游戏,将玩家放置在屏幕的左侧,而敌人从右侧接近.由于玩家可以上下移动,我希望敌人"巧妙地"调整他们向玩家的路径.

我试图在玩家移动时移除并重新添加SKAction序列,但是下面的代码会导致敌人根本不显示,可能是因为它只是在每次帧更新时添加和删除每个动作,所以他们永远不会有机会移动.

希望得到一些关于创造"聪明"敌人的最佳实践的反馈,这些敌人将随时转向玩家的位置.

这是我的代码:

    func moveEnemy(enemy: Enemy) {
    let moveEnemyAction = SKAction.moveTo(CGPoint(x:self.player.position.x, y:self.player.position.y), duration: 1.0)
    moveEnemyAction.speed = 0.2
    let removeEnemyAction = SKAction.removeFromParent()
    enemy.runAction(SKAction.sequence([moveEnemyAction,removeEnemyAction]), withKey: "moveEnemyAction")
}

func updateEnemyPath() {
    for enemy in self.enemies {
        if let action = enemy.actionForKey("moveEnemyAction") {
            enemy.removeAllActions()
            self.moveEnemy(enemy)
        }
    }
}

override func update(currentTime: NSTimeInterval) {
    self. updateEnemyPath()
}
Run Code Online (Sandbox Code Playgroud)

sprite-kit skaction swift

6
推荐指数
1
解决办法
1836
查看次数

如何中断SpriteKit操作序列并恢复,就好像没有中断一样

我想打断下面的序列2秒钟,然后恢复到最初没有中断的情况.

例如,从下面的代码中,如果我通过使精灵从序列的1.5 - 3.5秒可见而中断序列2秒(意味着hideInterval动作加上showSprite动作1 秒,并且showInterval动作将丢失0.5秒))中断将在showInterval动作剩余2.5秒时结束.如何让sprite在剩余的2.5秒内运行一个动作,并继续该点的正常序列.

请注意,这个例子是为了清楚起见,但我希望在中断后更通用的方法来恢复序列.

    let hideSprite = SKAction.fadeAlpha(to: 0, duration: 0.5)
    let showSprite = SKAction.fadeAlpha(to: 100, duration: 0.5)
    let hideInterval = SKAction.wait(forDuration: 2)
    let showInterval = SKAction.wait(forDuration: 3)
    let spriteSequence = SKAction.sequence([hideSprite, hideInterval, showSprite, showInterval])
    sprite.runAction(SKAction.repeatForever(spriteSequence))
Run Code Online (Sandbox Code Playgroud)

UPDATE

我认为下面的图表将使我的问题更容易理解,并进一步解释我想要通过中断序列实现的目标.

在此输入图像描述

sprite-kit skaction swift3

6
推荐指数
1
解决办法
269
查看次数

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
查看次数

计时器栏使用比例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
查看次数