Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.218.61.16] |
|
Сообщ.
#1
,
|
|
|
Задача надо чтобы юнит ходил вокгруг препятствия(стены).
переменые и методы <br>type NAPR=( levo,pravo,niz,verh)-тип обозначающий движение<br>POLOZH:napr{текущее направление юнита}<br>в лево,право,низ или вверх;<br>MOZNO(NP:NAPR):boolean;-функция которая говорит можно ли двинуться(на один пиксель) в этом<br>направлении(true если можно)<br>MOVE(NP:NAPR) процедура которая двигает юнит (на один пиксель)<br>в том направлении куда укажет параметр np ;<br> все направления АБСОЛЮТНЫ и НЕ относительны юнита т.е. К примеру если юнит движеться в niz то рано или поздно он упрется в низ экрана. У меня получилось только чтобы юнит дергался в разные стороны но в итоге оставался на одном месте( низнаю может я просто не выспался ) Главные проблемы я считаю это абсолютные направления и движения на расстояние в один пиксель (хотя сам юнит и препятствие разумееться больше одного пиxеля) Пожалуйста помогите кто чем может (идеями, реализацией...). Буду примного благодарен. |
Сообщ.
#2
,
|
|
|
Танчики пишешь? ;D А координаты в процедуре MOVE меняешь? А нигде вовне старые не восстанавливаешь? Че еще.. А объект свой в каком месте рисуешь?
И вообще ЗЫ: Ошибка в 94й строке. (с) Song |
Сообщ.
#3
,
|
|
|
Цитата Танчики пишешь? Просто поразительно как ты догадался? ;D Цитата А координаты в процедуре MOVE меняешь? А нигде вовне старые не восстанавливаешь? Координаты меняю только в процедуре move Цитата А объект свой в каком месте рисуешь? S:record{спрайт} x,y,{координаты левого верхнего угла спрайта} Xsize,Ysize:integer;{ширина и высота спрайта} end; Цитата И вообще ЗЫ: Ошибка в 94й строке. Неправда, я считал - в этой моей мессаге всего 22-строки. |
Сообщ.
#4
,
|
|
|
Mixx, прочитайте книгу:
Секреты программирования игр http://pmg-ru.narod.ru/download/proggame.part1.rar http://pmg-ru.narod.ru/download/proggame.part2.rar и многие вопросы у Вас просто не будут возникать. |
Сообщ.
#5
,
|
|
|
2 Ozzя Ну, хорошо допустим я Mixx :-/
Я сразу скачал эту книженицию как-тока увидел линк (в одном из ныне закрытых паскальных топиков) И какой индивидуум догадался запечатать стоко метров в одном doc файле, у он меня он грузиться 20 минут (к томуже у меня ворда нет). Кроме-того меня никто не спрашивал знаю ли я Си (кстати юзать прогу переводчик ctop я так и не научился) И наконец там про мой случай ничего не сказано. Прошу ещё учесть что я задал не общий вопрос, а конкретный (я вообще думаю что форум как раз для таких случаев и создан, разве нет) |
Сообщ.
#6
,
|
|
|
Цитата Mixxx, 25.06.03, 13:23:22 2 Ozzя Ну, хорошо допустим я Mixx :-/ Извини ;) Цитата Я сразу скачал эту книженицию как-тока увидел линк (в одном из ныне закрытых паскальных топиков) И какой индивидуум догадался запечатать стоко метров в одном doc файле, у он меня он грузиться 20 минут (к томуже у меня ворда нет). Кроме-того меня никто не спрашивал знаю ли я Си (кстати юзать прогу переводчик ctop я так и не научился) И наконец там про мой случай ничего не сказано. Прошу ещё учесть что я задал не общий вопрос, а конкретный (я вообще думаю что форум как раз для таких случаев и создан, разве нет) Посмотри на delphimaster.ru раздел DElphiGX, там среди алогоритмов и статей вроде и обход препятствий был |
Сообщ.
#7
,
|
|
|
2 Ozzя
Да ладно я не обиделся. Посмотрю там где ты велел. 2 All Но я не совсем ето просил. Идею алгоритма обхода я вроде-бы как-бы уловил. Проблема с его реализацией в тех безобразных условиях которые я сам себе создал :'( И ещё я не просил помоч мне реализовать весь алгоритм обхода. Мне нужна токо реализация кружения юнита вокруг горки, да-да именно кружение по круговой траектории в цикле (остальное (обход) я сам доделаю),это как алгоритм поиска выхода из лабиринта - алгоритм левой руки держися левой рукой за стенку и идёшь а если вдруг стена посередине лабиринта и не соприкосаеться с другими его стенами то суждено путнику навеки ходить в лаберинте кругами. Вот именно реализацию этого я и хочу от вас добиться. |
Сообщ.
#8
,
|
|
|
Ага. Ну примерно так: Держишь в объекте текущее направление (скажем cur_dir:NAPR; ) и создаешь функцию "куда", перебирающую направления. Но имхо начать вызывать ее надо лишь когда "дотронулся" до стены, то есть
MOZNO(levo) and MOZNO(pravo) and MOZNO(verh) and MOZNO(niz)=false Да и твои направления надо бы переупорядочить (для оптимизации), вот так: type NAPR=(levo,verh,pravo,niz); if a_napr=niz then a_succ:=levo else a_succ:=succ(a_napr); Да и аналогично a_pred реализовать. Тогда получится function kuda(var t:TANK):NAPR;<br>var a_kuda:NAPR;<br>begin<br> a_kuda:=a_pred(t.cur_dir);<br> repeat<br> if MOZNO(a_kuda) then begin<br> kuda:=a_kuda;<br> exit end;<br> a_kuda:=a_succ(a_kuda);<br> until a_kuda=a_pred(t.cur_dir);<br> {а вот если мы здесь, то ниkuda нельзя :)}<br> kuda:=t.cur_dir;<br>end;<br> других вариантов не придумал. Ну и собсно все, дальше в цикле хватаешь kuda(T) и проверяешь MOZNO ли, и если да то двигаешь. ЗЫ: Только щас заметил POLOZH:napr в 0м посте, переправь cur_dir тады |
Сообщ.
#9
,
|
|
|
Vesper1, ты гений твой алгоритм почти работает:
танк нормально едет по границам экрана но вот со внутреними препятствиями сложно - танчик доезжает до угла объекта и тутже начинает вращаться вокруг своей оси с большой скоростью. Тоесть траектория право-верх-право почамуто неподсилу и трагически обрываеться после того как заканчиваеться "верх". Буду разбираться. Да и почему ты говоришь вызывать токо после <br>MOZNO(levo) and MOZNO(pravo) and MOZNO(verh) and MOZNO(niz)=false <br> Почаму имменно niz? Я вызываю сразу после того как юнит упреться фейсом в стену. |
Сообщ.
#10
,
|
|
|
Аааа, пардону, скобки забыл
(MOZNO(levo) and MOZNO(pravo) and MOZNO(verh) and MOZNO(niz))=false В тот момент, когда "заканчивается верх", проверь на MOZNO(levo) и MOZNO(verh), а вдруг туда нельзя, да еще и вправо нельзя. Или поставь брыкпойнт в точке функции kuda, там где уже никуда нельзя, есть вариант, что оно там циклит. Еще вариант: в процедуре MOVE может быть ляп, то есть говоришь MOVE(pravo) а она только двигает объект, а polozh не меняет, тогда получается, что объект смотрит на стену, а слева есть свободное пространство, в результате чего объект начинает вращаться вокруг пустого места. |
Сообщ.
#11
,
|
|
|
Я нашёл баг просто процедура Move
была так устроена что если задаваемое параметром направление не совпадает с текущим то текущее заменяеться на задаваемое а движения непроисходит. т.е. <br>move(np:napr)<br>begin<br>....<br>if polozh<>np then <br> begin<br> polozh:=np<br> exit;<br> end;<br>....<br>end; Правда это был небаг это было так задумано, но темнемение после того как я это исправил всё заработало. Огромное спасибо тебе ,Vesper1, за помощ. |