Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.12.09;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.005 c
9-28388
Juster~
2003-05-08 18:02
2003.12.09
2NailMan


9-28377
Кен
2003-05-21 04:47
2003.12.09
Как делать прицел в 3D играх не


9-28375
Vermut
2003-05-18 19:13
2003.12.09
как в GLScene делать


7-28401
Zmei
2003-10-03 21:16
2003.12.09
запрет


9-28380
KIE
2003-05-22 13:26
2003.12.09
Граф движок, на чем лучше писать?