|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
27.12.2010, 17:18 | #1 |
Форумчанин
Регистрация: 01.12.2010
Сообщений: 140
|
Оптимизация кода столкновения объектов
Всем привет.
Помогите разобраться, как лучше организовать обработку столкновений, как можно оптимизировать код. Итак, в общем есть проект, карта генерируется рандомно, объекты создаются рандомно. Есть модель "игрок", есть модель "блок". Игрок может взаимодействовать с блоком, при этом скорость игрока передаётся блоку, пока без учёта массы блока, но с учётом трения (блок останавливается). При этом блок может взаимодействовать с другими блоками. При этом если блок заходит за экран, то он меняет своё направление на противоположное и опят проверяется столкновение с другими объектами. У меня в проекте всё это проверяется рекурсивно. Так вот какие проблемы возникают: - Блоки могут немного "наползать" друг на друга; - Игрок иногда может "проскочить" сквозь блок; Я не собираюсь создавать физ. движок, помогите разобраться только с этими недочётами. Проект во вложении. Код обработки столкновений в модуле MPhysics.pas в папке Modules. Код прокомментирован. Спасибо за внимание. |
27.12.2010, 20:05 | #2 |
Инженер ИС
Старожил
Регистрация: 13.12.2006
Сообщений: 2,671
|
Очень сложно разбираться. Чрезмерная модульность ведет к ошибкам и тормозности программы. Проще и нагляднее создать просто массив в массиве, в котором несколько проверок на столкновение: сверху, снизу, справа, слева для каждого проверяемого объекта, ...так же как это делает алгоритм обрезки спрайтов, если они выходят за экран.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
|
27.12.2010, 20:25 | #3 | ||
Форумчанин
Регистрация: 01.12.2010
Сообщений: 140
|
Цитата:
Цитата:
|
||
27.12.2010, 21:29 | #4 | |
Инженер ИС
Старожил
Регистрация: 13.12.2006
Сообщений: 2,671
|
В момент проверки, суть, все объекты статичны, известно их местоположение со всеми смещениями и габаритами. Внешний цикл берет каждый проверяемый объект, внутренний цикл перебирает еще раз все объекты, кроме текущего по первому циклу. У тебя что-то похожее, но какие-то флаги Checked, ...процедуры UncheckBlocks, Collision, Colis, ...если словесно опишешь работу, постараюсь помочь.
...я извиняюсь, напечатал: Цитата:
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Последний раз редактировалось Beermonza; 27.12.2010 в 21:33. |
|
27.12.2010, 22:06 | #5 |
Форумчанин
Регистрация: 01.12.2010
Сообщений: 140
|
Честно говоря, я сам запутался...
Сейчас новый код написал обработки столкновений, более ясный, понятный, но ... не работает. В общем, сейчас проверка столкновений идёт следующим образом: 1) Проверяется пересечения всех объектов с игроком. Если проверка прошла, то присваиваем блоку(объекту) ускорение игрока по X и по Y; 2) После проверки, начинается проверка пересечения каждого блока с другими блоками, пока пересечения не прекращаться. Вот такой вот код (который и не работает...) Код:
P.S. +3 стоит затем, что некоторые блоки после рандомного расставления пересекаются и не имеют начального ускорения. |
27.12.2010, 23:22 | #6 |
Инженер ИС
Старожил
Регистрация: 13.12.2006
Сообщений: 2,671
|
Тебя запутала функция вот эта:
Код:
Код:
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Последний раз редактировалось Beermonza; 27.12.2010 в 23:26. |
27.12.2010, 23:54 | #7 |
Форумчанин
Регистрация: 01.12.2010
Сообщений: 140
|
Твой код не будет работать корректно, потому что если даже допустить, что по X объекты пересеклись, то по Y они могут быть на приличном расстоянии друг от друга.
Функция Collision вообще корректно работает: когда я проверял её на одном объекте, всё было успешно (да и на нескольких объектах она тоже работает). Сегодня уже не буду возвращаться к проекту... завтра продолжу разбираться. Если будут какие-то сдвиги, обязательно напишу. |
28.12.2010, 20:20 | #8 |
Инженер ИС
Старожил
Регистрация: 13.12.2006
Сообщений: 2,671
|
Не нашел еще проблемы? Вот посмотри рабочую функцию определения столкновений:
Код:
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
|
28.12.2010, 21:20 | #9 |
Форумчанин
Регистрация: 01.12.2010
Сообщений: 140
|
Beermonza, спасибо за код, но повторюсь, что та функция рабочая. Не работало, потому, что я запутался в параметрах и передавал их не в том порядке. Но всё равно проблема такая, что блоки могут как резко "перепрыгивать" друг через друга, так и нормально сталкиваться. Часто случается зацикливание, а почему - я не могу понять. Думаю, что одна из причин - это вхождение одного блока в другой и при том блок вошедший не обладает ускорением, а потому не может "выйти" из другого блока. Происходит зацикливание, потому что именно эти два блока постоянно пересекаются.
... Нужно вот такое: игрок толкает блок, блок обретает ускорение и при столкновении с другим блоком передаёт ему ускорение, а сам располагается ровно по контуру другого блока, то есть не заходит за его границы... как-то так. Было бы проще всё это реализовать, двигаясь игрок только вверх, вниз, влево, вправо, а так он может поворачиваться на все 360 градусов, и не могу никак додумать, как же "выровнять блок по контуру другого блока"... ну может я немного коряво объяснил, с детства отличаюсь костноязычностью. =) Картиночка: Последний раз редактировалось Asker13; 28.12.2010 в 21:41. |
28.12.2010, 22:09 | #10 |
Инженер ИС
Старожил
Регистрация: 13.12.2006
Сообщений: 2,671
|
Я избавился от излишней модульности и понял работу программы, упростил на сколько смог. Но возникает заползание ящиков тоже, но уже после вторичного столкновения, ...т.е. игрок толкает ящик, он отлетает, толкает второй, этот тоже отлетает, а вот уже третий в цепочке не подчиняется, это связано с тем, что цикл перебора 2-го порядка, учитывающий взаимодействие только 2-х ящиков. Условий как вести себя в случае краев просто нет, они кривые. Вот попробуй изучить:
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
|
|
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Оптимизация кода | ViktorG | Microsoft Office Excel | 4 | 12.11.2010 14:43 |
Оптимизация кода. | Alex Cones | Общие вопросы Delphi | 19 | 12.10.2009 20:51 |
Оптимизация кода | viscas | PHP | 3 | 31.05.2009 16:04 |
Оптимизация кода | nusik | Общие вопросы Delphi | 2 | 21.05.2009 17:55 |
Оптимизация кода. | MAKTECYMA | Общие вопросы C/C++ | 2 | 05.06.2008 16:48 |