Анимация колес в соответствии с касанием с cocos2D и (?) Box2d на iPad?

У меня есть вопрос о cocos2d и box2d. Мне нужно создать простое колесо, которое вращается в зависимости от того, как пользователь касается колеса для приложения Ipad. Я бы хотел, чтобы при определенных движениях касания колесо начинало с определенной скоростью, а после некоторого вращения начинало уменьшать скорость до полной остановки. (как классическое колесо удачи).

Мне нужна подсказка. Как вы думаете, это возможно сделать, используя только cocos2d? Или я должен использовать Box2D? Я уже начал использовать Box2d, он очень мощный, но можно ли придать объекту определенную начальную скорость вращения и после этого позволить симуляции мира остановить объект?

Большое спасибо! Бенза


person benza    schedule 10.08.2011    source источник
comment
Я должен был сделать то же самое, но для Android. если вы хотите узнать концепцию и математику, напишите комментарий.   -  person blejzz    schedule 10.08.2011
comment
jernej, спасибо, хотелось бы!   -  person benza    schedule 10.08.2011


Ответы (2)


Когда я разработал то же самое на Android, я также не смог найти никаких полезных примеров/статей для реализации этого, поэтому я сделал это следующим образом:

Когда пользователь прикасается к экрану и выполняет пролистывание/пролистывание (проводит пальцем по экрану и убирает его с экрана), вы вычисляете скоростьX и скоростьY в пикселях/секунду (в Android у вас есть метод onFling(float velocitY, float velocitX )).

Затем вы конвертируете скорость, выраженную в пикселях в секунду, в число оборотов в секунду. Это означает, что если пользователи, на которых наведены пальцы, пройдут 1500 пикселей за 1 секунду, ваше колесо будет вращаться X раз. Например, если скорость броска/пролистывания X и скорость Y составляют 1500 пикселей в секунду, а радиус колеса равен 150 пикселей, длину дуги колеса можно рассчитать следующим образом:

      arc = r * PI. (r=150)

Затем вы вычисляете скорость в оборотах в секунду следующим образом:

     spinSpeed = Math.sqrt((speedX*speedX)+(speedY*speedY))/arc)*360   

Когда у вас есть скорость, вы можете изменять угол поворота колеса каждые T миллисекунд (я использовал 40 миллисекунд) следующим образом:

     wheel.angle += spinSpeed;

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

     spinSpeed -= drag_value;
     wheel.angle += spinSpeed;

Вы должны настроить drag_value на желаемый эффект (насколько быстро он замедляется). Вы также можете умножить spinSpeed ​​на константу, чтобы получить более высокую скорость (я использовал 40).

Эта реализация не включает колесо, следующее за пальцем пользователя. Для этого вам нужно рассчитать, на сколько сместился палец пользователя с момента последнего касания экрана (для координат X и Y). Итак, вам нужны 2 координаты (lastTouchX, lastTouchY, newTouchX, newTouchY). Когда у вас есть координаты, вы можете рассчитать наклон или градиент линий, которые проходят через эти координаты (наклон/градиент равен K в этой формуле: y = kx +n - стандартная формула линии). Затем вам нужно рассчитать угол пересечения между этими двумя линиями и применить его к колесу. Что-то вроде этого:

      tg = ((k1-k2)/(1+(k1*k2))); // k1 is the slope of the previous touch coordinate; k2 is the slope of the current touch coordinates                     
      angle =   Math.toDegrees(Math.atan(Math.abs(tg)));
      wheel.angle += angle; // to implement spinning in the other way use wheel.angle -= angle;

Надеюсь, вы поняли идею

person blejzz    schedule 10.08.2011
comment
Большое спасибо за подробный ответ! Попробую реализовать ваш способ на Ios с помощью cocos2d! Надеюсь, у меня это получится! - person benza; 10.08.2011

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

person Gaurav_soni    schedule 07.09.2011