Как непрерывно светить 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];
}