|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
16.01.2011, 21:14 | #1 |
Пользователь
Регистрация: 15.08.2010
Сообщений: 24
|
Помогите написать функцию проверки столкновения игрока с координатами
Player.TPcX, Player.TPcY с непроходимой клеткой(-ами) массива. Все объекты имеют размерность 20*20px, массив [0..23,0..23,1] (на 1 не обращайте внимание - это "слой" карты.) Ходить нельзя, если параметр TGMove=0 в записи ячейки Написал такой код: Код:
Если понадобятся, вот исходники: P.S. не занимались графикой и контентом - застряли именно на этой функции P.P.S. Забыл добавить. Текущий код анализирует (пытается ) 8 точек около игрока: 4 угла и середины сторон P.P.P.S. Была еще идея обрабатывать 4 угла и буквально соседние пиксели на прилежащих сторонах. Но не уверен, что сработает, да и профессионалы лучше знают, может, есть лучшие алгоритмы проверок. Последний раз редактировалось Stilet; 05.02.2011 в 15:41. |
18.01.2011, 15:50 | #2 |
Пользователь
Регистрация: 15.08.2010
Сообщений: 24
|
Beermonza, нужна ваша помощь!
Я нашел на форуме в теме http://www.programmersforum.ru/showt...E2%E5%ED%E8%FF ваш алгоритм проверки на столкновения и решил его использовать (помощи не дождался ). Я сделал новую запись Код:
Код:
Код:
Код:
Последний раз редактировалось Enlightened; 18.01.2011 в 15:58. Причина: добавил исходники |
19.01.2011, 10:28 | #3 |
C++, Java
Старожил
Регистрация: 10.04.2010
Сообщений: 2,665
|
А зачем вызывать в таймере? Может, лучше это делать при движении объекта?
|
19.01.2011, 12:43 | #4 |
personality
Старожил
Регистрация: 28.04.2009
Сообщений: 2,882
|
А рабочий пример нужен ? я так повникал-повникал в твоё дело, но что-то уж совсем топором рублено... до конца не понял, уловил только что ты при переходе с первого на второй вариант создал массив вспомогательный (массив нонмувинзонов) и на "коллизию" с ним в цикле проверяешь координаты игрока.
Ошибка твоя может быть в том, что процедура коллизии проверяет твои значения вспомогательные, которые я недокурил толком, так, что перезатирает значение установленное на предыдущих итерациях (см. result в proc collision, у тебя ведь нет прерывания цикла, значит, если найдётся коллизий штук 10, то функция выдаст только последнюю) Ещё. Я бы на твоем месте , кстати, ещё вот так точно не делал бы : If Collision=1 then player.TPsX:=-player.TPsX; //боком If Collision=2 then player.TPsY:=-player.TPsY; //головой ты ведь не арканоид пишешь...а сделал бы вот так : If Collision=1 then player.TPsX:=0; //боком If Collision=2 then player.TPsY:=0; //головой п.с. дам проект с работающей коллизией, писал как-то для теста... там ничего вроде сложного, если откинуть все свистелки (из них там задание поведения объектам в виде бегания по определенной траектории или охота за нашим персонажем и т.п. аркадная ерунда), при чём, писал достаточно топорно, ибо тестировал свои умения сбацать что-то прикольное влёт. Единственное, коллизии с объектами, останавливающих игрока (все объекты проходимы насковь, но коллизии имеют эффект - в примере это видно по "жизням" игрока), не сделано, но это 3 строчки кода в дополнении к процедуре коллизии, и кой-чего из обвязки - загрузка по новосозданному типу из файла данных. Добавлю останавливающую коллизию специально для тебя, если тебе надо п.с.2. молодец , что обратил внимание на индексацию двумерных массивов "сперва строка, потом столбец" а то, видать, у тебя до этого не появлялось каши только из-за квадратности всего и вся - и поля и клеток. Надо изначально решить в таких проектах унификацию храниния данных - чтобы путаницы не возникало (для себя я навсегда решил, что любые вещи индескируются "сперва строка") Последний раз редактировалось phomm; 19.01.2011 в 12:51. |
19.01.2011, 15:13 | #5 |
Инженер ИС
Старожил
Регистрация: 13.12.2006
Сообщений: 2,671
|
Enlightened, извиняюсь за задержку, не так много времени, ...сегодня постараюсь выложить исходник на твоей основе, но с банком текстур, сборным фоном, системой перемещения персонажа, ...все будет подробно закомментировано.
Enlightened, вот смотри исходник. Я исключил много чего, и второй слой объектов тоже, его добавишь сам по прочтении всех комментариев и с осознанием структуры кода. Для карт нужно создать свой редактор, это не дело заносить блокнотом и разделять строки переходами на следующую строку. Посмотри во что превратилась твоя проблема с проходимостью (оно же будет и на столкновение с объектами).
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Последний раз редактировалось Stilet; 05.02.2011 в 15:42. |
23.01.2011, 20:50 | #6 |
Пользователь
Регистрация: 15.08.2010
Сообщений: 24
|
phomm, спасибо за советы. А скорость я отражал потому что боялся, что персонаж застрянет в дереве, например .
Beermonza, благодарю, буду еще учиться - у вас получился код намного компактнее, быстрее, его легче читать. Сам несколько дней отсутствовал: был на областной олимпиаде по информатике же . В ближайшие дни продолжу работу над проектом. И уже, опять-таки, возникли новые вопросы: 1. Игрок нажимает на кнопку вызова инвентаря. Если нужно, чтобы весь остальной мир стоял на паузе, что мне необходимо? Прекратить прорисовку и обработку ИИ? И поверх рисовать окно инвентаря (или меню)? 2. Я подумал, что будет лучше, если каждому объекту не привязывать кучу свойств, а основывать на взаимодействии с игроком. Сразу поясню: допустим, есть объект "дерево" или "камень". Я не буду писать в запись этой клетки флаги о том, разрушено оно или нет, какие ресурсы в нем (тем более, что у разных объектов они разные) и т.д. Суть реализации такова: есть игрок, у него в руках кирка/лопата/молоток, сравниваем инструмент с объектом той клетки, которую я собираюсь возделывать. Если в руках лопата, а игрок хочет добывать ею воду, то выведем сообщение, что бесперспективно занятие сие. Если в руках топор и долбим дерево - все хорошо, даем игроку ресурсы, дерево рисуем как поверженное в неравном бою. Думаю, так будет экономичнее. Я правильно думаю? 3. Генератор карт. Вообще, чудесная штуковина, только вот интересно послушать хотя бы в общих чертах, как оно работает. Пока представляется мне это так: Этап 1. В сплошной воде выделяется случайным образом 1 или несколько клеток. Вокруг них постепенно наращивается земля, random следит, чтобы края были неровны и т.д. Сразу покрывается первичной текстурой. Этап 2. На получившееся накладывается деревья, кусты и прочая флора; камни, скалы.. Цветы, грибы и прочие красивости, если есть, сюда же. Этап 3. В нескольких местах появляются мобы, случайным образом выбирается точка возрождения игрока. Хм.. Так?) 4. ИИ. Для мирных овечек, думаю сделать 2 режима - стоит и перемещается. Незатейливо, конечно, но больше и не надо. Например: все тем же рандомом выбираем 1 из 4 направлений, на 1-2 клетки отходим. Секунд 4-5 стоим. Повторяем вышеописанное. Для хищников условие срабатывания триггера агрессии - если игрок относительно собственной координаты приблизился на расстояние, меньшее R, бежим к нему атаковать. Вот, собственно, и все вопросы. Спасибо за терпение каждому, кто дочитал этот пост до конца . Для любого вопроса моя просьба - посмотрите, правильно ли я понял логику, может, это можно каким-нибудь способом упростить. |
24.01.2011, 00:36 | #7 | ||||
Инженер ИС
Старожил
Регистрация: 13.12.2006
Сообщений: 2,671
|
Если тема будет развиваться как проект, который ты с нуля пишешь, то название темы нужно сменить, придумай его, я поменяю, ...что-то из разряда: "Игра {название игры} (РПГ), создаю с нуля, нужны советы."
Цитата:
Цитата:
Тип предмета Byte (1 - кирка, 2 - лопата, 3 - ведро, 4 - серп, 5 - молоток и т.д.); В слоте Boolean (True - в слоте, False - в рюкзаке); Уровень предмета Byte (сколько минимум может дать ресурса); Цена Word (сумма) ...и еще масса параметров, которые вполне описывают любой предмет. Создается массив этого типа, и каждая ячейка - конкретный предмет игрока. Если в слоте какой-то предмет, смотрим его тип, если он совпадает с типом, подписанном к ресурсу, которым его можно добыть, то выполняем алгоритм добывания, в противном случае - игнорируем действие, выводим надписи, звуки, ...как угодно. Цитата:
Цитата:
Если хочешь помощи, то по порядку, иначе будет каша в теме. Делай что-то одно из списка и спрашивай по ходу, если непонятно что-то.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
|
||||
05.02.2011, 10:28 | #8 |
Пользователь
Регистрация: 15.08.2010
Сообщений: 24
|
Снова проблемы
Дело в том, что редактор карт должен либо в процессе рисования, либо по нажатию определенной кнопки сглаживать углы и стороны определенными типами тайлов (см. папку gfx). То есть либо сразу рисуем хорошие, скругленные острова, либо рисуем угловатые прямоугольники, щелчок - и все сглаживается. Пробовали сделать и так, и так. В итоге ничего дельного не получилось - программа неправильно определяла, где что надо ставить, да еще и не во всех местах, да еще случаев там куча - мало ли, как юзер поставит эти самые тайлы. Прикрепляю очень сырую версию, все ужасные процедуры сглаживания либо взяты в комментарии, либо удалены. Надеюсь на вашу помощь. |
05.02.2011, 19:52 | #9 |
personality
Старожил
Регистрация: 28.04.2009
Сообщений: 2,882
|
тяжело... честно... посмотрел исходник... думал... (здесь и далее "..." это нечто вроде недоумения, никак не критика, желаю наоборот побыстрее решить все проблемы, буду помогать)
1 зачем таймер 2 Код:
3 где buf и cadr освобождаются ? не нашёл... (наводка: объект.free и freeandnil(объект)) 4 Код:
5 я не знаю, может индексация строками удобно... но может лучше взять собственный пересчислимый тип ? 6 во многих местах вижу повторяющиеся цифры... тебе самому будет удобнее, если использовать константы 7 было бы очень кстати, если движение мышки при зажатой кнопке тоже производило рисовку, зачем лишние мышеклики... По поводу конкретно твоей задачи. Я посоветую, как сделать универсально, не сам код, правда, ибо его у меня нет. Могу попробовать написать этот код, у меня есть проект редактора карт http://phomm.narod.ru/programs/h3mtered.htm (он с исходниками, советую глянуть, правда комментирован меньше, чем хотелось бы, при чём, на английском), и написанный код мог бы и я сам использовать в этом редакторе (можем заняться, тогда правда надо бы личный контакт, пиши в личку). Итак, сама идея : Пишется конфигурационный файл (конкретная реализация в твоем проекте - дело твой, это может быть константный массив, ресурс в экзе, просто типизированный файл, или даже xml-подобная структура). В нём указываются такие параметры : Код:
Минусы данного подхода – достаточно простые комбинации, и скорее всего только для сочетания 2 почв, и для упрощения задачи вводится промежуточная почва между всеми сочетаниями. Второй минус – возможная неопределенность при совпадениях в сочетаниях, либо, наоборот, при отсутствии подходящих. Второй способ, уже не мой, я только выложил у себя www.phomm.narod.ru/d.zip там в архиве уроки по дельфи, тебе нужен тот, что лежит в папке MapDelphi, сам код я не разбирал, только урок читал этот. Удачи и успехов! Последний раз редактировалось phomm; 05.02.2011 в 20:02. |
09.06.2011, 09:00 | #10 | |
Пользователь
Регистрация: 15.08.2010
Сообщений: 24
|
Извиняюсь за длительную задержку, теперь снова взялись за проект.
Цитата:
Похоже, что вы ошиблись. Столкновения работают, это да. Все дело с банком текстур. Сначала я просто обратил внимание на то, что уголков нет, хотя должны были быть, ибо в папке с графикой такие тайлы имеются, в самом уровне они обозначены (как s1,s3,s7,s9 соответственно). Тайлы боковых сторон считываются нормально. Элементарная проверка: я самый первый верхний левый угловой тайл заменил на угол. Результаты были впечатляющие - сразу во многих местах оказались не те тайлы. Сначала мы попробовали обойти метки, заменив их на более разумные boolean'овские переменные. То есть: Var .... , b:boolean; Код:
Было бы чудесно, если бы вы, Beermonza, посмотрели бы, свой код ведь легче читать. Посмотрите, что с банком текстур! Если кто из форумчан разъяснит мне проблему - буду только рад помощи. P.S. Исходники см. в посте #5 |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
найти первый отрицательный элемент массива имеющий чётный номер (Delphi) | Vanger | Помощь студентам | 5 | 25.01.2011 11:41 |
Где найти исходники на Java( 1 проект - больше 1000 классов, 2 проект - больше 100, 3 проект - больше 10) | Pti44ka | Общие вопросы по Java, Java SE, Kotlin | 2 | 09.09.2010 21:31 |
Проект в Delphi | TaYgA | Помощь студентам | 4 | 28.10.2009 21:32 |
Курсовой проект по Delphi 7 | Agent[PNZ] | Помощь студентам | 9 | 14.11.2008 13:25 |
проект на delphi(ум.матриц) | Алиба | Помощь студентам | 5 | 23.10.2007 14:02 |