App Open Source-Jogo Genius

Este popular jogo da década de 80 esta em peso na AppStore, principalmente pelo fato de ser fácil de ser programado e , ao mesmo tempo, bem divertido. Desta vez venho ensinar como faze-lo, porém utilizando toda o lógica da Objective-C e apenas isso, sem nenhum framework especializado para jogos.

Código amigo:

Header file

#import <AudioToolbox/AudioServices.h>

@interface GeniusTouchViewController : UIViewController {

NSMutableArray *arrayMaster;

int objetosTocados;

int rodadaEscolhendo;

BOOL jogoRodando;

SystemSoundID som1;

SystemSoundID som2;

SystemSoundID som3;

SystemSoundID som4;

SystemSoundID error;

IBOutlet UIButton *botaoComecar;

IBOutlet UIImageView *imagemFundo;

}

@property(nonatomic)SystemSoundID som1;

@property(nonatomic)SystemSoundID som2;

@property(nonatomic)SystemSoundID som3;

@property(nonatomic)SystemSoundID som4;

@property(nonatomic)SystemSoundID error;

@property(nonatomic,retain)UIButton *botaoComecar;

@property(nonatomic,retain)UIImageView *imagemFundo;

@property(nonatomic,retain)NSMutableArray *arrayMaster;

-(IBAction)corEscolhida:(id)sender;

-(IBAction)comecar;

-(IBAction)info;

-(void)tocarSequencia;

-(void)adicionar;

-(void)escurecer;

-(void)esconderBotao;

-(void)tocarSom:(int)som;

@end

Implementation

@synthesize arrayMaster,botaoComecar,imagemFundo;

@synthesize som1,som2,som3,som4,error;

- (void)viewDidLoad {

jogoRodando=NO;

arrayMaster=[[NSMutableArray alloc]init];

//inicializando os sons

AudioServicesCreateSystemSoundID ((CFURLRef ) [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@”3″ ofType:@”wav”]], &som1);

AudioServicesCreateSystemSoundID ((CFURLRef ) [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@”4″ ofType:@”wav”]], &som2);

AudioServicesCreateSystemSoundID ((CFURLRef ) [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@”1″ ofType:@”wav”]], &som3);

AudioServicesCreateSystemSoundID ((CFURLRef ) [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@”2″ ofType:@”wav”]], &som4);

AudioServicesCreateSystemSoundID ((CFURLRef ) [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@”error” ofType:@”wav”]], &error);

[super viewDidLoad];

}

-(IBAction)corEscolhida:(id)sender{//um tecla foi acionada

[self tocarSom:[sender tag]];//o som deve ser tocado, relativo a tecla acionada

if (jogoRodando==YES) {//SE o jogo esta ativo

if ([sender tag]==[[arrayMaster objectAtIndex:rodadaEscolhendo]intValue]) {//SE o botão apertado é igual ao objeto do array

rodadaEscolhendo++;// a proxima tecla deve ser comparada com o proximo objeto do array

if ([arrayMaster count]==rodadaEscolhendo) {//SE o numero de objetos no array for igual ao numero de objetos a ser comparado quer dizer que a sequencia acabou

rodadaEscolhendo=0;//o numero a ser comparado deve ser resetado

[self escurecer];//escurece a tela, para demonstrao ao usuário que é vez do computador

[NSTimer  scheduledTimerWithTimeInterval:1.6f target:self selector:@selector(adicionar) userInfo:nil repeats:NO];//em um delay de 1.6 segundos começara a proxima rodada

}

}else {//SE o botão apertado é diferente do objeto no array, o usuario erro

AudioServicesPlaySystemSound (error);//toca o som de erro

[UIView beginAnimations:nil context:NULL];

[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];

[UIView setAnimationDuration:0.3];

botaoComecar.transform =  CGAffineTransformMakeTranslation(0, -1); //animação para voltar o botão “Start”

[UIView commitAnimations];

jogoRodando=NO;//especifica que o jogo acabou

}

}

}

