Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

DelphiX/RPG/Collision


Holocaust ©   (2003-05-26 17:30:00) 

Подскажите, как реализовать на DelphiX столкновение игрока с картой (идет герой, напоролся на стену и не может дальше идти). РПГ изометрическая...


Holocaust   (2003-05-27 12:38:00) [1]

Да спасибо вам короче, я понял что хотел... может как-нибудь покажу что получилось.


cyborg   (2003-05-26 22:35:00) [2]

:) после маленького редактирования немного бредятина получилась в отношении имён точек.


cyborg   (2003-05-26 22:21:00) [3]

Имеем две точки углов столкновения объекта Х1У1 и Х2У2, левый верхний и правый нижний угол соответственно.

Для простой прямоугольной карты:

Берём две точки по направлению, влево, например, это будут точки ObjХ1 ObjУ1 ObjХ1 ObjУ1+ObjHeight.

Далее смотрим по отношению скорости, скорость (Speed) - целое число:

for i:=1 to Speed do
begin
//Смотрим влево:
X1:=(ObjX1-1) div (размер ячейки карты);
Y1:=ObjY1 div (размер ячейки карты);
X2:=X1;
Y2:=(ObjY1+ObjHeight) div (размер ячейки карты);

if (Map[X1,Y1].проходима) and (Map[X1,Y2].проходима) then Dec(ObjX1) else
if (Map[X1,Y1].проходима) and (not Map[X1,Y2].проходима) then Dec(ObjY1) else
( not Map[X1,Y1].проходима) [10]

Имеем две точки углов столкновения объекта Х1У1 и Х2У2, левый верхний и правый нижний угол соответственно.

Для простой прямоугольной карты:

Берём две точки по направлению, влево, например, это будут точки ObjХ1 ObjУ1 ObjХ1 ObjУ1+ObjHeight.

Далее смотрим по отношению скорости, скорость (Speed) - целое число:

for i:=1 to Speed do
begin
//Смотрим влево:
X1:=(ObjX1-1) div (размер ячейки карты);
Y1:=ObjY1 div (размер ячейки карты);
X2:=X1;
Y2:=(ObjY1+ObjHeight) div (размер ячейки карты);

if (Map[X1,Y1].проходима) and (Map[X1,Y2].проходима) then Dec(ObjX1) else
if (Map[X1,Y1].проходима) and (not Map[X1,Y2].проходима) then Dec(ObjY1) else
if (not Map[X1,Y1].проходима) and (Map[X1,Y2].проходима) then Inc(ObjY1);
end;


Вот так примерно, если ошибок не наделал, и заодно препятствия будет обходить.


Плохой человек   (2003-05-26 22:15:00) [4]

>если игрок идет влево, то х:=х+2; , если он столкнулся со стеной, то х:=х-2; ну а если объект имеет форму ромба и игок ходит не только вверх вниз влево вправо

Приехали. Давай разбераться. Ты говоришь, у тебя есть карта, т.е. двумерный массив ячеек. При этом человек может занимать одну определённую ячейку и любое его перемещение передвинет его на расстояние от одной ячейки в другую, т.е. количество его положений стоя не двигаясь равно числу ячеек (если вся карта - ровное поле без уступов :)). Значит, перед передвижением чувака ты можешь определить, есть ли уступ в ячейке, куда чел направляется. Если есть, то ты его не двигаешь.

Т.е., тебе нужна функция, которая передвинет чувака с одной ячейки в другую, при этом покажет анимацию. Эдакая процедурка или функция Move.

Ну а то, что ты говоришь x := x + 2, так это ещё как понимать. Если это координаты ячейки в массиве, то всё правильно, кроме того, что лучше проверить сначала, может ли чел попасть в данные координаты, чем сначала его туда поместить, а потом проверять и двигать назад.


Holocaust   (2003-05-26 21:06:00) [5]

cyborg ©: смотри, т.е. читай...
если игрок идет влево, то х:=х+2; , если он столкнулся со стеной, то х:=х-2; ну а если объект имеет форму ромба и игок ходит не только вверх вниз влево вправо


cyborg   (2003-05-26 20:59:00) [6]

>>а что дальше делать, как заставить игрока остановиться?
Так же, как заставляешь игрока идти.


Holocaust   (2003-05-26 20:54:00) [7]

У меня есть карта и если проверено на 1-(уступ), то... а что дальше делать, как заставить игрока остановиться?


Holocaust   (2003-05-26 20:52:00) [8]

Плохой человек: аналогично...


Holocaust   (2003-05-26 20:50:00) [9]

greenrul ©: могешь по подробнее или лучше пример, если не влом?


Плохой человек   (2003-05-26 20:49:00) [10]

> А для карты ввел параметр "проходимости" - то есть если герой идет на клетку вверх, он сперва проверит Tiles[i,j].walkable

У меня похоже. Карта содержит индекс типов тайлов, т.е. 1 - стена, 2 - дорога, а уже для каждого типа тайла в его описании определено, можно ходить или нет.


greenrul   (2003-05-26 18:31:00) [11]

Я например забил на collision в DelphiX, т.к. работает он глючно. А для карты ввел параметр "проходимости" - то есть если герой идет на клетку вверх, он сперва проверит Tiles[i,j].walkable


cyborg   (2003-05-26 17:57:00) [12]

Проверять столкновение не со спрайтами стены, а с картой.


Наверх

Титульная страница Поиск, карта сайта Написать письмо