2011-11-19 73 views
1

我一直在Android上探索Nim Game。球員們要從堆中取物。我使用openGLES繪製對象和堆。我卡在哪裏是如何「採取」。
由於official dev guide 上顯示的樣本,我可以覆蓋onTouchEvent方法中extends GLSurfaceView用於交互的類。但是,我怎樣才能知道物體在哪裏被繪製?或者在我觸摸的座標處是否有任何物體?
任何想法?
Thx提前!openGLES中的觸摸交互

回答

1

如果我正確理解你的問題,這聽起來像你想做一些簡單的碰撞檢測,看看你的觸摸點是否在堆中的對象之一。您可以在觸點座標和用於繪製對象的中心座標之間進行一些基本的數學運算。

例如,假設你的對象是矩形,這將是總體思路:

boolean detectCollision(Object object, TouchPoint touch) { 
     return object.x - object.width/2 <= touch.x && 
      object.x + object.width/2 >= touch.x && 
      object.y - object.height/2 <= touch.y && 
      object.y + object.height/2 >= touch y; 
} 

然後,您可以通過所有的堆對象的迭代,如果這其中任何返回true,則您知道您的接觸點位於該對象的內部,並且可以繼續調用您需要調用的任何接口。

請記住,觸摸座標系統給你的將是屏幕座標,所以你必須考慮到屏幕座標系統和你用視錐體定義的座標系統之間的任何差異。

+0

THX,棘手的事情是我要如何爲「記憶」中的所有對象的座標提供的對象的數量是由用戶 – manuzhang

+0

設置很難不知道你的代碼的細節,只是說你有沒有嘗試將對象存儲在列表中?這樣用戶想創建多少個對象並不重要,然後您可以遍歷該列表並拖動每個對象的x和y座標 – alexc

+0

Yeah,ArrayList – manuzhang

1
public class Main extends Activity implements OnTouchListener { 
public boolean onTouch(View v, MotionEvent event) { 
    synchronized (this) { 
     if (!_isPaused) { 
      if (event.getAction() == MotionEvent.ACTION_DOWN) { 
       _touchedX    = event.getX(); 
      } else if (event.getAction() == MotionEvent.ACTION_MOVE) { 
       float touchedX   = event.getX(); 
       float dx    = Math.abs(_touchedX - touchedX); 
       _dxLowPassed   = lowPass(dx, _dxLowPassed); 

       switch (_screenUsage) { 
        case HALF_SCREEN: 
         if (touchedX < _width/2) { 
          if(touchedX < _touchedX) { 
           _zAngle     = (2 * _dxLowPassed/_width) * TOUCH_SENSITIVITY * ANGLE_SPAN; 
           _zAngleLowPassed  = lowPass(_zAngle, _zAngleLowPassed); 
           GLES20Renderer._zAngle = GLES20Renderer._zAngle + _zAngleLowPassed; 
          } 
         } else { 
          if(touchedX > _touchedX) { 
           _zAngle     = (2 * _dxLowPassed/_width) * TOUCH_SENSITIVITY * ANGLE_SPAN; 
           _zAngleLowPassed  = lowPass(_zAngle, _zAngleLowPassed); 
           GLES20Renderer._zAngle = GLES20Renderer._zAngle - _zAngleLowPassed; 
          } 
         } 
         Log.d("TOUCH", new Float(_zAngleLowPassed).toString()); 
        break;