Важная информация

User Tag List

Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 13

Тема: Коллизии с ландшафтом

  1. #1
    Guru Аватар для newart
    Регистрация
    19.01.2005
    Адрес
    Санкт-Петербург
    Сообщений
    11,440
    Спасибо Благодарностей отдано 
    192
    Спасибо Благодарностей получено 
    145
    Поблагодарили
    61 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию Коллизии с ландшафтом

    Делая игру сталкнулся с небольшой проблемой.
    Герой и враги двигаясь по ланшафту должны
    плавно его огибать (как в Dizzy 7).
    Так-же возможны вертикальные прыжки, во время
    которых ланшафт над головой не является препядствием,
    тоесть герой может какбы сковзь него вертикально
    пролететь.
    По скольку на ланшафте будет травка и прочаи украшательства,
    я решил создать дополнительный набор спрайтов, c контурами
    ланшафта. Тоесть карта уровня состоит из двух слоев.

    При прыжке пока герой летит вверх столкновения можно вообще
    не обрабатывать. Но когда герой после прыжка начинает падать
    каким образом отличить вертикальные (я пометил их синим цветом)
    препядствия (которые служат для ограничения движения влево-вправо)?
    В принципе можно на пиксель отводить по 2 бита (как в примере
    красный (1) горизональное, синий (2) пвертикальное, и 0 выключеный
    пиксель. Поскольку спрайтов препядствий довольно немного, можно
    даже не парится с битами а отвести на пиксель по байту.

    Но есть еще одна проблема, допутим герой после прыжка падает,
    ну или даже просто бежит, причем дискретность перемещения
    несколько пикселей допустим 4. Легко догадаться, что в таком
    случае герой может просто проскочить скозь препядствие.
    Ведь на колиззию с ланшафтом проверяеться далеко не весь герой,
    а лишь несколько пикселей (по середине в районе ног).
    Единсвенный выход которйя я пока нашел, это вызывать подпрограмму
    провекрки коллизии столько раз на сколько надо переместить спрайт,
    но это явно не оптимальный метод, особенно если на экране много
    врагов который работают по такому же принципу.

    Может чего-нибудь посоветуете?
    Возможно мой способ в корне не верен?
    Хакер из меня никакой, поэтому я не стал
    ковырять игры и смотреть как это там сделано.
    Миниатюры Миниатюры Нажмите на изображение для увеличения. 

Название:	collision.png 
Просмотров:	336 
Размер:	1.2 Кб 
ID:	2218  

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2
    Veteran Аватар для GriV
    Регистрация
    18.02.2005
    Адрес
    Набережные Челны
    Сообщений
    1,574
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    3
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Обычно такие задачи решаются математически, а не в лоб.

    Я не совсем понял из постановки задачи, что нужно - графически (по пикселам на экране) определить столкновение с ландшафтом или математически?

    Если известно направление, известна позиция, известно в какую сторону должен переместиться персонаж, то математически такая задача очень просто решается.

    Вначале производится анализ - возможно ли перемещение, в принципе так как вектор движения известен можно прсмотреть какие препятствия находятся рядом, составить обыкновенное уравнение и выполнить сравнение, если в результате получается превышение - тогда дальше не едем/не катимся/не летим. Если же нет превышения - движения продолжаем.

    Сам объект/персонаж будет характеризоваться габаритами - высотой и шириной. Начальная точка будет приниматься откуда угодно (хоть с низу хоть с верху).

    Тогда тебе нужно при движении персонажа влево оценивать по крайней левой грани, при движении вправо по крайней правой, вниз соответственно по нижней вверех по верхней.

    При комбинированной движении оценивать сразу по двум направлениям.

    Сами препятствия тоже можно оценить по габаритам. Тогда они автоматически станут как бы выпуклыми - т.е. если препятствие есть то оно и слева и справа и снизу и сверху будет непроницаемым для персонажа.

    Вот есть Базисная система отсчёта - например крайний левый верхний угол экрана. Отсчёт ведётся по оси X вправо и по оси Y вниз.

    Есть персонаж у которого известны:
    X1 - позиция X - берётся тоже крайне левый верхний угол персонажа
    Y1 - позиция Y
    deltaX1 - ширина персонажа по X
    deltaY1 - высота по Y

    Аналогично для препятствия: X2, Y2, deltaX2, deltaY2.

    Известно, что персонаж должен сместится на N пикселей вправо.

    Возможно ли перемещение?

    Если ( (Y1>Y2 и Y1<Y2+deltaY2) или (Y1+deltaY1>Y2 и Y1+DeltaY1<Y2+deltaY2 ) ) [проверка по вертикали] - тогда два объекта - препятствие и персонаж - находятся на одном уровне, а значит надо проверять их столкновение по X:

    Если (X2<X1+deltaX1+N и X2>X1) [проверка по горизонтали] тогда нельзя осуществить перемещение (будет коллизия).

    Во всех остальный случаях можно перемещаться вправо сколько влезет.

    Математика очень простая - в смысле что нет необходимости использовать калькулятор и т.п., можно все процедуры написать готовыми самому.
    Биты рулят лучше байтов, байты рулят шустрее!
    View, Звук, Цвет

  4. #3
    Veteran Аватар для lvd
    Регистрация
    23.01.2005
    Сообщений
    1,113
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    3
    Поблагодарили
    3 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от newart
    Делая игру сталкнулся с небольшой проблемой.
    Герой и враги двигаясь по ланшафту должны
    плавно его огибать (как в Dizzy 7).
    Что касается спрайтов ландшафта, то можно просто помечать, что он проходимый/непроходимый. И во второй слой соотв-но рисовать/не рисовать его. А что касается движений на несколько пикселов сразу - можно выпустить "щупальца" длиной, равной шагу перемещения, и если они натыкаются на препятствие, то соотв-но решать, то ли герой убился об стену, то ли подпрыгнул на 1 пиксел и не заметил, етц.

    Ещё радикальный вариант - потратить полдня на ковыряние анрылом в той же диззе. =)
    --- Кто съел всю уху?

  5. #4
    Guru Аватар для newart
    Регистрация
    19.01.2005
    Адрес
    Санкт-Петербург
    Сообщений
    11,440
    Спасибо Благодарностей отдано 
    192
    Спасибо Благодарностей получено 
    145
    Поблагодарили
    61 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от lvd
    Что касается спрайтов ландшафта, то можно просто помечать, что он проходимый/непроходимый. И во второй слой соотв-но рисовать/не рисовать его. А что касается движений на несколько пикселов сразу - можно выпустить "щупальца" длиной, равной шагу перемещения, и если они натыкаются на препятствие, то соотв-но решать, то ли герой убился об стену, то ли подпрыгнул на 1 пиксел и не заметил, етц.

    Ещё радикальный вариант - потратить полдня на ковыряние анрылом в той же диззе. =)
    Ты немного не понял. Второй слой он не рисуется на экран, он только для проверки коллизий предназначен. Если спрайт 0 то он пустой, тоесть целиком проходим.
    Что касается "щупальцы", чем это отличается от моего метода?
    А в дизи, там вроде как раз сканируется экран.
    Последний раз редактировалось newart; 07.01.2006 в 16:07.

  6. #5
    Guru Аватар для rasmer
    Регистрация
    20.01.2005
    Адрес
    Саранск
    Сообщений
    2,195
    Записей в дневнике
    2
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от lvd
    Ещё радикальный вариант - потратить полдня на ковыряние анрылом в той же диззе. =)
    А ещё лучше - дизассемблировать движок из VAVовской демодиззи - он тама нетак уж и много весит - и переработать его...
    Мои интры: [Kukarachess][Super boot rmx][tRUSHE MOSAIc][BLAZE]
    Мои игры: [Overload][Removal]

    Список игр для ZX-Spectrum: [2015] [2014]

  7. #6
    Guru Аватар для newart
    Регистрация
    19.01.2005
    Адрес
    Санкт-Петербург
    Сообщений
    11,440
    Спасибо Благодарностей отдано 
    192
    Спасибо Благодарностей получено 
    145
    Поблагодарили
    61 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от rasmer
    А ещё лучше - дизассемблировать движок из VAVовской демодиззи - он тама нетак уж и много весит - и переработать его...
    Он ниемеет ничего общего с тем что делаю я.
    У меня размер спрайтов карты фиксирован, и карта размером с экран.

  8. #7
    Veteran Аватар для lvd
    Регистрация
    23.01.2005
    Сообщений
    1,113
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    3
    Поблагодарили
    3 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от newart
    Ты немного не понял. Второй слой он не рисуется на экран, он только для проверки коллизий предназначен. Если спрайт 0 то он пустой, тоесть целиком проходим.
    Это ты немного не понял. Я тебе говорю - если спрайт видим но проходим то не рисовать его в тот слой, а если непроходим, то рисовать тот же, что и на экран (возможно, с постобратокой типа заливки или утолщения).

    Что касается "щупальцы", чем это отличается от моего метода?
    Тем, что 1 раз на каждое произвольное изменение координат делается.
    --- Кто съел всю уху?

  9. #8
    Guru Аватар для newart
    Регистрация
    19.01.2005
    Адрес
    Санкт-Петербург
    Сообщений
    11,440
    Спасибо Благодарностей отдано 
    192
    Спасибо Благодарностей получено 
    145
    Поблагодарили
    61 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от lvd
    Это ты немного не понял. Я тебе говорю - если спрайт видим но проходим то не рисовать его в тот слой, а если непроходим, то рисовать тот же, что и на экран (возможно, с постобратокой типа заливки или утолщения).
    Каким образом рисовать тот-же, если зачастую спрайт коллизии и то что
    на экране выглядят соверешенно по разному.
    Поэтому спрайты коллизий рисуются вручную.
    Карта коллизий создаеться автоматически по таблице соответсвия, но
    в редакторе есть возможность менять блоки вручную (для случаев когда надо скозь стену например пройти, как в дизи).

  10. #9
    Guru Аватар для newart
    Регистрация
    19.01.2005
    Адрес
    Санкт-Петербург
    Сообщений
    11,440
    Спасибо Благодарностей отдано 
    192
    Спасибо Благодарностей получено 
    145
    Поблагодарили
    61 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от lvd
    Тем, что 1 раз на каждое произвольное изменение координат делается.
    Неврубаюсь, обьясни поподробнее.
    Например известно, что спрайт в данный фрейм должен передвинуться (за раз)
    на 4 пикселя.
    Каковы действия?

  11. #10
    Master
    Регистрация
    20.01.2005
    Адрес
    Россия, Вологда
    Сообщений
    957
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от newart
    Единсвенный выход которйя я пока нашел, это вызывать подпрограмму
    провекрки коллизии столько раз на сколько надо переместить спрайт,
    но это явно не оптимальный метод, особенно если на экране много
    врагов который работают по такому же принципу.
    Раз все действие происходит на одном экране, то врагов не должно быть очень много, так что скорости должно хватить. Ведь не стотня же героев у тебя будет одновременно там бегать.

    А вообще у тебя под боком есть Gogin. Спроси, у него опыт уже есть.
    axor/Perspective
    http://abzac.retropc.ru/

Страница 1 из 2 12 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •