2015-10-16 17 views
6

Zaczynam uczyć się Swift2 rozwijać na iOS przy użyciu SpriteKit i nie mogę wykryć, czy dotknąłem widocznej części mojego Sprite.Wykrywanie dotyku wewnątrz obwiedni (maska ​​alfa) Sprite przy użyciu SpriteKit

znajdę której węzeł był poruszony tak:

let touchedNode = self.nodeAtPoint(location) 

Ale to wykryć dotyk na ikonki. Chciałbym wykryć dotyk tylko na "nieprzejrzystej" części duszka.

Próbowałem tworzenia PhysicsBody z obwiedni maski alfa i testowanie, jeśli obwiednia węzła I wybranego zawiera lokalizację w dotyku tak:

sprite.physicsBody = SKPhysicsBody.init(texture: sprite.texture!, size: sprite.size) 
sprite.physicsBody?.affectedByGravity = false 
if (touchedNode.containsPoint(location)){ 

Ale to nie pomogło. Jeśli kliknę przezroczystą część mojego duszka, zdarzenie nadal się uruchamia.

Dokumentacja mówi: "Utworzono nowy korpus fizyki, który zawiera wszystkie tekły w teksturach, które mają niezerową wartość alfa.", Więc czy to nie powinno działać?

Dzięki za poświęcony czas.

PS: Próbowałem też być bardziej hojny na progu alfa, ale to też nie zadziałało (na wypadek, gdyby moja przezroczystość nie była doskonała).


UPDATE:

dodać trochę więcej szczegółów, buduję edytor poziomów. Oznacza to, że utworzę wiele węzłów, w zależności od tego, co wybierze użytkownik, i muszę mieć możliwość wybrania/przeniesienia/obrócenia/etc tych węzłów. W rzeczywistości używam SKSpriteNodes, ponieważ moje obrazy PNG są automatycznie dodawane w xcassette w ten sposób. Postanowiłem użyć ramki ograniczającej Alpha Mask PhysicsBody, ponieważ ta wartość jest pokazywana w edytorze sceny (Xcode) po wybraniu węzła, a po jej zaznaczeniu Maska Alfa podświetla dokładnie część mojego Sprite, którą chcę móc wykryć dotyk w środku.

Jeśli używam niewłaściwych pomysłów/technik, proszę powiedz mi. Jest to możliwe, ponieważ dopiero zaczynam używać Swift i SpriteKit.


UPDATE 2

I zapytaliśmy o physicsWord (zgodnie z zaleceniami), aby uzyskać prawo physicsBody i dostał imię załączonym węzła tak:

let body = self.physicsWorld.bodyAtPoint(location) 
print(body?.node?.name) 

Ale to nadal jest drukowanie nazwa węzła, nawet jeśli dotknę poza obramowaniem, co nie ma dla mnie żadnego sensu.

Dziękuję i tak za pomoc.

+0

Znalazłeś dobry sposób na zrobienie tego? – Confused

Odpowiedz

2

Numer SKPhysicsBody nie określa granic SKNode. Możesz wykonać test trafień, wysyłając zapytanie do SKPhysicsWorld swojej sceny, dzwoniąc pod numer bodyAtPoint. To zwróci SKPhysicsBody, które Cię interesuje.

+0

Wydaje mi się, że uniknęłoby to słonia w pokoju. Czy robię to w niewłaściwy sposób? Jaką dobrą praktykę można wykryć na obiektach sceny z ich obwiedni (maska ​​alfa)?Chodzi mi o to, że to rozwiązanie jest najwyraźniej włamaniem do bardziej fundamentalnego problemu, jaki mam, czyż nie? I tak dziękuję za cierpliwość. –

+0

Moja edytowana odpowiedź jest lepsza i wydaje się być "właściwym" sposobem wykrywania dotknięć na SKSpriteNodes –

+0

Hum, próbowałem robić "self.physicsWorld.bodyAtPoint (lokalizacja)" i to zwraca mój duszek dokładnie w ten sam sposób, nie dbając o ramka graniczna, nawet jeśli moja ramka ograniczająca jest poprawna (mogę ją przetestować przesuwając objet, koliduje poprawnie z innymi obiektami za pomocą maskowanej ramki ograniczającej alfa Próbuję wykryć dotyk). –

Powiązane problemy