2011-05-24 44 views
5

Tôi đang rách tóc ra để cố gắng tìm ra những gì có vẻ là một vấn đề rất dễ. Tôi biết rất nhiều thứ này đã được nói về tiếp tuyến, vì vậy xin lỗi nếu điều này treads trên mặt đất được bảo hiểm tốt, nhưng tôi không thể tìm thấy bất cứ điều gì cụ thể cho giải pháp của tôi (tôi tin rằng, tôi đã nhìn).iOS - Kéo đối tượng dọc theo các đường cong

Về cơ bản, tôi muốn kéo một đối tượng/sprite dọc theo một đường cong cong được xác định trước (không chỉ di chuyển nó, mà còn là DRAG IT). Hãy nghĩ về điều "Trượt để mở khóa" của iPhone, nhưng thay vì chỉ kéo thanh trượt sang trái sang phải, hãy tạo đường dẫn hình cung hoặc đường lượn sóng.

suy nghĩ cơ bản của tôi là:

  • xác định một con đường Bút chì, thiết lập các đối tượng ở điểm bắt đầu.
  • nếu đối tượng được chạm vào, hãy kiểm tra phát hiện lần truy cập trên đường bezier trong chạmMoved (hoặc một số chức năng tương tự). nếu chạm trên đường dẫn, hãy đẩy sprite dọc theo đường dẫn cho đến khi đường dẫn kết thúc (trong trường hợp đó, tác vụ được hoàn thành) hoặc ngón tay của người dùng tắt đường dẫn (trong trường hợp đó, đối tượng sẽ quay lại phần đầu).

Không có điều này là tầm thường (ít nhất, đó là cách nó có vẻ). Ví dụ:

  • Thực hiện phát hiện lần truy cập trên đường Bezier là nỗi đau hoàng gia vì bạn thực sự cần thực hiện trên phần vuốt ve chứ không phải phần lấp đầy. Và thậm chí sau đó, tôi dường như không thể tìm thấy một cách để làm điều đó trên một con đường của bất kỳ chiều rộng - chỉ trên con đường 1-điểm rộng của Bezier.
  • Di chuyển một đối tượng một phần dọc theo một con đường thậm chí không thể thấy được: tất cả các phương thức hoạt ảnh di chuyển sprite dọc theo đường dẫn ENTIRE. Ngoài ra, làm điều này đòi hỏi bạn phải tìm điểm trên con đường gần nhất với liên lạc của người dùng, trong đó, nếu bạn đã từng nhìn điều này liên quan đến toán học phức tạp đáng kinh ngạc.
  • Tôi đã nghĩ đến việc sử dụng các vật cứng nhắc để chiếm toàn bộ không gian EXCEPT đường dẫn, vì vậy đối tượng chỉ có thể di chuyển trong đường dẫn. Tuy nhiên, điều này đòi hỏi định nghĩa của các cơ quan cứng nhắc cong một số trong đó phải được lõm. Ngõ cụt.

Tôi có làm điều này quá khó không? Nó không có vẻ phức tạp. Tôi không cần một giải pháp hoàn toàn, chỉ là một cách mới để suy nghĩ về điều này và đá đúng hướng. Bất kỳ trợ giúp sẽ được thực sự đánh giá cao.

+0

Tôi biết điều này đã được hỏi từ lâu nhưng tôi đang chạy vào một thứ rất giống ngay bây giờ và tự hỏi liệu bạn có nhận ra điều này không và có thể giúp hướng tôi xuống con đường chính xác. – gikygik

Trả lời

1

Làm thế nào về điều này?

  • Xem xét trục X của đường bezier của bạn.
  • Mỗi lần người dùng chạm hoặc tương tác với màn hình, chỉ cần xem phần x của liên lạc
  • Bản đồ X Phối hợp với đường dẫn của bạn và di chuyển đối tượng đến đúng vị trí.
+0

Giải pháp này có hoạt động nếu đường cong đi qua cùng một điểm trên trục X nhiều lần không? Ví dụ, nếu đường cong chỉ đơn giản là chữ cái "S". Cùng một điểm X có thể xảy ra nhiều lần cho các điểm Y khác nhau trên đường cong ... – johnnysports

+0

Không. Những gì bạn có thể làm là sử dụng Trục Y để quyết định điểm nào trong đường cong bạn nên điều chỉnh thành – arclight

0

Có, bạn đang làm việc này quá khó.

Hãy đơn giản hóa gợi ý ở trên (hoặc dọc theo một vòng tròn, đường, vv) nếu nó hoạt động cho, hoặc nếu bạn thực sự muốn làm điều đó với một đường cong Bezier, cân nhắc những điều sau đây:

  1. Nhìn vào Định nghĩa đường cong bézier
  2. Điều bạn đang tìm kiếm là xác định vị trí đối tượng mới P 'từ vị trí hiện tại P và thay đổi vị trí cảm ứng D.
  3. Nếu bạn thay đổi cụm từ P (x, y) ban đầu theo t (đường cong béz là tham số), thì vấn đề sẽ trở thành tìm số lượng bù đắp thêm dựa trên D.
  4. Điều gì đó liên quan đến sự khác biệt của bezier fn tại P có thể là một cách tốt để làm điều đó. Tức là, bao nhiêu t đã được thêm vào có đường cong chỉ là một đường thẳng đến từ điểm P dọc theo đường cong.

EDIT: chuyển tiếp giữa các phân đoạn: Nếu mỗi đoạn có t trong [0,1), sau đó bạn có thể phát hiện t> = 1 và chuyển sang phân đoạn tiếp theo, thiết lập P để kết thúc trước phân đoạn và đánh giá lại chuyển động liên quan đến điểm đó. Có thể phải có một số chẩn đoán liên quan nếu bạn có rất nhiều điểm nhỏ, v.v.

+0

Andrew, cảm ơn phản hồi của bạn. Xin hãy chịu đựng với tôi bởi vì tôi thực sự đang cố gắng hiểu điều này nhưng nó vẫn đang lảng tránh tôi. Tôi nghĩ rằng các giải pháp của bạn và arclight có thể không hoạt động cho các đường dẫn phức tạp hơn. Tôi tin rằng (sửa tôi nếu tôi sai) rằng giải pháp của bạn sẽ làm việc nếu đường cong của tôi là một đường cong bezier duy nhất. Tuy nhiên, nếu tôi xây dựng một đường bao gồm nhiều đoạn, một số đường thẳng, một số đường cong bốn, một số cung (mà SDK cho phép), tôi cần tìm ra phân đoạn nào tôi đang ở, và sau đó tính toán vị trí mới. Bạn có thấy tôi đang nói gì không? – johnnysports

+0

Xem ở trên để biết cách xử lý việc này. –

+0

Tôi biết điều này đã được tất cả các yêu cầu một thời gian dài trước đây nhưng tôi đang cố gắng để làm một cái gì đó tương tự bây giờ và đã tự hỏi có thể bạn có thể trả lời này. Tôi muốn kéo dọc theo một hình elip mà tôi đã vẽ bằng cách sử dụng một beizerpath. Có cách nào để có được tất cả các điểm trong hình elip để tôi có thể làm những gì bạn đề nghị ở trên không? – gikygik

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