Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 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
9-28379
iliann
2003-05-16 23:06
2003.12.09
игра hitman


1-28396
Ничего не знающий
2003-11-30 01:14
2003.12.09
Frame


3-28390
ната
2003-11-20 11:15
2003.12.09
сессия


11-28395
Ice777
2003-03-24 15:58
2003.12.09
Использование VCL компонетов в KOL


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский