Делаю простую 2D RPG. Как сделат проверку на столкновение ?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Делаю простую 2D RPG. Как сделат проверку на столкновение ?

Сообщение ALX_2002 » 22.08.2005 (Пн) 17:28

Челы, засел за изготовление простейшей 2D RPG/QUEST гамы на VB

Никак не могу придумать принцип проверки на столкновение.

Какие есть отработанные алгоритмы ?

Есть где нибудь примерчик, чтоб глянуть ? :)

Прилагаю исходняк.
Вложения
GAME.zip
(8.96 Кб) Скачиваний: 37

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 22.08.2005 (Пн) 17:51

Это ты специально подчеркнул, что 2D? :)
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

Odrick
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 503
Зарегистрирован: 28.09.2003 (Вс) 2:04

Сообщение Odrick » 22.08.2005 (Пн) 23:02

Ну это зависит от того, как ты представляеш себе свою карту и как с объектами должен сталкиваться персонаж ;) Можно тупенько поклеточно. Тогда проблем, по моему, не может быть никаких. Можно посложнее - мыслить персонажа как круг, у которого известны координаты центра и радиус. И точно так же объекты. И при движении проверять, а не пересекаются ли окружность персонажа и одна из окружностей объектов.
То, что для одних константа, для других только переменная...

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 22.08.2005 (Пн) 23:30

Просто... проверяем по всем бортам игрока (ох, не нравится мне эта 2D реальность :? ) по 2-5 пикселов, если GetPixel возвращает цвет, отличный от пространства, где можно ходить - столкновение произошло.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

Alexander N. Samarin
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 397
Зарегистрирован: 05.03.2005 (Сб) 20:59
Откуда: Интернат 18 (СУНЦ МГУ), комната 214А, кровать посередине

Сообщение Alexander N. Samarin » 23.08.2005 (Вт) 7:39

Sqr((x1-x2)^2+(y1-y2)^2)
Вру?
На это не смотрите! Это не подпись!!!!!!

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 23.08.2005 (Вт) 9:43

2 BV: Ага. Именно 2D, я решил тогда назовут более точные алгоритмы. :)

Хм.... Прочитал. Задумался.

Значит так :)

2 Odrick + Alexander N. Samarin + BV: На счёт заполнения карты:

Видимо придётся отслеживать столкновение в матрице.

Проверка кругом или GetPixel мне не подходит. У меня нету однородного фона.


P.S Кому не влом, поглядите сам исходник. Там всё с коментами. Может ещё чего нибудь советанёте.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 23.08.2005 (Вт) 10:14

http://www.vb.kiev.ua/code/games/
Там немоло примеров, может найдешь чего полезного...
Лучший способ понять что-то самому — объяснить это другому.

Tarantul
Бывалый
Бывалый
 
Сообщения: 235
Зарегистрирован: 13.12.2004 (Пн) 16:39
Откуда: IUnknown

Сообщение Tarantul » 23.08.2005 (Вт) 15:26

Когда я делал в своем 2D -Shooter'е столкновения, то у меня каждый обьект имел коллизион (состоящий из линий), который поворачивался на угол 0 до 359 градусов (в зависимости от поворота обьекта). Просчитывались повороты заранее. А столкновение определялось как пересечение двух любых линий. Правда, вокруг них еще были ограничивающие прямоугольники (для уменьшения количества просчетов столкновений), и в добавок ко всему карта еще была разделена на прямоугольные секторы. Каждый обект находился в одном (или нескольких) секторах, и в результате просчет столкновений занимал значительно меньшее время.

Вообще, если делать большую карту с кучей обьектов, то без секторирования не обойтись :)

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 23.08.2005 (Вт) 18:04

2 Antonariy: ВО ! Пасиб. Сейчас как раз погляжу ! :)

2 Tarantul: Хм... Я в принципе тоже самое решил сделать, но

1) Карту сделать как регион (RECT), а загружая объекты в него делать CombineRgn и вырезать те места где игроку пройти нельзя.

А потом проверять попадание PtinRegion справа слева сверху и снизу от игрока в момент перемещения.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 24.08.2005 (Ср) 7:58

Можно юзать регионы. А можно для каждого объекта создать маску (монохромную, черный - прозрачно, белый - объект) и юзать GetPixel. И маску двигать вместе с объектом (невидимо).
Lasciate ogni speranza, voi ch'entrate.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 24.08.2005 (Ср) 12:54

2 alibek: YEP ( В смысле Ага ). Именно так вчера и сделал. :). Вот что получилось.

К сожалению одного GetPixel не хватило. Сдеал почти как советовал

Tarantul. Проверяю пиксели по дуге под разными углами.

Типа влево от 45 до 135. Сверху от 135 до 225 ну и т.п

