![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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]
Проверять столкновение не со спрайтами стены, а с картой.