2014-10-25 1 views
5

필자는 사용자가 이미지의 특정 지점을 클릭해야하는이 게임을 개발하려고 노력해 왔습니다. 필자는 픽셀 위치에 따라이 포인트를 저장하고 있습니다. onTouch 이벤트에서 X 및 Y 좌표를 가져 와서 픽셀을 쉽게 얻을 수 있습니다. 하지만 문제가 직면 한 문제는 매번 픽셀의 정확한 위치를 누르는 것이 실제로 불가능하다는 것입니다. (테스트 목적으로 4 방향 모두 40px로 허용 오차를 설정하십시오.) 그래서 설정 메뉴에서 조정할 수있는 일종의 허용 오차를 설정할 수있는 방법이 있습니다. 그래서 diff 손가락 크기가 다른 사람들이 쉽게 사용할 수 있고 다른 화면 크기에서 재생할 수 있습니까? 어떤 도움이나 제안은 감사이 xMin 및 XMAX은 X 좌표가 될 수있는 최소 및 최대 분노하고 Ymin를하고 Ymax와는 Y 좌표의 최소 및 최대 범위 여기에 접촉 면적을 일정 비율로 늘리는 방법은 무엇입니까?

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 
     }}} 

을 허용됩니다.
XCood 및 YCood는 사용자 터치의 a 및 y 좌표입니다.

+0

사용자 정의'onTouchEvent' 메소드가 작동하면 찾기 모음으로 설정 메뉴를 구현하고 [공유 환경 설정] [1]을 사용하여'tolerance '변수를 저장할 수 있습니다. [1] : http://developer.android.com/guide/topics/data/data-storage.html#pref – JohnDow

+0

이 질문이 허용 오차 설정을 가져 오는 충돌 감지 문제인지 알 수 없습니다. 허용치를 백분율로 계산하는 방법에 대해 설명합니다. 너 정말이 세 가지에 붙어 있니? – CandiedOrange

답변

1

users have to click certain points on a image은 각각 putting invisible/transparent buttons over the image이 아니라 이벤트 처리가 포함 된 이미지를 클릭 한 곳에서 한 곳으로 보내고 어떤 클릭이 어떤 대상과 연결되는지를 결정한다고 말합니다.

enter image description here (가) enter image description here (b)에 enter image description here (C)

이미지가 닮은 경우 의미

(가) 당신이 같이 당신의 점 (픽셀 위치) (B)를 설정 거라고 :

사람들이 그 작은 표적을 공격하기가 매우 어렵 기 때문에 이것은 당연히 문제를 일으키는 것입니다.

당신은 이것을 수정하는 방법을 결정했습니다. 인간의 뚱뚱한 손가락을주기위한 것이며, 지방을 만드는 방법을 조정하려고합니다. 사용자가 1238에 전화를 걸려고 시도하는 유스 케이스를 시도 할 수 있습니다. (c) 손가락의 크기를 늘립니다. 8에 대한 언론이 8 점과 0 점을 모두 다루었을 때부터 나는 그것이 너무 큽니다.

enter image description here (d) enter image description here (E) enter image description here (F)

(d)는이 방식으로 보정하기위한 적당한 크기를 나타낸다. 1과 3은 여전히 ​​그리워합니다. 1은 사각형이 아니기 때문에 단순히 놓칠 수 있습니다.그것은이 뚱뚱한 손가락 접근의 한계입니다. 인간은 실제로 단추 사이에 놓치기 때문에 놓친다. 당신이 3을 세어야한다고 주장한다면 나는 2, 5, & 6이 없으면 어떻게 할 것인지 모른다. 원하는 경우 직사각형 충돌 감지가 필요합니다. 나중에 그 이상.

3을 미스로 처리해야한다고 가정하면 (d)가 (e)와 수학적으로 동일하다는 점을 고려해주십시오. 목표 지점에 공차를 추가하는 것만으로 사용자 손가락이 아닌 목표를 달성 할 수 있습니다. 1과 3은 여전히 ​​미스이지만 사용자 손가락의 비만을 보정하는 것과 관련이 없기 때문에 표적의 크기에 대해서만 우려하고 있습니다.

단순히 이런 식으로 생각하면 목표가 정사각형이 아니란 사실을 자유롭게 처리 할 수 ​​있습니다. 그것들은 직사각형입니다. (f)에서 그렇게하는 것은 1을 놓친 것을 수정합니다. 목표물이 모두 동일한 크기와 비율이면 다른 x 및 y 공차를 사용하여 처리 할 필요가 없습니다. 녹색 버튼을 제대로 처리 할 수 ​​있도록 크기를 변경할 수있는 유연성을 원한다면 모델링 대상을 단일 지점으로 중지하십시오. 모델 번호는 android.graphics.Rect입니다. 실제로 나는 android.graphics.Rect을 포함하는 자신의 클래스로 모델링하는 것을 선호하지만 그것은 다른 시간에 올라갈 OOP 비누 상자입니다.

우리가 이미 OOP 신에 우리의 코를 손때 내가했던 버튼의 생각을 거부 한 이후 지금 r.contains((int) event.getX(), (int) event.getY()); 으로 히트를 감지 할 수 있습니다 당신이 어딘가에]는 new Rect(left, top, right, bottom)와 대상을 정의하고 Rect r;에 할당 한 가정 테스트를 포함하는 모든 타겟을 루프하는 각 클릭에 대해 말한다.

