2014-10-25 16 views
5

Tôi đã cố gắng phát triển trò chơi này, nơi người dùng phải nhấp vào một số điểm nhất định trên hình ảnh. Tôi đã lưu trữ các điểm này dựa trên vị trí pixel của chúng. tôi có thể dễ dàng lấy được điểm ảnh bằng cách lấy tọa độ X và Y trong sự kiện onTouch. Nhưng vấn đề im phải đối mặt là nó thực tế không thể nhấn vị trí chính xác của các điểm ảnh mỗi lần (Vì vậy, cho mục đích thử nghiệm ive thiết lập một dung sai đến 40 px trong tất cả 4 hướng). Vì vậy, có một cách tôi có thể thiết lập một số loại khoan dung mà có thể được điều chỉnh từ menu cài đặt để nó có thể được sử dụng bởi những người có kích thước ngón tay khác một cách dễ dàng và chơi từ các kích cỡ màn hình khác nhau? Bất kỳ sự giúp đỡ hoặc Gợi ý được lòng biết ơn chấp nhậnLàm thế nào để tăng diện tích chạm bằng một tỷ lệ nhất định?

tolerance = 40 
public boolean onTouchEvent(MotionEvent event) { 
    // MotionEvent object holds X-Y values 
    if (event.getAction() == MotionEvent.ACTION_DOWN) { 
     int XCood = (int) event.getX(); 
     int YCood = (int) event.getY(); 
     int XMin = ActXCod[index] - tolerance, 
      XMax = ActXCod[index] + tolerance, 
      YMin = ActYCod[index] - tolerance, 
      YMax = ActYCod[index] + tolerance; 
     if (index < (limit - 1)) // loop to check number of images 
     { 
      if(XCood > XMin && XCood < XMax && YCood > YMin && YCood < YMax){ 
      //Do stuff 
     }}} 

đây xmin xmax và là min và max rage X phối hợp có thể ở và ymin và Ymax là min và max phạm vi của Y phối hợp.
XCood và YCood là tọa độ a và y của liên lạc của người dùng.

+0

Nếu phương thức 'onTouchEvent' tùy chỉnh của bạn đang hoạt động, bạn có thể triển khai thực đơn cài đặt với thanh tìm kiếm và lưu trữ biến' tolerance' bằng [Preferences Preferences] [1]. [1]: http://developer.android.com/guide/topics/data/data-storage.html#pref – JohnDow

+0

Tôi không thể biết câu hỏi này có phải là về vấn đề phát hiện va chạm hay không, nhận được cài đặt dung sai từ người dùng hoặc về cách tính dung sai theo phần trăm. Bạn có thực sự bị mắc kẹt trên cả ba? – CandiedOrange

Trả lời

1

users have to click certain points on a image cho tôi biết rằng thay vì putting invisible/transparent buttons over the image, mỗi lần xử lý sự kiện của riêng nó, bạn đã chọn có bất kỳ nhấp chuột nào trên hình ảnh được gửi đến một địa điểm và sẽ quyết định nhấp chuột nào đi với mục tiêu nào.

enter image description here (a) enter image description here (b) enter image description here (c)

Có nghĩa là nếu hình ảnh của bạn trông giống như (a) mà bạn muốn thiết lập chấm của bạn (địa điểm pixel) tương tự (b):

Điều này là dễ hiểu gây ra cho bạn vấn đề vì nó rất khó cho con người để đạt được những mục tiêu nhỏ.

Bạn đã quyết định cách khắc phục điều này là cung cấp cho các ngón tay con người béo phì và đang cố gắng hiệu chỉnh cách tạo ra chất béo. Cho phép thử một trường hợp sử dụng mà người dùng cố gắng quay số 1238. Trong (c) tôi tăng kích thước ngón tay của chúng khi chúng di chuyển. Kể từ khi báo chí trên 8 bao gồm các dấu chấm từ cả 8 và 0 tôi muốn nói rằng đó là quá lớn.

enter image description here (d) enter image description here (e) enter image description here (f)

(d) cho thấy một kích thước hợp lý để hiệu chỉnh với cách tiếp cận này. Chú ý rằng 1 và 3 vẫn bỏ lỡ. 1 là một đơn giản vì các nút này không phải là hình vuông.Đó là một hạn chế của phương pháp tiếp cận ngón tay béo này. 3 là một lỡ bởi vì con người thực sự bị mất và nhấn giữa các nút. Nếu bạn nhấn mạnh rằng 3 nên đếm tôi không biết làm thế nào chúng tôi muốn làm điều đó mà không có 2, 5, & 6 đếm là tốt. Nếu đó là những gì bạn muốn, chúng tôi cần phát hiện va chạm hình chữ nhật. Thêm về điều đó sau.

Giả sử 3 nên được coi là bỏ lỡ Tôi muốn bạn xem xét rằng (d) là toán học giống hệt nhau (e). Nó có thể đạt được chỉ đơn giản bằng cách thêm sự khoan dung cho các điểm mục tiêu không phải là ngón tay người dùng. 1 và 3 vẫn còn nhớ nhưng bây giờ thay vì được quan tâm với hiệu chỉnh độ béo của một ngón tay người dùng, chúng tôi chỉ quan tâm chính mình với mục tiêu lớn như thế nào.

Đơn giản chỉ cần suy nghĩ theo cách này cho chúng ta thỏa thuận tự do với thực tế là mục tiêu của chúng tôi không vuông. Chúng là hình chữ nhật. Làm điều đó trong (f) sửa lỗi 1 bị bỏ qua. Nếu các mục tiêu của bạn là tất cả cùng kích thước và tỷ lệ bạn không cần phải đối phó với việc sử dụng các dung sai x và y khác nhau. Nếu bạn muốn có sự linh hoạt để thay đổi kích cỡ, do đó bạn có thể xử lý nút màu xanh lá cây đó đúng cách, sau đó dừng lập mô hình các mục tiêu như một điểm duy nhất. Lập mô hình chúng với android.graphics.Rect. Thực ra tôi thích bạn mô hình hóa chúng với lớp riêng của chúng có chứa android.graphics.Rect nhưng đó là hộp xà phòng OOP tôi sẽ trèo lên một số thời điểm khác.

Giả sử bạn đã xác định mục tiêu với một new Rect(left, top, right, bottom)] ở đâu đó và giao nó cho Rect r; bây giờ bạn có thể phát hiện một hit với r.contains((int) event.getX(), (int) event.getY()); Kể từ khi chúng tôi đã thumbed mũi của chúng tôi tại các vị thần OOP và bác bỏ ý tưởng nút Tôi muốn nói cho mỗi nhấp chuột bạn lặp qua tất cả các mục tiêu thử nghiệm chứa().

