Android - перемещение объекта по кругу

У меня что-то не получается, мне нужно сделать так, чтобы объект (весло для понга) двигался только по круговому маршруту вдоль экрана. то же самое, как если бы у вас было постоянное значение оси Y, и оно перемещалось бы только вдоль оси x, когда вы перетаскивали на него палец, но ограничивало бы его круговым маршрутом.

любые идеи? Я видел эту штуку http://www.kirupa.com/developer/mx/circular.htm

и это только помогает понять, как двигать что-то постоянно по кругу (хотя это Flash, идея та же)

Спасибо


person La bla bla    schedule 10.10.2011    source источник


Ответы (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() вычисляет степень, в которой палец переместился по кругу, центр которого является центром изображения.

person Wenhui    schedule 10.10.2011
comment
Спасибо за быстрый комментарий! Я скажу вам, чего я пытаюсь добиться здесь: я хочу 2D-игру в понг, но вместо весла, ограниченного движением только вверх/вниз (или вправо/влево), игра происходит в круглом поле. поэтому я хочу иметь возможность перемещать весло по ограниченному кругу. У меня возникли проблемы с выяснением того, что делает пример, который вы разместили, можете ли вы уточнить, пожалуйста? - person La bla bla; 10.10.2011
comment
Я добавил небольшое объяснение того, что делает мой код. Я не уверен, что это поможет вам или нет. - person Wenhui; 10.10.2011

Точки на окружности могут быть определены функциями:

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

Где (a,b) — центр окружности.

В зависимости от желаемой скорости вы можете сказать, что хотите, чтобы полный круг совершался каждые T секунд. И если t - это время, прошедшее с начала анимации:

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

Вы можете использовать эти функции для создания собственной функции ViewAnimation, OpenGL или, если вы используете холст, для установки положения ракетки во время события onDraw().

person spatulamania    schedule 10.10.2011
comment
Спасибо за ответ, но это полезно, если он был анимирован. я хочу переместить его с прикосновением. По сути, мне нужна подвижная ракетка, которую можно перемещать только по окружности круга на экране. Надеюсь, теперь все ясно - person La bla bla; 10.10.2011
comment
В этом случае вы можете использовать стандартную функцию расстояния, чтобы определить, насколько далеко весло находится от центра круга. Если это будет дальше, чем разрешено, не позволяйте этого. (purplemath.com/modules/distform.htm) - person spatulamania; 10.10.2011
comment
Хороший! Мне это нравится. еще один вопрос по этому поводу: есть ли способ, чтобы лопатка (которая довольно длинная и плоская) вращалась таким образом, чтобы плоская сторона всегда была обращена внутрь или к центру? Спасибо еще раз! - person La bla bla; 10.10.2011
comment
Да. Я не уверен, как выглядит ваш код, но если вам нужен угол от центра до точки относительно горизонтальной оси, вы можете использовать эту формулу: angle = atan2(y2 - y1, x2 - x1) * 180 / PI - person spatulamania; 10.10.2011