2011-10-10 31 views
1

我遇到了麻煩, 我需要讓一個對象(Pong paddle)只能沿着屏幕循環移動。 同樣的事情,如果你將有一個恆定的Y軸值,它只會沿着X軸移動,因爲你拖動你的手指,但將其限制爲循環路線。Android - 移動一個對象在圈子裏

有什麼見解? 我看到這個東西 http://www.kirupa.com/developer/mx/circular.htm

,它只有在搞清楚如何不斷地以圓圈移動的東西可以幫助(儘管它已經是閃存,這個想法是一樣的)

感謝

回答

2

這裏是塊我用一個手指旋轉圖像視圖的代碼。

private float mCenterX, mCenterY; 
private float direction = 0; 
private float sX, sY; 
private float startDirection=0; 
private void touchStart(float x, float y) { 
    mCenterX = this.getWidth()/2; 
    mCenterY = this.getHeight()/2; 
    sX = x; 
    sY = y; 
} 

private void touchMove(float x, float y) { 
    // this calculate the angle the image rotate 
    float angle = (float) angleBetween2Lines(mCenterX, mCenterY, sX, sY, x, 
      y); 
    direction = (float) Math.toDegrees(angle) * -1 + startDirection; 
    this.invalidate(); 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    canvas.rotate(direction, mCenterX, mCenterY); 
    super.onDraw(canvas); 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 

    float x = event.getX(); 
    float y = event.getY(); 
    switch (event.getAction()) { 
    case MotionEvent.ACTION_DOWN: 
     // record the start position of finger 
     touchStart(x, y); 
     break; 
    case MotionEvent.ACTION_MOVE: 
     // update image angle 
     touchMove(x, y); 
     break; 
    case MotionEvent.ACTION_UP: 
     startDirection = direction; 
     break; 
    } 

    return true; 
} 

public double angleBetween2Lines(float centerX, float centerY, float x1, 
     float y1, float x2, float y2) { 
    double angle1 = Math.atan2(y1 - centerY, x1 - centerX); 
    double angle2 = Math.atan2(y2 - centerY, x2 - centerX); 
    return angle1 - angle2; 
} 

希望這有助於

編輯:基本上,上面的代碼的作用是讓用戶旋轉圖像,圖像的中心不會改變。 angleBetween2Line()用於計算手指移動到以圖像中心爲中心的圓的程度。

+0

感謝您的快速評論! 我會告訴你我在這裏想要完成的事情, 我想要一個2D乒乓球遊戲,但不是隻限制上/下移動(或右/左)的遊戲板,遊戲發生在一個圓形場。所以我希望能夠在限制的環境中移動槳。 我很難搞清楚你發佈的例子在做什麼,你能詳細說明一下嗎? –

+0

我已經添加了一些關於我的代碼的解釋。我不確定這會幫助你。 – Wenhui

3

圓周上的點可以由函數來定義:

x = a + r cos(θ) 
y = b + r sin(θ) 

凡(A,B)是圓的中心。

根據你想要的速度,你可以說你想每T秒發生一個整圈。如果t是因爲動畫開始時間:

θ = (360/T) * (t % T) 

您可以使用這些功能來創建自己的ViewAnimation,OpenGL的功能,或者如果你正在使用的畫布,設置onDraw()期間槳的位置事件。

+0

謝謝你的回答,但是如果它是動畫,這是有用的。我想通過觸摸來移動它。 基本上,我想要的是一個可移動的槳,只能在屏幕上的圓圈周圍移動。 希望現在清除 –

+0

在這種情況下,您可以使用標準距離函數來確定槳距離圓心的距離。如果超出允許範圍,請不要允許。 (http://www.purplemath.com/modules/distform.htm) – spatulamania

+0

不錯!我喜歡。 有關這方面的另一個問題是,有沒有辦法讓槳(這是相當長和平坦)旋轉的方式,平坦的一面總是面向內部或中心? 再次感謝! –