Intersecția dintre mai multe imagini în Xcode

Hei guys am făcut un joc în care un utilizator apasă un buton și de fiecare dată când apasă butonul, ecranele adaugă un nou UIImageView (care este același de fiecare dată). Aceste vizualizări UIImageView sunt separate cu funcția UITouch. Dar vreau să detecteze și o intersecție! Și vreau să știu care sunt cele două UIImageViews intersectate astfel încât să pot modifica imaginea-url a celor două UIImageViews care sunt intersectate.

-(IBAction)ClTouched:(id)sender {

imgView2 = [[UIImageView alloc] initWithFrame:CGRectMake(120, 20, 80, 80)];
imgView2.backgroundColor = [UIColor clearColor];
imgView2.userInteractionEnabled = TRUE;
imgView2.image = [UIImage imageNamed:@"Cl.png"];

[self.view addSubview:imgView2];

}

// Pentru a muta imaginea cu atingere Poți - (void) atingeModificat: (NSSet *) atinge cu EventEvent: (UIEvent *) eveniment {     imgView.userInteractionEnabled = TRUE;

// get touch event
UITouch *touch = [[event allTouches] anyObject];
CGPoint touchLocation = [touch locationInView:self.view];

if ([self.view.subviews containsObject:[touch view]]) {
    [touch view].center = touchLocation;
}

if (CGRectIntersectsRect(imgView.frame, imgView2.frame)) {
    naam.text = @"INTERSECTION";
}

}

Sper că sunt suficiente informații pentru a mă ajuta!

0

2 răspunsuri

Ați folosi CGRectIntersectsRect() pentru a vedea dacă un UIImageView se intersectează cu altul. Exemplu de mai jos ..

EDIT: Realizat după aceea că ați implementat deja metoda CGRectIntersectsRect() . Dacă aveți o serie de alte imagini pe care le puteți accesa, în timp ce trageți imaginea pe care doriți să o comparați, puteți face acest lucru

   for(UIImageView *image in yourArrayOfImages) {

         if(CGRectIntersectsRect(self.frame,[image frame])) {

              NSLog(@"self overlaps %@",image);
              //Now you know self is overlapping `image`, change the URL.

          }

    }

Fiind că ai multipli ai acestor imagini, ar trebui să faci o buclă prin toate imaginile tale și să folosești metoda de mai sus pentru a determina ce imagini se intersectează.

0
adăugat
Acest lucru nu va funcționa, deoarece dacă vă uitați în apropierea codului veți vedea că imgView2 este adăugat de fiecare dată când apăsați butonul (ceea ce trebuie făcut) dar nu pot face: dacă (CGRectIntersectsRect ([imgView2 frame], [ imgView2 cadru])) {NSLog (@ "Image2 și Image2 Overlap"); } Care va duce la faptul că se intersectează întotdeauna.
adăugat autor Polo Swelsen, sursa
Cred că nu te înțeleg. Acum am: `imgView2.userInteractionEnabled = TRUE; UITouch * atinge = [[event allTouches] anyObject]; CGPoint touchLocation = [atingeți locațiaInView: self.view]; pentru (imaginea UIImageView * în imagini) {if (CAGectIntersectsRect ([view view] .frame, [image frame])) {naam.text = [NSString stringWithFormat: @ "self overlaps% @", imgView2]; }}} "Dar nu văd cum va rezolva aceasta
adăugat autor Polo Swelsen, sursa
Păstrați o matrice de referință care stochează toate Imaginile adăugate, este ceea ce ar trebui să faceți. În acest fel, trebuie să verificați ceva.
adăugat autor skram, sursa

Abordarea mea

Am avut o problemă similară într-un joc pe care l-am creat în cazul în care obiectivele au apărut pe ecran cu diferite culori și proprietăți. Modul în care m-am apropiat a fost folosirea unui NSMutableDictionary și stocarea fiecărei țintă care a fost un buton și apoi eliminarea acestora când am încetat să le folosesc.

Crearea imaginilor

Aș crea un nou UIImageView de fiecare dată când utilizatorul a apăsat acel buton și apoi îl stochează într-un dicționar care conține fiecare UIImageView. Le-aș păstra cu o cheie unică ca "1" sau "2". În acest fel, puteți salva numărul ca etichetă în cadrul imaginii și apoi obțineți numărul mai târziu, care este de fapt cheia UIImageView. Cu alte cuvinte, eticheta UIImageView este aceeași cu valoarea cheie pe care o stochează în dicționar.

coliziune

Am întâmpinat și această problemă și am găsit o soluție.

-(BOOL) checkIfFrame:(CGRect)frameOne collidesWithFrame:(CGRect)frameTwo {
    return (CGRectIntersectsRect(frameOne, frameTwo));
}

Această metodă returnează o instrucțiune TRUE sau FALSE dacă frameA colizează cu frameB .

Exemplu de utilizare NSMutableDictionary

NSMutableDictionary * imageViewsDictionary;
int lastImageViewNumber = 0;

-(IBAction *) addNewImageView {
    UIImageView * newImageView;

    newImageView.image = [UIImage imageNamed:@""]; //Your Image
    newImageView.frame = CGRectMake:(0, 0, 0, 0); //Your Frame
    newImageView.tag = lastImageViewNumber;

    NSString * currentKey = [NSString stringWithFormat:@"%d", lastImageViewNumber];
    [imageViewsDictionary setObject:newImageView forKey:currentKey];

    [self.view addSubview:newImageView];

    lastImageViewNumber ++;
}

-(void) removeImageView:(id)sender {
    UIImageView * imageView = (UIImageView *)sender;

    [imageView removeFromSuperview];

    NSString * key = [NSString stringWithFormat:@"%d", imageView.tag];
    [imageViewsDictionary removeObjectForKey:key];

    lastImageViewNumber --;
}
0
adăugat
Bine, mulțumesc foarte mult și cum/unde ar trebui să numesc acest BOOL?
adăugat autor Polo Swelsen, sursa
Ar trebui să apelați acest lucru ori de câte ori doriți să aflați dacă un obiect intersectează un alt obiect. O modalitate de a face acest lucru este crearea unui cronometru care rulează o metodă diferită consecutiv, care apoi execută această metodă pentru a verifica dacă un obiect se ciocnește cu altul.
adăugat autor Fernando Cervantes, sursa