2015-10-16 23 views
6

Tôi bắt đầu học Swift2 để phát triển trên iOS bằng SpriteKit và tôi dường như không thể phát hiện được nếu tôi chạm vào phần hiển thị của Sprite.Phát hiện cảm ứng bên trong hộp giới hạn (mặt nạ alpha) của Sprite bằng SpriteKit

Tôi có thể tìm thấy trong đó nút cảm động như thế này:

let touchedNode = self.nodeAtPoint(location) 

Nhưng điều này phát hiện các liên lạc trên sprite. Tôi muốn phát hiện các liên lạc trên phần "không minh bạch" của sprite chỉ.

tôi đã cố gắng tạo ra một PhysicsBody với một hộp bounding alpha mặt nạ và thử nghiệm nếu khung giới hạn của các nút tôi đã chọn chứa các vị trí của các liên lạc như thế này:

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

Nhưng nó đã không giúp đỡ. Nếu tôi nhấp vào một phần trong suốt của sprite của tôi, sự kiện vẫn kích hoạt.

Tài liệu nói rằng "Một cơ thể vật lý mới được tạo bao gồm tất cả các texels trong kết cấu có giá trị alpha không phải là.", Vậy nó có hoạt động không?

Cảm ơn thời gian của bạn.

PS: Tôi cũng đã cố gắng rộng rãi hơn trên ngưỡng alpha của mình, nhưng điều này cũng không hoạt động (trong trường hợp tính minh bạch của tôi không hoàn hảo).


UPDATE:

Để thêm một chút chi tiết, Tôi đang xây dựng một trình soạn thảo cấp. Điều này có nghĩa rằng tôi sẽ tạo ra nhiều nút, tùy thuộc vào những gì người dùng chọn, và tôi cần để có thể chọn/di chuyển/xoay/etc các nút đó. Tôi thực sự đang sử dụng SKSpriteNodes vì ​​hình ảnh PNG của tôi được tự động thêm vào xcassette theo cách đó. Tôi quyết định sử dụng hộp giới hạn Alpha Mask của PhysicsBody, vì giá trị này được hiển thị trong Trình chỉnh sửa cảnh (Xcode) khi bạn chọn một nút và khi được chọn, Mặt nạ Alpha sẽ tô sáng chính xác phần của Sprite mà tôi muốn có thể phát hiện một liên lạc bên trong.

Nếu tôi đang sử dụng sai ý tưởng/kỹ thuật, vui lòng cho tôi biết. Điều này là có thể vì tôi chỉ bắt đầu sử dụng Swift và SpriteKit.


UPDATE 2

tôi truy vấn các physicsWord (theo khuyến cáo) để có được những physicsBody đúng và có tên của nút gắn liền như thế này:

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

Nhưng điều này vẫn còn in tên của nút ngay cả khi tôi chạm vào bên ngoài hộp giới hạn, điều này không có ý nghĩa với tôi.

Xin cảm ơn sự giúp đỡ của bạn.

+0

Bạn đã tìm thấy cách tốt để thực hiện việc này chưa? – Confused

Trả lời

2

SKPhysicsBody không xác định giới hạn của SKNode. Bạn có thể thực hiện kiểm tra lượt truy cập bằng cách truy vấn SKPhysicsWorld cảnh của bạn bằng cách gọi bodyAtPoint trên đó. Điều đó sẽ trả lại số SKPhysicsBody mà bạn quan tâm.

+0

Dường như với tôi điều này sẽ tránh được con voi trong phòng. Tôi đang làm điều đó một cách sai lầm? Thực hành tốt để phát hiện cảm ứng trên objets của cảnh, từ hộp giới hạn của chúng (mặt nạ alpha) là gì?Ý tôi là, giải pháp đó rõ ràng là một vụ hack xung quanh một vấn đề cơ bản hơn mà tôi có, phải không? Cảm ơn bạn vì sự kiên nhẫn của bạn. –

+0

câu trả lời của tôi là thay đổi nội dung tốt hơn và có vẻ là "đúng" cách để phát hiện chạm vào SKSpriteNodes –

+0

Hum, tôi đã cố gắng làm "self.physicsWorld.bodyAtPoint (địa điểm)" và điều này trả về sprite của tôi chính xác theo cùng một cách, không quan tâm đến các hộp bounding, ngay cả khi hộp bounding của tôi là chính xác (tôi có thể kiểm tra nó bằng cách di chuyển Objet, nó va chạm một cách chính xác với objets khác bằng cách sử dụng alpha đeo mặt nạ hộp bounding tôi đang cố gắng để phát hiện liên lạc trên). –

Các vấn đề liên quan