2015-02-21 1 views
0

Если у меня есть приложение openGL, у которого есть 2 потока (не созданные мной, это стандартные «предоставленные» потоки). Те существа:Любой способ получить координаты касания от не-UI-потока

  • GLRendering нить
  • Главных/UI нить

И позволяет сказать, что в моем рендеринге нити Обращает спрайт следующим образом: (методы, показанные мои собственные методы)

sprite.draw(); //This will draw the sprite at it's own internal X and Y coordinates 

Теперь на UI тему, я захватить текущее положение пальца: (происходит следующее в onTouchEvent (MotionEvent событие)) ....

case MotionEvent.ACTION_MOVE: { 

    sprite.setX(event.getX()); 
    sprite.setY(event.setY()); 

} 

Итак, случается так, что мой спрайт рисуется там, где палец позволяет пользователю перетащить его по экрану.

Тем не менее, очевидно, что два потока не гарантируется для запуска 'поочередно' следующим образом:

интерфейс резьбы: Захват положение пальца и установить (X: 10, Y: 10)

рендерер резьбы: Розыгрыш в 10, 10

интерфейс резьбы: Захват положение пальца и установить (X: 22, Y: 31)

Renderer Thread Розыгрыш на 22, 31 и т.д. .......

выше является большим, но то, что происходит, когда это происходит:

UI тему: Захват положение пальцев и установить (X: 10, Y: 10)

Renderer тема: нарисовать на 10, 10

Renderer Тема: Нарисовать на 10, 10 < < Рисует снова в том же положении, даже если палец физически в настоящее время переехал в другое место, что приводит к смещению между экранной позиции объекта и физической positionon пальца, части экрана

интерфейс резьбы: положение пальцев захвата и установить (X: 22, Y: 31)

рендерер резьбы дро на 22, 31 и т.д. .......

Это может показаться причиной «изменчивости» на чертеже объекта.

Итак, что я спрашиваю, есть ли какой-либо способ силы рендеринг нить какой-то образом восстановить фактическое текущее физическое положение указателя в настоящее время вниз/палец, прежде чем он рисует его? Или какое-то другое решение проблемы? (Положите просто, что поток рендеринга всегда должен иметь доступ к текущей позиции, а не к предыдущей позиции).

ответ

1

Короткий ответ НЕТ!

Проблема, с которой вы столкнулись, связана не с двумя параллельными потоками. Вместо этого, это связано с тем, что либо

  • Ваша частота кадров слишком низкая
  • Ваше движение так быстро, что зыбь становится видимым.

Решение первой проблемы заключается в том, чтобы профилировать приложение и сократить время задержки - попробуйте достичь номинальной частоты кадров 60 кадров в секунду.

Решение второй проблемы, однако, является лишь небольшим трюком. Вместо того, чтобы регулировать положение спрайта точно в точках вашего касания, заставьте его двигаться в направлении точки касания.

Сырую реализация выглядит так:

case MotionEvent.ACTION_MOVE: { 

    sprite.setNewX(event.getX()); 
    sprite.setNewY(event.setY()); 

} 

В вашем Sprite класса добавить эти:

private int mNewX, mNewY; 

public void setNewX(int x){ 
    mNewX = x; 
} 
public void setNewY(int y){ 
    mNewY = y; 
} 

добавить эти две строки в метод вытягивания вашего класса Sprite:

public void draw(){ 

    this.x = this.x + (int)(0.5 * (this.newX-this.x)); 
    this.y = this.y + (int)(0.5 * (this.newY-this.y)); 
// of course, you can get rid of the "this" keywords above. I just put them there for the sake of clarity. 

// drawing stuff 

} 
+0

Привет @ Kasra - Не уверен, что я понимаю. Я также пробовал что-то похожее на то, что вы предлагаете (получение суммы, которую двинул палец и добавление ее в pos спрайта). Но, когда onTouch «пропущен», это значение становится 0, и спрайт не перемещается для этого тика, а затем на следующем, он ловит и перемещается в два раза. Таким образом, с пальцем, движущимся с постоянной 10 px за галочку. Он переместит 10, нарисует на +10, переместит 10, затем (если onTouch пропустит) переместится 0, затем на следующий шаг галочки 20, Если я понимаю вас, все, что вы делаете, уменьшает вдвое эту сумму, чтобы она не двигалась с пальцем, но медленнее? – Zippy

+0

Thnk прокрутки, вот что мне нужно. Объект «прилипает» к пальцу независимо от того, насколько быстро или медленно движется палец. Мне нужно найти способ сказать: «Вместо того, чтобы перемещаться 0, затем 20 на следующий тик, просто переместите 10 на оба тика», чтобы сохранить согласованность. Подобно Linear Interpolation, я предполагаю, что я уже использую в своем основном цикле (для моих спрайтов). – Zippy

+0

Итак, да - все, что вам нужно сделать, это реализовать описанный мной метод. Я добавил больше деталей, чтобы было легче понять. – Kasra

Смежные вопросы