enter image description here (g)

Bây giờ, nếu bạn thực sự khẳng định rằng 2, 3, 5, và 6 nên tất cả các kích hoạt khi bỏ lỡ dùng đánh 3 sau đó nhìn vào motionEvent.getSize(). Điều đó sẽ đo lường các "fatness" của các liên lạc từ 0 đến 1. Nếu getToolMajor() hoặc getTouchMajor() có sẵn chúng có thể giúp bạn ước tính các điểm ảnh thực tế chạm vào. Nó có thể giúp để biết các screen size nhưng theo như tôi có thể nói từ các tài liệu bất kỳ kích thước pixel được sản xuất bằng cách sử dụng bất kỳ điều này sẽ được gần đúng. Một số thử nghiệm sẽ giúp xác định xem điều này hoạt động như thế nào hoặc nếu bất kỳ hằng số mở rộng nào là cần thiết. Điều này có thể nhỏ hơn mà bạn mong đợi bởi vì chúng được thiết kế cho các chương trình sơn mang lại một cơn đột quỵ táo bạo với áp lực gia tăng, không phải để xem vết sưng ngón tay của bạn thành những thứ.

Sử dụng điều đó giống như khoan dung để xây dựng một Rect khác xung quanh nhấp chuột (cho phép gọi nó là fatFinger). Kiểm tra r.intersects(fatFinger) trong vòng lặp cung cấp cho bạn mọi r trên hình ảnh của bạn. Mỗi lần bạn thấy một số khác là r để giải quyết.

