简体   繁体   中英

How can I stop the animation to overlap while moving my character

I have 2 different textures for my character that overlap/are displayed too fast while moving the character. How can I set a duration for the animation, so the textures always switch at the same speed while moving the character?

This is my code:

    override func touchesMoved(touches: NSSet, withEvent event: UIEvent) {

    for touch: AnyObject in touches {
        let location = touch.locationInNode(self)

        let animatePlayerStart = SKAction.setTexture(SKTexture(imageNamed: "Player\(i).png"))


        // Determine speed for character movement
        var minDuration:CGFloat = 0.7;
        var maxDuration:CGFloat = 1.8;
        var rangeDuration:CGFloat = maxDuration - minDuration;
        var actualDuration:NSTimeInterval = NSTimeInterval((CGFloat(arc4random())%rangeDuration) + minDuration)


        let move = SKAction.moveTo(location, duration:actualDuration)

        player.runAction(SKAction.sequence([animatePlayerStart, move]))


        // i determines which texture is going to be displayed
        if(self.i == 2) {
            self.i = 1

        }
        else{
            self.i++
        }


    }
}

You are changing texture in touchesMoved which is called fast, thus the effect you are currently getting. To change textures after pre-defined period of time you can use this method: + animateWithTextures:timePerFrame:

import SpriteKit

class GameScene: SKScene {


    let hero = SKSpriteNode(imageNamed: "heroState_A")
    let textureA = SKTexture(imageNamed: "heroState_A")
    let textureB = SKTexture(imageNamed: "heroState_B")


    override func didMoveToView(view: SKView) {
        /* Setup your scene here */

        //Because hero is already initialized with textureA, start from textureB

        let animation = SKAction.animateWithTextures([textureB,textureA], timePerFrame:0.5)

        hero.position = CGPoint(x: CGRectGetMidX(frame), y: CGRectGetMidY(frame))

        addChild(hero)

        //Start animation
        hero.runAction(SKAction.repeatActionForever(animation),withKey:"heroAnimation")


        //Removing heroAnimation

        //You can stop this animation by hero.removeAllActions, but if you run animation with key, you can remove just that particular action, which gives you more control

        let stop = SKAction.runBlock({

            if(self.hero.actionForKey("heroAnimation") != nil){

                self.hero.removeActionForKey("heroAnimation")
            }
        })

        //Just an example, in real app you will do this at certain events (eg. when player stops his movement)
        runAction(SKAction.sequence([SKAction.waitForDuration(5),stop]))


    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM