Partage
  • Partager sur Facebook
  • Partager sur Twitter

[iOS] Besoin d'aide pour les collisions

    16 juin 2012 à 19:15:19

    Bonjour à tous,

    Le but :

    Après avoir beaucoup cherché par moi-meme, je viens demander de l'aide à des programmeurs plus expérimentés...
    En effet, je souhaite créer un casse-brique où les briques "ont de la vie". C'est-à-dire qu'elles ont une couleur de base grise, et que si on la touche une fois elle devient rouge, si on la touche une deuxième fois elle devient jaune, et enfin si on la touche une troisième fois elle disparait.

    Le problème :

    Eh bien le problème c'est que j'ai remarqué que lorsque la balle touche un des coins d'une brique, cette dernière passe par toutes les couleurs (rouge, jaune) puis disparait, tout ça en un tout petit laps de temps. J'en déduis donc que lorsque la balle touche un des coins d'une brique, plusieurs collisions sont détectées en une fraction de seconde...ce qui entraine une disparition prématurée de la brique.

    Comment je gère les collisions :


    Je gère les collisions de la manière expliquée dans le tutoriel de Michel Martin concernant la création d'un casse-brique, j'utilise donc la méthode :
    CGRectIntersectsRect(objet1.frame,objet2.frame)
    


    Le code :

    Je vous donne le code pour que vous m'aidiez à résoudre le problème, ou que si vous connaissiez une autre manière de les gérer, de me la donner.

    @interface ViewController : UIViewController
    {
        CGPoint vitesseBalle;
        NSTimer *timer1;
        
        int i;
        NSNumber *currentVie;
        NSMutableArray *tableauBrique;
        NSMutableArray *tableauVies;
        UIImageView *currentBrique;
    }
    @property (strong, nonatomic) IBOutlet UIImageView *brique1;
    @property (strong, nonatomic) IBOutlet UIImageView *brique2;
    @property (strong, nonatomic) IBOutlet UIImageView *brique3;
    @property (strong, nonatomic) IBOutlet UIImageView *brique4;
    @property (strong, nonatomic) IBOutlet UIImageView *brique5;
    @property (strong, nonatomic) IBOutlet UIImageView *brique6;
    @property (strong, nonatomic) IBOutlet UIImageView *brique7;
    @property (strong, nonatomic) IBOutlet UILabel *stop3s;
    @property (strong, nonatomic) IBOutlet UIImageView *balle;
    @property (strong, nonatomic) IBOutlet UIImageView *raquette;
    


    #import "ViewController.h"
    
    @implementation ViewController
    @synthesize brique1;
    @synthesize brique2;
    @synthesize brique3;
    @synthesize brique4;
    @synthesize brique5;
    @synthesize brique6;
    @synthesize brique7;
    @synthesize stop3s;
    @synthesize balle;
    @synthesize raquette;
    
    - (void)didReceiveMemoryWarning
    {
        [super didReceiveMemoryWarning];
        // Release any cached data, images, etc that aren't in use.
    }
    
    #pragma mark - View lifecycle
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        
        // initialisation des tableaux de vies et de briques
        
        tableauBrique = [[NSMutableArray alloc] initWithObjects:brique1, brique2, brique3, brique4, brique5, brique6, brique7, nil];
        tableauVies = [[NSMutableArray alloc] init];
        [tableauVies addObject:[NSNumber numberWithInt:3]];
        [tableauVies addObject:[NSNumber numberWithInt:3]];
        [tableauVies addObject:[NSNumber numberWithInt:3]];
        [tableauVies addObject:[NSNumber numberWithInt:3]];
        [tableauVies addObject:[NSNumber numberWithInt:3]];
        [tableauVies addObject:[NSNumber numberWithInt:3]];
        [tableauVies addObject:[NSNumber numberWithInt:3]];
    
        
        currentBrique = [[UIImageView alloc] init];
        currentVie = [[NSNumber alloc] init];
        // timer, vitesse + coordonees base raquette
        
        self.view.backgroundColor = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"background.png"]];
        vitesseBalle = CGPointMake(2,3);
        raquette.center = CGPointMake(63, 452);
        timer1 = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(boucleJeu) userInfo:nil repeats:YES];
        
    }
    
    -(void) boucleJeu {
    // calcul coordonnees balle avec vitesse
        
        balle.center = CGPointMake(balle.center.x + vitesseBalle.x, balle.center.y + vitesseBalle.y);
        
    // faire rebondir quand ca touche les bords
        
        if (balle.center.x > self.view.bounds.size.width || balle.center.x < 0) {
            vitesseBalle.x = -vitesseBalle.x;
        }
        
        if (balle.center.y > self.view.bounds.size.height || balle.center.y < 0) {
            vitesseBalle.y = -vitesseBalle.y;
        }
        
    // boucle test collision entre balle et briques
        
        for (i = 0; i < [tableauBrique count]; i++) {
            currentBrique = [tableauBrique objectAtIndex:i];
            if (currentBrique.hidden == NO && CGRectIntersectsRect(currentBrique.frame, balle.frame)) {            
                        
                if (balle.center.x == currentBrique.center.x + currentBrique.frame.size.width/2 + balle.frame.size.width/2 || balle.center.x == currentBrique.center.x - currentBrique.frame.size.width/2 - balle.frame.size.width/2) 
                    
                    vitesseBalle.x = -vitesseBalle.x;
                
                else
                    vitesseBalle.y = -vitesseBalle.y;
                
                
                
                // gestion de la vie de chaque brique
                currentVie = [tableauVies objectAtIndex:i];
                currentVie = [NSNumber numberWithInt: [currentVie intValue] - 1];
                    
                switch ([currentVie intValue]) {
                    case 2:
                        currentBrique.image = [UIImage imageNamed:@"BriqueRouge.png"];
                        break;
                    case 1:
                        currentBrique.image = [UIImage imageNamed:@"BriqueJaune.png"];
                        break;
                    case 0:
                        currentBrique.hidden = YES;
                        break;
                    default:
                        break;
                }
                [tableauVies replaceObjectAtIndex:i withObject:[NSNumber numberWithInt:[currentVie intValue]]];
                
                
            }
        }
        
    // test collision entre balle et raquette
        
        if (CGRectIntersectsRect(balle.frame, raquette.frame)) {
            if (balle.center.y < raquette.center.y) 
                vitesseBalle.y = -vitesseBalle.y;
        }
        
        if (balle.center.y > self.view.bounds.size.height) {
            balle.center = CGPointMake(100, 100);
        }
        
    // test pour voir si le joueur a gagne
        
        if (brique1.hidden == YES && brique2.hidden == YES && brique3.hidden == YES && brique4.hidden == YES && brique5.hidden == YES && brique6.hidden == YES && brique7.hidden == YES) {
            [stop3s setText:@"VOUS AVEZ GAGNE !"];
            [stop3s setTextColor:[UIColor colorWithRed:1.0f green:0.0f blue:0.0f alpha:1.0f]];
            [timer1 invalidate];
        }
    }
    
    // creation du geste tactile pour bouger la raquette
    
    -(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
        UITouch *touch = [[event allTouches] anyObject];
        CGPoint Location = [touch locationInView:touch.view];
        raquette.center = CGPointMake(Location.x, 452);
    }
    
    - (void)viewDidUnload
    {
        [self setBrique1:nil];
        [self setBrique2:nil];
        [self setBrique3:nil];
        [self setBrique4:nil];
        [self setBrique5:nil];
        [self setBrique6:nil];
        [self setBrique7:nil];
        [self setStop3s:nil];
        [self setBalle:nil];
        [self setRaquette:nil];
        [super viewDidUnload];
        // Release any retained subviews of the main view.
        // e.g. self.myOutlet = nil;
    }
    


    Merci d'avance ! ;)
    • Partager sur Facebook
    • Partager sur Twitter
      18 juin 2012 à 20:47:33

      J'ai vraiment besoin d'aide svp :)
      • Partager sur Facebook
      • Partager sur Twitter

      [iOS] Besoin d'aide pour les collisions

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown