2010-10-16 9 views
8

Dodajemy funkcję przeciągania i upuszczania do tego, co ma stać się polem sportowym z pozycjami dla graczy.iOS - Przeciągnij i upuść wykrywanie kolizji Jak wykryć, kiedy wybrany element przeciąga nad innym podzbiorem?

Pozycje są mapowane za pomocą Konstruktora interfejsów, z których każdy jest oddzielnym obiektem UIImageView.

Chcemy mieć możliwość przeciągania obrazów gracza z pozycji stołu z boku ekranu na pozycje na polu.

W jaki sposób możemy wykryć, kiedy wybrany gracz, który jest przenoszony, koliduje z istniejącym obrazem pozycji gry?

Szukamy sposobu na wykrycie, czy w obecnej lokalizacji znajduje się widok lub ImageView.

-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *touch = [[event allTouches] anyObject]; 
    CGPoint location = [touch locationInView:touch.view]; 
    tile1.center = location; 

    if gamePositionExistsAtCurrentLocation(location) { //want something like this 
    [tile1 setBackgroundColor:[UIColor blueColor]]; 
    } else { 
    [tile1 setBackgroundColor:[UIColor yellowColor]]; 
    } 
} 

Odpowiedz

14

sprawdzić, czy rama elementu, który poruszają przecina się z ramy ze na swoich subviews

for (UIView *anotherView in self.subviews) { 
    if (movingView == anotherView) 
     continue; 
    if (CGRectIntersectsRect(movingView.frame, anotherView.frame)) { 
     // Do something 
    } 
} 

If I were you, chciałbym dodać wszystkie gry odpowiednie pozycje do NSArray i -pętli przez to. Więc nie wykrywasz kolizji z subskrybentami, które nie mają nic wspólnego z twoją grą, jak etykiety i tak dalej.

+0

Więc chodzi o to, że za każdym razem przejść biegnę przez tablicę obiektów i zobaczyć, czy pasuje do mojej bieżącej lokalizacji (ale przy użyciu klatkę zamiast jak wspomniałeś)? – Evolve

+0

Czy są jakieś metody dostarczone przez Apple, z których mogę skorzystać, aby poinformować mnie, które subviews obecnie przecinają się z określonym punktem? – Evolve

4

Również warto rozważyć view.center z CGRectContainsPoint()

+0

Metoda przyjmuje następujący format: CGRectContainsRect (<# CGRect rect1 #>, <#CGRect rect2 #>) w jaki sposób reprezentuję view.center lub location.centre jako rect? – Evolve

+0

Nie CGRectContainsRect(), mówiłem używać CGRectContainsPoint(). Nie używaj pierwszego, chyba że Twój prostokąt kropli jest znacznie większy, ponieważ zwraca on tylko wartość true, jeśli jeden prostokąt znajduje się całkowicie wewnątrz innego. – Nimrod

+0

Przepraszam, moje złe .. tęsknię za czytaniem ... dzięki. Posortowałem to. Twoja sugestia była bardzo pomocna. – Evolve