Как непрерывно светить UIButton из последовательности кнопок

Я работаю над игрой-головоломкой на основе памяти. Для этого мне нужно, чтобы кнопки светились случайным образом из последовательности. Примерно неделю я гуглял образцы головоломок, игр и фрагментов кода, но я не смог найти подходящий пример проекта или какой-либо источник для начала работы.

Я зажигаю огни (кнопки), меняя фоновые изображения (имитация), я уже установил изображения по умолчанию для кнопок (цветная лампочка в стабильном состоянии) в раскадровке. Я использовал NSMutableArray из IBOutletCollection, т.е. tapLightButtons. Вот то, что я пытался получить последовательность светящихся ламп в случайном режиме, чтобы получить игровой опыт.

-(void)startGlowingLights
{
    [self shuffleValuesInArray:_tapLightButtons];
    [self shuffleValuesInArray:lightArray];
    [self shuffleValuesInArray:_initialButtonImages];
    [self performSelector:@selector(animateButtonSequence) withObject:self afterDelay:0.2];
}

- (void) animateButtonSequence
{
    __block UIButton *tapLight;

    [UIView animateWithDuration:0.15
                          delay:0.0
                        options:UIViewAnimationOptionCurveLinear
                     animations:^{

                         // button flash animation
                     } completion:^(BOOL finished) {
                         if (finished) {
                             if (i < _tapLightButtons.count) {
                                 i++;
                                 [self performSelector:@selector(animateButtonSequence) withObject:self afterDelay:1.0];
                                 tapLight = [self.tapLightButtons objectAtIndex:i-1];
                                 UIImage *glownLight = [UIImage imageNamed:[lightArray objectAtIndex:i-1]];
                                 [tapLight setBackgroundImage:glownLight forState:UIControlStateNormal];
                                 [[TTLMusicPlayer sharedInstance] playGlowLightSound:[[NSBundle mainBundle] pathForResource:@"beep" ofType: @"mp3"]];

                         //Reset the completed glowed button to previous state(off mode)
                                     double delayInSeconds = 1.0;
                                     dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
                                     dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
                                         if (i != 0 && i < _initialButtonImages.count) {
                                            [tapLight setBackgroundImage:[self.initialButtonImages objectAtIndex:i-1] forState:UIControlStateNormal];
                                         }
                                     });

                             }
                             else {
                                 i = 0;
                             }
                             NSLog(@"i value is %d",i);
                         }
                     }];
}

-(NSMutableArray *)shuffleValuesInArray:(NSMutableArray *)shuffledArray
{
    for (NSInteger x=0;x<[shuffledArray count];x++)
    {
        NSInteger randomNumber = (arc4random() % ([shuffledArray count] - x)) + x;
        [shuffledArray exchangeObjectAtIndex:x withObjectAtIndex:randomNumber];
    }
    return shuffledArray;
}

tapLightButtons - это массив, который содержит озадаченные кнопки (огни), которые автоматически светятся случайным образом одна за другой.

lightArray - массив, содержащий все соответствующие цветные изображения (вспышка для создания эффекта свечения)

initialButtonImages содержит массив всех стандартных (начальных) изображений кнопок (индикаторы режима выключения)

Некоторым образом я мог частично достичь того, что хотел, удивительно, даже после перетасовки всех массивов, все же я вижу изменения в порядке, потому что светящееся изображение должно соответствовать стабильному (цветовой режим выключен), а затем после сброса стабильное изображение должно соответствует тому, что до того, как свет на самом деле засветился.

Разместил вопрос и на сайте разработчиков игр от Stack Exchange!!

Экран игры для лучшего понимания

После мигания разноцветного света

Как правильно раскачивать кнопки случайным образом из последовательности?

1 ответ

Решение

Я бы сделал это по-другому, что приведет к более простому коду. Я создал массив из 9 пользовательских кнопок в IB и добавил их в коллекцию торговых точек. Я разделил кнопки на подклассы и добавил метод flashWithOnTime:, чтобы сама кнопка позаботилась о переключении между нормальным и выделенным состояниями.

Это метод в подклассе кнопки,

-(void)flashWithOnTime:(CGFloat)onTime {
    [self setHighlighted:YES];
    [self performSelector:@selector(setHighlighted:) withObject:@NO afterDelay:onTime];
}

Это код в контроллере вида, который запускает последовательность (нажатием кнопки). Вместо перетасовки я выбираю случайный индекс из массива, а затем удаляю эту запись, чтобы ее нельзя было выбрать снова. Методы offImageWithSolidColor и onImageWithSolidColor - это просто методы, которые я использовал для создания изображений.

@interface ViewController ()
@property (strong, nonatomic) IBOutletCollection(RDFlashingButton) NSArray *buttons;
@property (strong,nonatomic) NSArray *indexes;
@property (strong,nonatomic) NSMutableArray *mutableIndexes;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.indexes = @[@0,@1,@2,@3,@4,@5,@6,@7,@8];
    for (RDFlashingButton *aButton in self.buttons) {
        [aButton setBackgroundImage:[self offImageWithSolidColor] forState:UIControlStateNormal];;
        [aButton setBackgroundImage:[self onImageWithSolidColor] forState:UIControlStateHighlighted];
    }
}

-(void)flashRandomly {
    if (self.mutableIndexes.count > 0) {
        int index = arc4random_uniform(self.mutableIndexes.count);
        int value = [self.mutableIndexes[index] intValue];
        RDFlashingButton *aButton = self.buttons[value];
        [aButton flashWithOnTime:0.4];
        [self.mutableIndexes removeObjectAtIndex:index];
        [self performSelector:@selector(flashRandomly) withObject:nil afterDelay:.4];
    }
}

-(IBAction)startFlashing:(id)sender {
    self.mutableIndexes = [self.indexes mutableCopy];
    [self flashRandomly];
}
Другие вопросы по тегам