【问题标题】:How can I match a random texture with another texture for animation?如何将随机纹理与另一个纹理匹配用于动画?
【发布时间】:2016-02-12 19:54:16
【问题描述】:

我有一个球,我有不同的颜色。球有两个纹理(纹理 1 和纹理 2),我运行它们对它们进行动画处理。我有不同颜色的球。一旦我调用一个随机函数来调用任何随机球(纹理1),我的另一个函数就不会与相同的球颜色(纹理2)匹配。例如,如果我的texture1 调用redBallUp,我的其他函数与redballDown 不匹配,而是随机调用一个纹理。有时,它匹配它,但动画不断在不同纹理之间切换,有时,它根本不调用 texture2。

我是这样设置的:

class GameScene: SKScene {

override func didMoveToView(view: SKView) {
     let ballTexture1 = SKTexture(imageNamed: getRandomBallUp())
     ballTexture1.filteringMode = SKTextureFilteringMode.Nearest
     let ballTexture2 = SKTexture(imageNamed: getRandomBalldDown())
     ballTexture2.filteringMode = SKTextureFilteringMode.Nearest

    let anim = SKAction.animateWithTextures([ballTexture1, ballTexture2], timePerFrame: 0.15)
    let upDown = SKAction.repeatActionForever(anim)

    ball = SKSpriteNode(texture: ballTexture1)
    ball.position = CGPoint(x: self.frame.size.width / 2.8, y:CGRectGetMidY(self.frame))
    ball.runAction(upDown)

    self.addChild(ball)
    }

func getRandomBallUp() -> String{
    let randomval = arc4random_uniform(6)
    var ballUp = ""
    switch(randomval)
    {
    case 0:
        ballUp = "BlueBallUp"
    case 1:
        ballUp = "DarkBlueBallUp"
    case 2:
        ballUp = "GreenBallUp"
    case 3:
        ballUp = "PurpleBallUp"
    case 4:
        ballUp = "RedBallUp"
    case 5:
        ballUp = "YellowBallUp"
    default:()
    }
    return ballUp
}

func getRandomBallDown() -> String{
    var ballDown = ""
    if (getRandomBallUp() == "BlueBallUp") {
        ballDown = "BlueBallDown"
    }
    if (getRandomBallUp() == "DarkBlueBallUp") {
        ballDown = "DarkBlueBallDown"
    }
    if (getRandomBallUp() == "GreenBallUp") {
        ballDown = "GreenBallDown"
    }
    if (getRandomBallUp() == "PurpleBallUp") {
        ballDown = "PurpleBallDown"
    }
    if (getRandomBallUp() == "RedBallUp") {
        ballDown = "RedBallDown"
    }
    else if (getRandomBallUp() == "YellowBallUp") {
        ballDown = "YellowBallDown"
    }
    return ballDown
}

【问题讨论】:

    标签: ios xcode swift animation sprite-kit


    【解决方案1】:

    每次调用 getRandomBallUp() 时,都会生成一个随机值并根据该值返回一个字符串。为避免这种情况,您需要将您的 getRandomBallDown() 更改为:

    func getCorrespondingRandomBallDown(ballUp:String) -> String{
        var ballDown = ""
        if (ballUp == "BlueBallUp") {
            ballDown = "BlueBallDown"
        }
        if (ballUp == "DarkBlueBallUp") {
            ballDown = "DarkBlueBallDown"
        }
        if (getRandomBallUp() == "GreenBallUp") {
            ballDown = "GreenBallDown"
        }
        if (ballUp == "PurpleBallUp") {
            ballDown = "PurpleBallDown"
        }
        if (ballUp == "RedBallUp") {
            ballDown = "RedBallDown"
        }
        else if (ballUp == "YellowBallUp") {
            ballDown = "YellowBallDown"
        }
        return ballDown
    }
    

    您还需要更改您的 didMoveToView:

    override func didMoveToView(view: SKView) {
         let ballUp = getRandomBallUp()
         let ballTexture1 = SKTexture(imageNamed: ballUp)
         ballTexture1.filteringMode = SKTextureFilteringMode.Nearest
         let ballTexture2 = SKTexture(imageNamed: getCorrespondingRandomBallDown(ballUp)
         ballTexture2.filteringMode = SKTextureFilteringMode.Nearest
    
        let anim = SKAction.animateWithTextures([ballTexture1, ballTexture2], timePerFrame: 0.15)
        let upDown = SKAction.repeatActionForever(anim)
    
        ball = SKSpriteNode(texture: ballTexture1)
        ball.position = CGPoint(x: self.frame.size.width / 2.8, y:CGRectGetMidY(self.frame))
        ball.runAction(upDown)
    
        self.addChild(ball)
        }
    

    【讨论】:

    • 知道了。非常感谢。这是有道理的。
    【解决方案2】:

    beyowulf 有答案,但这是 swift baby,让我们使用它的一些功能:

    func getRandomBall() -> (up:String,down:String){
        let randomval = arc4random_uniform(6)
        var ball = ""
        switch(randomval)
        {
        case 0:
            ball = "BlueBall"
        case 1:
            ball = "DarkBlueBall"
        case 2:
            ball = "GreenBall"
        case 3:
            ball = "PurpleBall"
        case 4:
            ball = "RedBall"
        case 5:
            ball = "YellowBall"
        default:()
        }
        return (up:"\(ball)Up",down:"\(ball)Down")
    }
    
    override func didMoveToView(view: SKView) {
         let ballTextureName = getRandomBall()
         let ballTexture1 = SKTexture(imageNamed: ballTextureName.up)
         ballTexture1.filteringMode = SKTextureFilteringMode.Nearest
         let ballTexture2 = SKTexture(imageNamed: ballTextureName.down)
         ballTexture2.filteringMode = SKTextureFilteringMode.Nearest
    
        let anim = SKAction.animateWithTextures([ballTexture1, ballTexture2], timePerFrame: 0.15)
        let upDown = SKAction.repeatActionForever(anim)
    
        ball = SKSpriteNode(texture: ballTexture1)
        ball.position = CGPoint(x: self.frame.size.width / 2.8, y:CGRectGetMidY(self.frame))
        ball.runAction(upDown)
    
        self.addChild(ball)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      相关资源
      最近更新 更多