Анимация колесика в соответствии с touch с cocos2D и (?) Box2d на iPad? - PullRequest
1 голос
/ 10 августа 2011

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

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

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

Ответы [ 2 ]

0 голосов
/ 07 сентября 2011

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

0 голосов
/ 10 августа 2011

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

Когда пользователь касается экрана и делает бросок/ swipe (перемещает палец по экрану и удаляет его с экрана) вы вычисляете скорость X и скорость Y в пикселях / секунду (в андроиде у вас есть метод 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;

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

...