-(IBAction)comecar{// o botão “Start” foi pressionado

if ([arrayMaster count]>0) {//SE o array diver objetos ele deverá ser limpo

[arrayMaster removeAllObjects];//exclui todos os objetos do array, ja que começará um novo jogo

}

[self adicionar];//adiciona um objeto randômico ao array

[UIView beginAnimations:nil context:NULL];

[UIView setAnimationCurve:UIViewAnimationCurveEaseIn];

[UIView setAnimationDuration:0.3];

botaoComecar.transform =  CGAffineTransformMakeTranslation(0, 200); //animação para esconder o botão “Start”

[UIView commitAnimations];

jogoRodando=YES;//especifica que o jogo está em andamento

objetosTocados=0;//o botão a ser tocado começará do zero

rodadaEscolhendo=0;//o objeto a ser comparado começará do zero

}

-(void)escurecer{//função para esconder a tela

self.view.userInteractionEnabled=NO;//já que o iPhone tomará o controle para tocar a sequencia, a interação do usuário torna-se impossibilidata

[UIView beginAnimations:nil context:NULL];

[UIView setAnimationDuration:0.5];

[UIView setAnimationCurve:UIViewAnimationCurveEaseIn];

[imagemFundo setAlpha:0];//a imagem do fundo sai e fica apenas o fundo da view, que é preto

[UIView commitAnimations];

}

-(void)adicionar{//função para adicionar um objeto ao array

int numeroRand= 1+arc4random()%4;//sorteia um uma variavel inteira entre 1 e 4

[arrayMaster addObject:[NSNumber numberWithInt:numeroRand]];//já que uma variavel int não é um objeto especificamente, devemos criar um NSNumber com ela, depois adicionar

[self tocarSequencia];//toca o numero adicionado

}

-(void)tocarSequencia{

if (objetosTocados<[arrayMaster count]) {//SE ainda há objetos a analisados e tocados…

int num=[[arrayMaster objectAtIndex:objetosTocados]intValue];//cria uma variável com o numero no array que está sendo analisado (criei uma variável porque será utilizada multiplas vezes)

UIButton *botao = (UIButton*)[self.view viewWithTag:num];//cria um botão com a tag do numero

[botao setHighlighted:YES];//o botão sofre a animação de ser selecionado, para indicar a sequencia

[self tocarSom:num];//toca o som do botão

[NSTimer  scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(esconderBotao) userInfo:nil repeats:NO];//o botão está selecionado, depois de 1s ele é descelecionado

}else {

objetosTocados = 0;//Se não há mais objetos

self.view.userInteractionEnabled =YES;//a interação na tela deve ser devolvida ao usuário

[UIView beginAnimations:nil context:NULL];

[UIView setAnimationDuration:0.5];

[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];

[imagemFundo setAlpha:1];//a imagem de fundo volta

[UIView commitAnimations];

}

}

-(void)esconderBotao{//função para voltar o botão que está selecionado ao normal

UIButton *botao = (UIButton*)[self.view viewWithTag:[[arrayMaster objectAtIndex:objetosTocados]intValue]];//especifica o mesmo botão que está selecionado

[botao setHighlighted:NO];//desceleciona o botão

objetosTocados++;//já foi tocada essa sequencia, devemos partir para a próxima

[self tocarSequencia];//parte para a proxima sequencia

}

-(void)tocarSom:(int)som{//toca os sons das teclas decorrente da tag do botão

switch (som) {

case 1:

AudioServicesPlaySystemSound (som1);

break;

case 2:

AudioServicesPlaySystemSound (som2);

break;

case 3:

AudioServicesPlaySystemSound (som3);

break;

case 4:

AudioServicesPlaySystemSound (som4);

break;

}

}

-(IBAction)info{//alerta de informações no blog

UIAlertView *alerta =[[UIAlertView alloc]initWithTitle:@”Apple Maníacos” message:@”Este programa foi desenvolvido por Matheus Brum e seu código é disponível gratuitamente pelo blog AppleManiacos.com” delegate:self cancelButtonTitle:@”Ok” otherButtonTitles:@”Visitar Blog”,nil];

[alerta show];

[alerta release];

}

- (void)didReceiveMemoryWarning {

[super didReceiveMemoryWarning];

}

- (void)viewDidUnload {

}

- (void)dealloc {

[arrayMaster release];

[imagemFundo release];

[botaoComecar release];

[super dealloc];

}

@end