На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! правила раздела Алгоритмы
1. Помните, что название темы должно хоть как-то отражать ее содержимое (не создавайте темы с заголовком ПОМОГИТЕ, HELP и т.д.). Злоупотребление заглавными буквами в заголовках тем ЗАПРЕЩЕНО.
2. При создании темы постарайтесь, как можно более точно описать проблему, а не ограничиваться общими понятиями и определениями.
3. Приводимые фрагменты исходного кода старайтесь выделять тегами code.../code
4. Помните, чем подробнее Вы опишете свою проблему, тем быстрее получите вразумительный совет
5. Запрещено поднимать неактуальные темы (ПРИМЕР: запрещено отвечать на вопрос из серии "срочно надо", заданный в 2003 году)
6. И не забывайте о кнопочках TRANSLIT и РУССКАЯ КЛАВИАТУРА, если не можете писать в русской раскладке :)
Модераторы: Akina, shadeofgray
  
> Движение вокруг препятствия
    Задача надо чтобы юнит ходил вокгруг  препятствия(стены).
    переменые и методы
    ExpandedWrap disabled
      <br>type NAPR=( levo,pravo,niz,verh)-тип обозначающий движение<br>POLOZH:napr{текущее направление юнита}<br>в лево,право,низ или вверх;<br>MOZNO(NP:NAPR):boolean;-функция которая говорит можно ли двинуться(на один пиксель) в этом<br>направлении(true если можно)<br>MOVE(NP:NAPR) процедура которая двигает юнит (на один пиксель)<br>в том направлении куда укажет параметр np ;<br>

    все направления АБСОЛЮТНЫ и НЕ относительны юнита
    т.е. К примеру если юнит движеться в niz то рано или поздно он
    упрется в низ экрана.
    У меня получилось только чтобы юнит дергался в разные стороны
    но в итоге оставался на одном месте( низнаю может я просто не
    выспался :) )
    Главные проблемы я считаю это
    абсолютные направления
    и движения на расстояние в один пиксель
    (хотя сам юнит и препятствие разумееться больше одного пиxеля)

    Пожалуйста помогите кто чем может (идеями, реализацией...).
    Буду примного благодарен.

    Сообщение отредактировано: Mixxx -
      Танчики пишешь?  ;D А координаты в процедуре MOVE меняешь? А нигде вовне старые не восстанавливаешь? Че еще.. А объект свой в каком месте рисуешь?
      И вообще ЗЫ: Ошибка в 94й строке. (с) Song
        Цитата
        Танчики пишешь?

        Просто поразительно как ты догадался? ;D
        Цитата
        А координаты в процедуре MOVE меняешь? А нигде вовне старые не восстанавливаешь?

        Координаты меняю только в процедуре move
        Цитата
        А объект свой в каком месте рисуешь?

        S:record{спрайт}
         x,y,{координаты левого верхнего угла спрайта}
         Xsize,Ysize:integer;{ширина и высота спрайта}
        end;
        Цитата
        И вообще ЗЫ: Ошибка в 94й строке.

        Неправда, я считал - в этой моей мессаге всего 22-строки. :D
          Mixx, прочитайте книгу:
          Секреты программирования игр
          http://pmg-ru.narod.ru/download/proggame.part1.rar
          http://pmg-ru.narod.ru/download/proggame.part2.rar
          и многие вопросы у Вас просто не будут возникать.
            2 Ozzя Ну, хорошо допустим я Mixx  :-/
            Я сразу скачал эту книженицию как-тока увидел линк
            (в одном из ныне закрытых паскальных топиков)
            И какой индивидуум догадался запечатать стоко метров в одном doc файле,
            у он меня он грузиться 20 минут (к томуже у меня ворда нет).
            Кроме-того меня никто не спрашивал знаю ли я Си
            (кстати  юзать прогу переводчик ctop я так и не научился)
            И наконец там про мой случай ничего не сказано.

            Прошу ещё учесть что я задал не общий вопрос,
            а конкретный (я вообще думаю что форум как раз для таких случаев и создан, разве нет)
              Цитата Mixxx, 25.06.03, 13:23:22
              2 Ozzя Ну, хорошо допустим я Mixx  :-/

              Извини  ;)

              Цитата

              Я сразу скачал эту книженицию как-тока увидел линк
              (в одном из ныне закрытых паскальных топиков)
              И какой индивидуум догадался запечатать стоко метров в одном doc файле,
              у он меня он грузиться 20 минут (к томуже у меня ворда нет).
              Кроме-того меня никто не спрашивал знаю ли я Си
              (кстати  юзать прогу переводчик ctop я так и не научился)
              И наконец там про мой случай ничего не сказано.

              Прошу ещё учесть что я задал не общий вопрос,
              а конкретный (я вообще думаю что форум как раз для таких случаев и создан, разве нет)

              Посмотри на delphimaster.ru раздел DElphiGX, там среди алогоритмов и статей вроде и обход препятствий был
                2 Ozzя
                Да ладно я не обиделся.
                Посмотрю там где ты велел.
                2 All
                Но я не совсем ето просил.
                Идею алгоритма обхода я вроде-бы как-бы уловил.
                Проблема с его реализацией в тех безобразных условиях которые я сам себе создал :'(
                И ещё я не просил  помоч мне реализовать весь алгоритм обхода.
                Мне нужна токо реализация кружения юнита вокруг горки,
                да-да именно кружение по круговой траектории в цикле (остальное (обход) я сам доделаю),это как алгоритм поиска выхода из лабиринта - алгоритм левой руки
                держися левой рукой за стенку и идёшь а если вдруг стена посередине лабиринта
                и не соприкосаеться с другими его стенами то суждено путнику навеки ходить в лаберинте кругами. Вот именно реализацию этого я и хочу от вас добиться.
                  Ага. Ну примерно так: Держишь в объекте текущее направление (скажем cur_dir:NAPR; ) и создаешь функцию "куда", перебирающую направления. Но имхо начать вызывать ее надо лишь когда "дотронулся" до стены, то есть
                  ExpandedWrap disabled
                    MOZNO(levo) and MOZNO(pravo) and MOZNO(verh) and MOZNO(niz)=false

                  Да и твои направления надо бы переупорядочить (для оптимизации), вот так:
                  ExpandedWrap disabled
                    type NAPR=(levo,verh,pravo,niz);
                  чтобы succ(a_napr) выдавал следующее по часовой стрелке направление, ну не совсем succ а конструкция типа
                  ExpandedWrap disabled
                    if a_napr=niz then a_succ:=levo else a_succ:=succ(a_napr);

                  Да и аналогично a_pred реализовать. Тогда получится
                  ExpandedWrap disabled
                    function kuda(var t:TANK):NAPR;<br>var a_kuda:NAPR;<br>begin<br>  a_kuda:=a_pred(t.cur_dir);<br>  repeat<br>    if MOZNO(a_kuda) then begin<br>      kuda:=a_kuda;<br>      exit end;<br>    a_kuda:=a_succ(a_kuda);<br>  until a_kuda=a_pred(t.cur_dir);<br>  {а вот если мы здесь, то ниkuda нельзя :)}<br>  kuda:=t.cur_dir;<br>end;<br>

                  других вариантов не придумал.
                  Ну и собсно все, дальше в цикле хватаешь kuda(T) и проверяешь MOZNO ли, и если да то двигаешь.

                  ЗЫ: Только щас заметил POLOZH:napr в 0м посте, переправь cur_dir тады ;)
                    Vesper1, ты гений твой алгоритм почти работает:
                    танк нормально едет по границам экрана  но вот со
                    внутреними препятствиями сложно - танчик доезжает до угла объекта
                    и тутже начинает вращаться вокруг своей оси с большой скоростью.
                    Тоесть траектория право-верх-право почамуто неподсилу и трагически обрываеться после того как
                    заканчиваеться "верх". Буду разбираться.

                    Да и почему ты говоришь вызывать токо после
                    ExpandedWrap disabled
                      <br>MOZNO(levo) and MOZNO(pravo) and MOZNO(verh) and MOZNO(niz)=false <br>

                    Почаму имменно niz?
                    Я вызываю сразу после того как юнит упреться фейсом в стену.
                    Сообщение отредактировано: Mixxx -
                      Аааа, пардону, скобки забыл :(
                      ExpandedWrap disabled
                        (MOZNO(levo) and MOZNO(pravo) and MOZNO(verh) and MOZNO(niz))=false

                      В тот момент, когда "заканчивается верх", проверь на MOZNO(levo) и MOZNO(verh), а вдруг туда нельзя, да еще и вправо нельзя. Или поставь брыкпойнт :) в точке функции kuda, там где уже никуда нельзя, есть вариант, что оно там циклит. Еще вариант: в процедуре MOVE может быть ляп, то есть говоришь MOVE(pravo) а она только двигает объект, а polozh не меняет, тогда получается, что объект смотрит на стену, а слева есть свободное пространство, в результате чего объект начинает вращаться вокруг пустого места.
                        Я нашёл баг просто процедура Move
                        была так устроена что если задаваемое параметром
                        направление не совпадает с текущим
                        то текущее заменяеться на задаваемое
                        а движения непроисходит.
                        т.е.
                        ExpandedWrap disabled
                          <br>move(np:napr)<br>begin<br>....<br>if polozh<>np then <br> begin<br>   polozh:=np<br>   exit;<br> end;<br>....<br>end;

                        Правда это был небаг это было так задумано,
                        но темнемение после того как я это исправил
                        всё заработало.
                        Огромное спасибо тебе ,Vesper1, за помощ.
                        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                        0 пользователей:


                        Рейтинг@Mail.ru
                        [ Script execution time: 0,0417 ]   [ 15 queries used ]   [ Generated: 18.04.24, 18:19 GMT ]