Sprite kit 使用SKAction定期更改场景的背景色

Sprite kit 使用SKAction定期更改场景的背景色,sprite-kit,Sprite Kit,我试图每隔10秒定期更改场景节点的背景色。我正在使用SKAction将SKScene背景色淡入一个新的随机生成的颜色,淡入动作持续4秒。现在,我尝试的实现使用一个“helper”SKSpriteNode来: 获取新的背景以供使用 定色 对其应用alpha淡入淡出动作 并将其设置为场景节点树中的第一个节点 此外,我还有一些计时代码,以确保场景中的背景颜色每10秒只更改一次。这意味着,如果我假设SpriteKit的目标速度为60FPS,则背景颜色应每600秒更改一次。由于每个背景色淡入淡出动作应持续

我试图每隔10秒定期更改场景节点的背景色。我正在使用SKAction将SKScene背景色淡入一个新的随机生成的颜色,淡入动作持续4秒。现在,我尝试的实现使用一个“helper”SKSpriteNode来:

  • 获取新的背景以供使用
  • 定色
  • 对其应用alpha淡入淡出动作
  • 并将其设置为场景节点树中的第一个节点
  • 此外,我还有一些计时代码,以确保场景中的背景颜色每10秒只更改一次。这意味着,如果我假设SpriteKit的目标速度为60FPS,则背景颜色应每600秒更改一次。由于每个背景色淡入淡出动作应持续4秒,因此每个淡入淡出动作应持续240秒(同样,假设60帧以保持简单)。基本上,会有一个360秒的时间,背景色不会发生任何变化

    无论如何,我似乎无法让我的代码当前工作,因为颜色根本没有改变。我为我的SKScene(在我的init方法中)设置的默认背景色是RGB白色。这是显示每个帧的唯一颜色。此外,“timeSinceUpdateCalled”和“TimesInceLastBackgroundColorChange”最初都设置为0.0 一切都是由SKScene的-update:(CFTimeInterval)方法驱动的。代码如下:

    -(void)update:(CFTimeInterval)currentTime {/* Called before each frame is rendered.  Basically, any actions taken on the title scene will go in here*/
    
        CFTimeInterval timeSinceUpdate = currentTime - self.timeSinceUpdateCalled;
    
        self.timeSinceUpdateCalled = currentTime;
    
        [self changeBackgroundTitleColorEverySoOften:timeSinceUpdate];
    }
    
    
    -(void)changeBackgroundTitleColorEverySoOften:(CFTimeInterval)timeSinceUpdate{
    
        self.timeSinceTheLastBackGroundColorChange += timeSinceUpdate;
    
        if(self.timeSinceTheLastBackGroundColorChange > 10.0){
    
            self.timeSinceTheLastBackGroundColorChange = 0;
    
            [self renderNewTitleBackGroundColor];
        }
    }
    
    -(void)renderNewTitleBackGroundColor{
    
        _batball_titlehelpersprite = [[SKSpriteNode alloc] initWithColor:self.colorGenerator size:self.view.bounds.size];
    
        _batball_titlehelpersprite.alpha = 0.0;
    
    
        SKAction* titleactioncolorfade = [SKAction fadeInWithDuration:4];
    
        titleactioncolorfade.speed = 1.0;
    
        [_batball_titlehelpersprite runAction:titleactioncolorfade];
    
    
        [self insertChild:_batball_titlehelpersprite atIndex:1];
    }
    
    -(UIColor* )colorGenerator{//This method generates a random UIColor
    
        UIColor* generatedColor = nil;//The generated random color
    
        generatedColor = [UIColor colorWithRed:[BatBallUtils randomFloat2:255] green:[BatBallUtils randomFloat2:255] blue:[BatBallUtils randomFloat2:255] alpha:0.0];//Generate a random color
    
        return generatedColor;
    }
    
    我通过了这段代码,似乎一切都应该正常。我的UIColor生成器代码也可以正常工作。这是我用来为RGB生成介于2和255之间的随机浮点数的代码:

    +(float)randomFloat2:(int)maxNum{//Generate a random float number between two floating point min and max numbers
    
    
        float num = (arc4random() % maxNum) / (float)maxNum;
    
        return(num);
    
    }
    

    有人知道我做错了什么吗?

    ui颜色值在0.0到1.0之间,请参阅:


    还要确保alpha使用1.0,否则颜色可能根本无法渲染,因为它是完全透明的。

    我建议您发布整个randomFloat2方法。我不认为它在做你认为它在做的事。事实上,我确实发布了randomFloat2的整个方法。我将回顾一下该方法,但现在,我再次测试了我的代码,从colorGenerator方法返回一个静态UIColor(黑色),以查看我是否会将颜色渐变更改为黑色。这仍然没有发生啊,在你的问题中,你需要将该方法的第一行缩进4个空格。randomFloat2方法返回的值介于0和254.0/255.0之间,而不是介于2和255之间。具有讽刺意味的是,这更接近UIColor对其RGB值的使用(参见LearnCos2D的答案)。我发布了另一条评论,通过在我从colorGenerator方法返回的结果中插入该调用,测试褪色并仅更改为黑色([UIColor colorWithRed:0绿色:0蓝色:0 alpha:0.0])。由于我正在使用动作(fadeInwithDuration)将alpha转换为1,所以alpha不应该是0吗?不必担心……你是对的,alpha应该设置为1。我现在得到了预期的随机颜色变化,但似乎我的SKAction没有运行。在我指定的4秒钟内,颜色的变化是突然的、瞬间的,而不是逐渐的、平滑的……我还不完全确定问题出在哪里,但这是一个过程。你似乎为每一次颜色变化都添加了一个新的精灵,你是否也想过删除以前的精灵?否则您将有许多精灵重叠,这将影响淡入淡出和ColorLearnCos2D,您完全正确。我本来打算下一步解决这个问题,但我想在解决这个问题之前先让背景色转换工作起来。