не могу сообразить...

Тема в разделе "WASM.HEAP", создана пользователем varnie, 12 ноя 2007.

  1. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    hell-o!

    проблемка следующая: есть 2d-скроллер, в кот-м бегает перец, уровень поделен на области равные в длину ширине экрана, т.е. каждый имеет длину SCREEN_WIDTH. при движении если перец находится не в крайних полуэкранах, то он отрисовывается в центре экрана по горизонтальной оси, а декорации уровня сдвигаются отн. него влево или вправо в зависимости от направления его текущего движения на величину его смещения. по достижении конечных левого или правого полуэкрана перец при движении далее в сторону уже смещается от середины экрана в сторону, т.е. тем самым достигается то, чтобы при нахождении перца в крайних экранах они далее отн. него не скроллились влево-вправо, а напротив перец приближался к ним постепенно. тут все ок.
    сейчас мне нужно определять х-координату перца в любой момент времени и с этим проблемка. крайние левый и правый полуэкраны подсчитать ниже в коде получается, а все оставшееся пространство нет, т.к. формула неверна. подскажите плиз, что должно быть в последней ветке оператора-if ? сейчас ф-ла работает если перец пробежал не более 1 экрана в длину, а далее косячит. я уже туплю чего-то, не соображу сразу.
    в любом случае подсчитанная x-координата перца должна лежать в отрезке [0,SCREEN_WIDTH].

    Код (Text):
    1. if ( pos.x < 0 )    //самый крайний слева полуэкран
    2.         {  
    3.             mapx = SCREEN_WIDTH/2 - abs(pos.x )/2;
    4.         }
    5.         else if ( pos.x >  (SCREEN_WIDTH * totalScreens ) - SCREEN_WIDTH) ) //правый конец
    6.         {   //самый правый полуэкран
    7.             mapx = SCREEN_WIDTH/2 + (_heroPos.x - SCREEN_WIDTH*(_heroPos.x/SCREEN_WIDTH) ) / 2;
    8.         }
    9.         else
    10.         {  
    11.                         //!!!
    12.                         //все оставшееся пространство (сейчас ф-ла неверна)
    13.             mapx = (SCREEN_WIDTH/2 + pos.x  ) % SCREEN_WIDTH;
    14.         }
    спасибо всем, кто меня на верное решение наведет.
     
  2. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.242
    когда что-то не ясно, играй параметрами - и всё будет видно.
     
  3. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    UbIvItS,
    знаю. но не могу тем не менее сообразить. уже играю все свободное время с параметрами..
    когда длина левела равна 2 экранам, то все ок, в вышеприведенном if-е последнее присваивание верно, и все ок. но если 3 экрана и более в длину левел - уже неверный рез-т дает.
    Код (Text):
    1. mapx = (SCREEN_WIDTH/2 + _heroPos.x  ) % SCREEN_WIDTH;
     
  4. slow_at_work

    slow_at_work New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2007
    Сообщения:
    64
    наблюдается корреляция между

    SCREEN_WIDTH/2

    длина левела равна 2 экранам, то все ок
     
  5. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    slow_at_work
    да, верно.

    cейчас решил вот так:
    Код (Text):
    1.                  if ( pos.x < 0 )   //самый крайний слева полуэкран
    2.         {  
    3.             mapx = SCREEN_WIDTH/2 - abs(pos.x )/2;
    4.         }
    5.         else if ( pos.x > (SCREEN_WIDTH * totalScreens) - SCREEN_WIDTH) )   //правый конец
    6.         {   //самый правый полуэкран
    7.             mapx = SCREEN_WIDTH/2 + (_heroPos.x - SCREEN_WIDTH*(_heroPos.x/SCREEN_WIDTH) ) / 2;
    8.         }
    9.         else
    10.         {   //!!! вот здесь исправлено
    11.                         if ( pos.x <  SCREEN_WIDTH )
    12.                 mapx = (SCREEN_WIDTH/2 + pos.x) % SCREEN_WIDTH;
    13.             else           
    14.                 mapx = (pos.x - SCREEN_WIDTH/2) % SCREEN_WIDTH;
    15.         }
    но чисто интуитивно (иногда сам себе удивляешься), и пока я осмыслить эту строчку не могу, хотя все теперь стало работать как и требовалось!!!
     
  6. slow_at_work

    slow_at_work New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2007
    Сообщения:
    64
    Гм. Значит все же мысль моя не в том направлении :dntknw:(