enter image description here (g)

지금, 당신은 정말 2, 3, 5, 6은 모든 트리거 3 명중 사용자 미스가 다음 motionEvent.getSize() 조사시기를 주장합니다. 0에서 1까지 터치의 "fatness"을 측정 할 것입니다. getToolMajor() 또는 getTouchMajor()을 사용할 수있는 경우 실제 터치 한 픽셀을 추정하는 데 도움이 될 수 있습니다. screen size을 알면 도움이 될 수 있지만 문서에서 알 수 있듯이이 중 하나를 사용하여 생성 된 픽셀 크기는 대략적인 값입니다. 일부 테스트는 이것이 작동하는지 또는 스케일링 상수가 필요한지 판단하는 데 도움이됩니다. 손가락이 부딪 치는 것을 보지 않고 압력을 더 가하는 대폭적인 획을주는 페인트 프로그램 용으로 설계 되었기 때문에 예상 한 것보다 작을 수 있습니다.

허용 오차를 사용하여 클릭 주위로 다른 Rect를 작성합니다 (fatFinger). 이미지 위로 r을 제공하는 루프에있는 r.intersects(fatFinger)을 테스트하십시오. 사실이 될 때마다 다른 r을 처리해야합니다.

그러면 (g)와 같은 결과를 얻을 수 있습니다. 이제 3 프레스는 2, 3, 5, & 6 프레스이고, 1 프레스는 이제 1 & 4 프레스이고 8 프레스는 8 & 프레스입니다.

2 기자는 기적적으로 단지 2 기자입니다. 터치 점으로 점을 치는 것만 큼 힘들지 않습니다. 이것은 게임에 좋을 수도 있지만 제 휴대 전화로하지 마십시오. :)

미쳐 가고 싶지 않다면, 약간의 OOP를하고 Rect가 포함 된 타겟을위한 클래스를 만들고 Rect가 지원하는 자신의 intersects 메소드를 제공하십시오. 당신이 루프를들을 수있는 방법은, 각 t을 얻을 t.intersects(fatFinger)에 해당하는 경우 당신은 당신이 모든 것을 만지고 싶어하지 않는 한 짧은에서 t.wasTouched();

자신,이 근처에 온다 대상이 아닌 손가락을 살찌 호출 할 수 있습니다. 그렇다면 둘 모두를 살찌십시오.

(f) 또는 (g)를 선택했는지에 관계없이이 방법을 사용하면 손가락 크기를 구성 할 필요가 훨씬 줄어 듭니다. 해피 코딩!

+0

깊은 생각 때문에 +1. 필요에 따라 필요하지 않은 복잡성을 추가 할 위험이 있지만 훌륭한 분석이 필요합니다! –

+0

감사! 그가 (i) 복잡하지 않도록하는 가장 쉬운 방법은 처음에 언급 한 이미지 트릭 위에 투명 버튼을 사용하는 것입니다. 이것은 (f)에 해당하며 충돌 감지를 손에서 떼어냅니다. – CandiedOrange

+0

@CandiedOrange 도움을 주셔서 감사합니다. 내 문제가 해결되었습니다. :) –

3

터치 디레 게이트 (TouchDelegate)를 살펴 보길 권합니다. 귀하의 질문이 맞다면 정확히 필요한 부분이어야합니다. 설정에서 허용 오차를 얻으면 적절한 크기의 픽셀을 계산하여 델리게이트의 크기를 적절하게 조절할 수 있습니다.

코딩 http://developer.android.com/training/gestures/viewgroup.html#delegate

행복에 좀 더 많은 정보와 샘플 코드가 있습니다!

+0

안녕하세요. @francesco 제안에 감사드립니다. 하지만 문제는 40까지 허용 오차를 설정했기 때문에 더 큰 화면에서 작게 표시 될 수 있습니다. 화면 크기와 함께 동적으로 변경하는 방법이 있습니까? 터치 한 픽셀이 실제와 비슷하다는 것을 확인해야하기 때문에 문제가됩니다. 픽셀. –

+0

허용 오차와 이미지 너비 및 높이를 사용하여 touchdelegate의 크기를 조정하는 방법은 무엇입니까? 0과 1 사이에 공차가 있다고 가정하고 다음과 같이 가정합니다. (이것은 답변에 게시 된 링크에서 수정되었으며 테스트되지 않았습니다) delegateArea.left - = tolerance * myButton.getWidth(); delegateArea.top - 허용 오차 * myButton.getHeight(); delegateArea.right + = tolerance * myButton.getWidth(); delegateArea.bottom + = tolerance * myButton.getHeight(); ' –

0

그래서 난이 쉽게 DIFF 손가락 크기의 사람들이 사용하고 다른 화면에서 재생할 수 있도록 설정 메뉴에서 조정할 수 있습니다 관용의 일종을 설정할 수있는 방법이 지정 크기입니다

정확하게 이해했다면 DP에 내성을 저장하고 화면 밀도에 따라 변환하십시오. 프로그래밍 방식으로 설명하면 다음과 같이 변환 할 수 있습니다. Convert dip to px in Android 사용 가능한 공차 값을 dimens.xml 파일에 저장하고이 값을 여기서 읽습니다.

관련 문제