Форум: "Игры";
Текущий архив: 2003.12.09;
Скачать: [xml.tar.bz2];
ВнизDelphiX/RPG/Collision Найти похожие ветки
← →
Holocaust (2003-05-26 17:30) [0]Подскажите, как реализовать на DelphiX столкновение игрока с картой (идет герой, напоролся на стену и не может дальше идти). РПГ изометрическая...
← →
cyborg (2003-05-26 17:57) [1]Проверять столкновение не со спрайтами стены, а с картой.
← →
greenrul (2003-05-26 18:31) [2]Я например забил на collision в DelphiX, т.к. работает он глючно. А для карты ввел параметр "проходимости" - то есть если герой идет на клетку вверх, он сперва проверит Tiles[i,j].walkable
← →
Плохой человек (2003-05-26 20:49) [3]> А для карты ввел параметр "проходимости" - то есть если герой идет на клетку вверх, он сперва проверит Tiles[i,j].walkable
У меня похоже. Карта содержит индекс типов тайлов, т.е. 1 - стена, 2 - дорога, а уже для каждого типа тайла в его описании определено, можно ходить или нет.
← →
Holocaust (2003-05-26 20:50) [4]greenrul ©: могешь по подробнее или лучше пример, если не влом?
← →
Holocaust (2003-05-26 20:52) [5]Плохой человек: аналогично...
← →
Holocaust (2003-05-26 20:54) [6]У меня есть карта и если проверено на 1-(уступ), то... а что дальше делать, как заставить игрока остановиться?
← →
cyborg (2003-05-26 20:59) [7]>>а что дальше делать, как заставить игрока остановиться?
Так же, как заставляешь игрока идти.
← →
Holocaust (2003-05-26 21:06) [8]cyborg ©: смотри, т.е. читай...
если игрок идет влево, то х:=х+2; , если он столкнулся со стеной, то х:=х-2; ну а если объект имеет форму ромба и игок ходит не только вверх вниз влево вправо
← →
Плохой человек (2003-05-26 22:15) [9]>если игрок идет влево, то х:=х+2; , если он столкнулся со стеной, то х:=х-2; ну а если объект имеет форму ромба и игок ходит не только вверх вниз влево вправо
Приехали. Давай разбераться. Ты говоришь, у тебя есть карта, т.е. двумерный массив ячеек. При этом человек может занимать одну определённую ячейку и любое его перемещение передвинет его на расстояние от одной ячейки в другую, т.е. количество его положений стоя не двигаясь равно числу ячеек (если вся карта - ровное поле без уступов :)). Значит, перед передвижением чувака ты можешь определить, есть ли уступ в ячейке, куда чел направляется. Если есть, то ты его не двигаешь.
Т.е., тебе нужна функция, которая передвинет чувака с одной ячейки в другую, при этом покажет анимацию. Эдакая процедурка или функция Move.
Ну а то, что ты говоришь x := x + 2, так это ещё как понимать. Если это координаты ячейки в массиве, то всё правильно, кроме того, что лучше проверить сначала, может ли чел попасть в данные координаты, чем сначала его туда поместить, а потом проверять и двигать назад.
← →
cyborg (2003-05-26 22:21) [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
( 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;
Вот так примерно, если ошибок не наделал, и заодно препятствия будет обходить.
← →
cyborg (2003-05-26 22:35) [11]:) после маленького редактирования немного бредятина получилась в отношении имён точек.
← →
Holocaust (2003-05-27 12:38) [12]Да спасибо вам короче, я понял что хотел... может как-нибудь покажу что получилось.
Страницы: 1 вся ветка
Форум: "Игры";
Текущий архив: 2003.12.09;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.002 c