Нахождение пути (Quest)

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Gemini
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 390
Зарегистрирован: 24.07.2002 (Ср) 14:15
Откуда: Ozersk

Нахождение пути (Quest)

Сообщение Gemini » 06.12.2007 (Чт) 11:41

Добрый день Уважаемые!!!

Я хочу написать игру на подобии "Штырлиц","Страшилки"
Думаю многие в них играли и поймут мой вопрос.

Проблемма у меня встала при создании передвижения главного героя.

Предисловие:
сначала я искал самый короткий путь.(волновой метод нашел на vbstreet)

Есть массив map(0 to 24,0 to 9) as byte 'поле 320*800
равный 0 или 1 (проходим\не проходим)
Карта поделена на клетки размером 32*32
(Не проходимые клетки это обьекты например:машина,стол,или бочка)
Допустим что картинка бочки = 64*64, но не проходимые точки только две, нижнии (точки опоры (обьём обьекта))
0 0
1 1
все обьекты находятся по координатам x y z
где z просто порядок прорисовки.
--------
при нахждении пути функция возвращает массив с координатами пути до места назначения
и вот тут начинается загвоздка.
я передвигаю главного героя по полученым координатам.
где:
высота и ширина = не стандартная (может иметь любой размер (но больше 32))
x картинки = (полученый x*32 + каринка.ширина \2)+16 'середина картинки + половина клетки
y картинки = полученый y*32 + каринка.высота+16 'низ картинки + половина клетки
z картинки = y картинки \32
------
обход обьекта происходит по его краю


00<-
/\
11|
<-<-<-<-<-$
и получается что изображение главного героя когда он обходит обьект накладывается
на картинку обьекта который обходим (из-за того что размер глав.гер. больше 32*32).

(надеюсь обьяснил понятно, а то уменя мозг уже опух и в голову не помещается)

----------------------------------------
Как от этого избавиться?
Или может какой другой метод есть чтобы реализовать хождение главного героя
Может я просто заморочился и не вижу явного???
Люди я вас умоляю помогите!!!

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16489
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 06.12.2007 (Чт) 13:06

Ничего не понял.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

EUGY
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 214
Зарегистрирован: 09.11.2006 (Чт) 22:51
Откуда: Мурманск

Сообщение EUGY » 06.12.2007 (Чт) 13:19

все обьекты находятся по координатам x y z
где z просто порядок прорисовки

Что-же, "штирлиц" в отличие от "бочки" не имеет z_порядка?

Gemini
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 390
Зарегистрирован: 24.07.2002 (Ср) 14:15
Откуда: Ozersk

Сообщение Gemini » 06.12.2007 (Чт) 13:34

Изображение


на рисунке видно что как только герой доходит до позиции №2, изображение главного героя накладывается на изображение бочки.
z бочки = z глав. гер.
Z - у всех обьектов имеется.
Z порядок у главного героя меняеся взависимости от y \32

Бочку я поставил тоже взависимости от y \32 -обьекта

вобщем обьекты не должны сталкиваться. но правильный путь до конечной точки должен сохраняться. (Во как)

(немного исправил пример)
Вложения
primer.JPG
primer.JPG (26.91 Кб) Просмотров: 483
Последний раз редактировалось Gemini 06.12.2007 (Чт) 14:54, всего редактировалось 1 раз.

Gemini
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 390
Зарегистрирован: 24.07.2002 (Ср) 14:15
Откуда: Ozersk

Сообщение Gemini » 06.12.2007 (Чт) 14:51

Вот появилась ещё одна мысль.

:idea: идём к заданой точке если встречается преграда следуем правилу левой руки ( так помойму оно называется)

А может анализ обьектов происходит как-то по другому...?

:idea: возможно обьекты это не поле 24*9 а где нибудь храниться картинка (белый фон, черные линии) с линиями (не обязательно прямымы) . проверяем если по дороге не встречается чёрный пиксель то идём дальше. (но это гемор, так вроде не должно быть)

Может кто мысли имеет по поводу обхода препятствий,обьёма обьектов и т.д.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 06.12.2007 (Чт) 15:37

У тебя же есть волновой алгоритм.
Вот его и используй.
Только оптимизируй под свою задачу.
Lasciate ogni speranza, voi ch'entrate.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16489
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 06.12.2007 (Чт) 15:41

Gemini
Можешь поделить карту на сектора и использовать граф вместо матрицы.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Winitar
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 224
Зарегистрирован: 06.07.2006 (Чт) 20:45
Откуда: Астана

Сообщение Winitar » 06.12.2007 (Чт) 16:54

Могу скинуть пример, если надо. 8)

Gemini
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 390
Зарегистрирован: 24.07.2002 (Ср) 14:15
Откуда: Ozersk

Сообщение Gemini » 07.12.2007 (Пт) 7:16

Winitar
Могу скинуть пример, если надо.



Да, было бы интересно посмотреть.

:idea: Но я вроде бы нашел выход, правда он немного замудренный в плане код.(ещё не пробовал (работы много), смысл в обходе обьектов, без изпользования заранее определённого пути ).

Каждый обьект и главн. гер. имеет бокс (Rect) ,

xod-переменная в пикселях (длинна хода например 10)

for i = 1 to Object.Count

Проверяем если пункт назначения > по x то проверяем x+height+ xod >= object.x and проверяем ни находимся ли мы на против обьекта? сравниваем y obj.y, y+height, Obj.y + height,

если нет то идём если да то стоим.
next

for i = 1 to Object.Count

Проверяем если пункт назначения по Y
next

и так далее x >Curs.X ; x <Curs.x ,y> Curs.Y ; y< Curs.Y
но вся фишка в том что движение по координатам x,y происходит по раздельности что и позволяет обходить обьекты
(если движение по x не возможно и движ. по y не возможно значит стоп)
примерно так. (но там ещё много мелочей)

Если интересно могу выложить когда напишу (скорей всего после завтра (работа :( )

GAGArin
Неистовый флудер
Неистовый флудер
 
Сообщения: 1777
Зарегистрирован: 23.12.2002 (Пн) 12:46
Откуда: я тут взялся, не знаю...

Сообщение GAGArin » 07.12.2007 (Пт) 19:20

В алгоритме поиска пути поменяй проверку "Чтобы клетка куда перемещаемся была пустая" на "Чтобы все клетки куда попадает изображение ГГ были пустые"

Gemini
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 390
Зарегистрирован: 24.07.2002 (Ср) 14:15
Откуда: Ozersk

Сообщение Gemini » 08.12.2007 (Сб) 18:30

Тот код про который я говорил опробывал на практике
(могу сказать идея была лучше реализации)

Все же я вернулся к первому методу.
1. нахождение кратчайшего пути (только поле поменялось с 32*32 на 64*64)
2. ведём нашего ГГ (глав. герой) последовательно До середины каждого квадрата
3. При достижении последнего, идём до места нажатия мышки (в нутри данного участка)

Всем Огромное СПАСИБО!

Winitar
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 224
Зарегистрирован: 06.07.2006 (Чт) 20:45
Откуда: Астана

Сообщение Winitar » 09.12.2007 (Вс) 9:20

Исходник нужен ещё? Короче вот:
Вложения
smallway.rar
Нахождение кратчайшего пути!
(95.15 Кб) Скачиваний: 55

Gemini
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 390
Зарегистрирован: 24.07.2002 (Ср) 14:15
Откуда: Ozersk

Сообщение Gemini » 09.12.2007 (Вс) 13:16

Спасибо, посмотрю.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 2

    TopList  
cron