Điều đó sẽ cung cấp cho bạn một cái gì đó như (g). Bây giờ 3 báo chí là một 2, 3, 5, & 6 báo chí, 1 báo chí bây giờ là một 1 & 4 báo chí và 8 báo chí là một 8 & 0 báo chí.

Báo chí 2 là kỳ diệu vẫn chỉ là một 2 báo chí. Kéo nó ra là gần như khó như đánh dấu chấm với dấu chấm cảm ứng. Điều này có thể tốt cho trò chơi của bạn nhưng đừng làm điều đó với điện thoại của tôi. :)

Nếu bạn không muốn phát điên, hãy làm một chút OOP và tạo một lớp cho các mục tiêu của bạn có chứa một Rect và cung cấp phương pháp giao nhau của riêng bạn được hỗ trợ bởi Rect one. Bằng cách đó bạn có thể lặp họ, nhận được mỗi t và khi t.intersects(fatFinger) là đúng bạn có thể gọi riêng t.wasTouched();

Nói tóm lại bạn, vỗ béo các mục tiêu, không phải là ngón tay, trừ khi bạn muốn nó chạm vào mọi thứ nó đến gần. Nếu vậy, vỗ béo cả hai.

Bất kể bạn quyết định đi với (f) hoặc (g) tôi nghĩ bạn sẽ thấy ít cần thiết để người dùng định cấu hình kích thước ngón tay nếu bạn sử dụng phương pháp này. Chúc mừng mã hóa!

+0

+1 vì suy nghĩ sâu sắc. Tùy thuộc vào nhu cầu tôi thấy rủi ro của việc thêm vào sự phức tạp không cần thiết, nhưng phân tích tuyệt vời! –

+0

Xin cảm ơn! Nếu anh ấy không làm (g) cách dễ nhất để tránh sự phức tạp là sử dụng các nút trong suốt trên ảnh lừa tôi đã đề cập ở đầu. Nó tương đương với (f) và phát hiện va chạm khỏi tay bạn. – CandiedOrange

+0

@CandiedOrange cảm ơn sự giúp đỡ của bạn.đã giải quyết được vấn đề của tôi :) –

3

Tôi khuyên bạn nên xem xét TouchDelegate, nếu tôi nhận được câu hỏi của bạn đúng, nó phải chính xác những gì bạn cần. Một khi bạn có sự khoan dung từ các thiết lập, bạn có thể tính số tiền thích hợp của các điểm ảnh để đúng kích thước các đại biểu.

Có một số thông tin và mã mẫu khác tại http://developer.android.com/training/gestures/viewgroup.html#delegate

mã hóa hạnh phúc!

+0

hi @francesco cảm ơn đề xuất. nhưng vấn đề là vì tôi đã thiết lập dung sai cho 40, nó có thể là nhỏ trên một màn hình lớn hơn là có một cách để thay đổi tự động với kích thước màn hình? bởi vì tôi phải đảm bảo rằng các điểm ảnh cảm động gần với thực tế pixel. –

+0

những gì về kích thước touchdelegate bằng cách sử dụng khoan dung và chiều rộng hình ảnh và chiều cao? giả sử bạn có sự khoan dung giữa 0 và 1, giống như sau: (điều này được sửa đổi từ liên kết tôi đăng trong câu trả lời, không được kiểm tra) 'delegateArea.left - = tolerance * myButton.getWidth(); delegateArea.top - = tolerance * myButton.getHeight(); delegateArea.right + = tolerance * myButton.getWidth(); delegateArea.bottom + = tolerance * myButton.getHeight(); ' –

0

Vậy là có một cách tôi có thể thiết lập một số loại khoan dung có thể được điều chỉnh từ menu cài đặt để nó có thể được sử dụng bởi những người có kích thước ngón tay khác một cách dễ dàng và chơi từ màn hình kích thước khác nhau

Nếu tôi hiểu chính xác bạn, hãy lưu trữ dung sai của bạn trong DP và chuyển đổi tùy thuộc vào mật độ màn hình. Lập trình bạn có thể chuyển đổi như mô tả ở đây: Convert dip to px in Android Hoặc lưu trữ các giá trị dung sai sẵn có trong tệp dimens.xml và đọc các giá trị này từ đó.

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