No Co-Ordination между слоями, в то время как Bakground движется с разной скоростью

Я разрабатываю iPhone-игру с использованием COCOS2d Framework и Objective-C (в ландшафтном режиме/режиме просмотра).

В игре я использую Background, который имеет четыре слоя ( "Небо" сверху, "Гора" ниже неба, "Хилл" ниже горы и "Передний край" ниже). Здесь мне нужно переместить каждый слой фона с другой скоростью, так как "Небо" должно двигаться медленнее, чем "Гора" , "Гора" должна двигаться медленнее, чем Хилл, а "Хилл" должен двигаться медленнее, чем "Передний план".

Пока я перемещаю каждый уровень с другой скоростью, игра испытывает BREAK-UP МЕЖДУ СОКРАЩЕНИЕМ СЛОЕВ.

Я попытался разрешить это с помощью логики, например: увеличение размера изображения/слоя (ширины) в соответствии с его скоростью, чтобы каждый слой заканчивался и снова запускался с координацией. Не удалось заставить его работать.

Это мой код для перемещения фона:

 -(void) backgroundmoving
{

 if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
  //return kDevice_iPad;

  // Code for Each Layer Moving Speed FOR iPad
  bk_f -=1.0;
  bk_f1 -=1.4;
  bk_f2 -=1.8;
  bk_f3 -=2.2;
 } else {

  // Code for Each Layer Moving Speed FOR iPhone
  bk_f -=0.2;
  bk_f1 -=0.4;
  bk_f2 -=0.6;
  bk_f3 -=0.8;

 }

 if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {

  //return kDevice_iPad;
  if (bk_f <= -920*1.1) {bk_f=0;}
  if (bk_f1 <= -920*1.1) {bk_f1=0;}
  if (bk_f2 <= -920*1.1) {bk_f2=0;}
  if (bk_f3 <= -920*1.1) {bk_f3=0;}
  if (bk_f4 <= +920*1.1) {bk_f4=0;}
  } else {
  if (bk_f <= -480*2) {bk_f=0;}
  if (bk_f1 <= -480*2) {bk_f1=0;}
  if (bk_f2 <= -480*2) {bk_f2=0;}
  if (bk_f3 <= -480*2) {bk_f3=0;}
  if (bk_f4 <= +480*2) {bk_f4=0;}


 }

 _level_bkgrnd.position = ccp(bk_f, 0);
 _level_bkgrnd1.position = ccp(bk_f1, 0);
 _level_bkgrnd2.position = ccp(bk_f2, 0);
 _level_bkgrnd3.position = ccp(bk_f3, 0);

}

Выше кода дает мне исходную проблему. Предлагаю ссылки на скриншот для справки:

1) http://screencast.com/t/seUjXClz

2) http://screencast.com/t/8tHq2KYnnMa

Любая помощь, направленная мне в правильном направлении, будет с благодарностью.

Спасибо заранее:)

Ответ 1

cocos2d имеет встроенную поддержку для этого, проверьте код примера с прокруткой Parallax. http://www.cocos2d-iphone.org/archives/22

Ответ 2

Основываясь на вашем вопросе и скриншотах, я интерпретирую вашу проблему в том, что у вас возникают проблемы с тем, чтобы ваши слои плавно перемещались. amleszk был прав, указывая на прокрутку параллакса. Это то, что вы пытаетесь выполнить здесь, и это похоже на то, что ваш подход не работает. Я думаю, что есть проблема, понимающая, что вы подразумеваете под разрывом между координацией слоев. Работать с ним по 1 слою за раз. Получите ваш план для плавного перехода, затем получите следующий слой и т.д. Назад. Ваши слои не будут повторяться одновременно с тем, что они движутся с разной скоростью и достигнут своих конечных точек в разное время. С ваших скриншотов кажется, что более быстрые движущиеся слои не зацикливаются до тех пор, пока ваш самый медленный движущийся слой не начнет свой цикл. Я знаю, что вы пытались бороться с этим, изменяя ширину слоя, чтобы компенсировать, но было бы проще, проще и лучше в целом беспокоиться о каждом слое независимо. Но это только мое мнение.

Если ваша проблема заключается в том, что ваши петлевые слои имеют линию между спрайтами или небольшим дрожанием, то быстрое решение, которое помогло мне дрожаниям/вспышкам между зацикленными спрайтами, было добавление CCDirectorProjection2D в инструкцию init:

-(id) init
{
    if( (self=[super init]))
    {
        [[CCDirector sharedDirector] setProjection:CCDirectorProjection2D];