Вроде пашет обалденно. Главное мапу можно обновлять не выгружая гаму. Просто нажав F5. :)

Теперь думаю на счёт ботов. Как бы столкновение с ними сделать. :roll:
Вложения
ARH.zip
(10.78 Кб) Скачиваний: 26

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 24.08.2005 (Ср) 13:29

Хм... Задумался, а как заставить игрока обходить за объектом и перед ним. А то получается я хожу по головам ботов....

Хм... Вот незадачка то... :?

Tarantul
Бывалый
Бывалый
 
Сообщения: 235
Зарегистрирован: 13.12.2004 (Пн) 16:39
Откуда: IUnknown

Сообщение Tarantul » 24.08.2005 (Ср) 17:03

А боты во время твоего хода движуться или нет?
Если нет то можно сделать алгоритм типа

цикл:

...движемся
...если есть столкновение с обьектом, возвращаемся на одну позицию назад и пытаеммя обойти(с любой стороны)

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 25.08.2005 (Чт) 18:42

Tarantul писал(а):А боты во время твоего хода движуться или нет?
Если нет то можно сделать алгоритм типа

цикл:

...движемся
...если есть столкновение с обьектом, возвращаемся на одну позицию назад и пытаеммя обойти(с любой стороны)


Нее... Ты не совсем понял. Проблемка то в другом. :)

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

А вопрос в том, что в игре вид не сверху, а сбоку. Т.е ты видишь персонажа в лицо, в спину ну и т.п.

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

Т.е тут надо им как то индексы выставить - кто выше стоит, кто ниже....

Вот тут мой мозг несколько сдаёт позиции.... :oops:

Надо подумать...

Odrick
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 503
Зарегистрирован: 28.09.2003 (Вс) 2:04

Сообщение Odrick » 25.08.2005 (Чт) 18:46

Зачем? Рисуй все "полосами" сверху-вниз. В том числе и персонажей. Тогда тот персонаж, который ниже, по любому перекроет того, который выше. Классика картостроения в изометрических игрушках. Да и в плоских тоже ;)
То, что для одних константа, для других только переменная...

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 26.08.2005 (Пт) 0:30

2 Odrick: Полосами ? Эт как ?

Код: Выделить всё
For Y=0 to MAPY
For X=0 to MAPX

DrawObject ?

Next
Next


Так ?

Хм... Дело то в чём: У меня карта рисуется 1 раз. А потом поверх накладываются все объекты. В целях экономии времении на отрисовку. + У меня персонаж двигается не по клеткам, а на произвольный шаг и в матрице карты он не значится. :(.

Вот такая вот БОТва получается.

Odrick
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 503
Зарегистрирован: 28.09.2003 (Вс) 2:04

Сообщение Odrick » 26.08.2005 (Пт) 1:15

По поводу скорости отрисовки можеш особо не волноваться. У меня сейчас, например, в проекте отрисовывается в один кадр около 750 спрайтов и количество FPS на средней машине около 75-80. При том при всем, что никакой оптимизации кода пока не делалось :) Так что можеш отрисовывать карту каждый раз по новому перед выводом на экран. Качество от этого не пострадает ;)
То, что для одних константа, для других только переменная...

Tarantul
Бывалый
Бывалый
 
Сообщения: 235
Зарегистрирован: 13.12.2004 (Пн) 16:39
Откуда: IUnknown

Сообщение Tarantul » 26.08.2005 (Пт) 13:23

По поводу скорости могу сказать, что когда ее делал свою игру, то до оптимизации у меня поле рисовалось мозаично, 768 кусков 32х32. И это дело на DirectDraw7, 32бита и на GeForce FX 5700 (щас у меня же Radeon X700 :) ) рисовалось чуть больше, чем 4мс (под 250 FPS). Мне это показалось неприемлимо много, и в окончательной версии у меня движок со статической частью, что позволяет при прокрутке очень экономить время на перерисовке заднего плала. Дело в том, что видеокарта копируте рисунок 1024х768 примерно с такой же скоростью, как и 32х32.

2 ALX_2002:
Насколько я понимаю, каждый обьект у тебя имеет свои координаты X и Y. Тогда можна сделать своеобразный Y-буфер в котором упорядочить все обьекты по Y-координате.

Например,

Dim YBuffer[1 To NumObjects] as Object

То есть, чтобы получить YBuffer, надо скопировать в него данные из основного массива обьектов, а потом отсортировать по y-координате, по возростанию.

Ну а сортировка - уже другой вопрос. Тут полно алгоритмов :)

А в конце просто пройтись по массиву сверху вниз, и вывести все обьекты :)

Кстати такой способ применяется и в 3D(сделанных на софте), звется алгоритмом художника :)


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Google-бот, SemrushBot и гости: 81

    TopList