![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Помогите, пожалуйста, с проблемой, возникшей в процессе написания простого арканоида. Дело в том, что не правильно работает обработка столкновений шарика с блоками. Иногда шарик отскакивает правильно, а иногда пролетает сквозь блоки, подвешивая программу. Проверка столкновения происходит по 6 точкам (по двум слева - сверху и снизу спрайта, 2 сверху - слева и справа, 2 справа - сверху и снизу).
Код:
Последний раз редактировалось Shpingalet, 14.09.2012 в 09:15. |
#2
|
||||
|
||||
![]() Цитата:
|
#3
|
||||
|
||||
![]() Несколько раз позапускал - шарик ни разу от блока не отскочил, всё время проходит сквозь блоки и программа ни разу не зависла.
А какой версией DelphiX ты пользуешься? p.s. А угол отскока что, менять нельзя? ![]() |
#4
|
|||
|
|||
![]() Шарик отскакивает! Правда один раз из 5 где-то
![]() DelphiX качал отсюда Последний раз редактировалось Shpingalet, 12.09.2012 в 09:52. |
#5
|
||||
|
||||
![]() Цитата:
![]() Цитата:
![]() Цитата:
![]() |
#6
|
|||
|
|||
![]() Цитата:
|
#7
|
||||
|
||||
![]() Цитата:
![]() p.s. Интересно в чём проблема, в DelphiX или в твоей программе... ![]() ![]() |
#8
|
|||
|
|||
![]() Я думаю, что ошибка закралась в обработке условия на 104 строке. Дело в том, что я пробовал дебагать разные места в программе (в архиве версия где много чего закомментировано с этой целью), так вот я там проверял отдельной переменной с какой стороны идет столкновение. И всегда оно мне выдавало что сталкивается слева, хотя должно быть сверху. Спрайт шарика 10х10 пикселов. Проверка идет по цвету точек левее, выше и правее этих размеров. Пробовал отдалять от шарика точки проверки на столкновение, увеличивать "рамку" шарика, но это ничего не меняет.
Последний раз редактировалось Shpingalet, 12.09.2012 в 11:03. |
#9
|
|||||
|
|||||
![]() Цитата:
![]() Код:
Код:
|
#10
|
|||
|
|||
![]() Возможно у Вас есть идеи как организовать проверку стороны с которой шарик ударяется по блоку?
|
#11
|
||||
|
||||
![]() Цитата:
|
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
Shpingalet (13.09.2012)
|
#12
|
|||
|
|||
![]() Цитата:
UPD Сразу возник вопрос. Как определить о какой именно из блоков ударился шарик, если в моем примере они располагаются на экране через массив и никак не отличаются друг от друга? И вообще возможно ли откуда-нибудь взять координаты спрайта с которым столкнулся шарик? UPD №2 Конечно, я думаю, можно запихнуть проверку на столкновение не в процедуру с шариком, а в процедуру с блоком, но как тогда будет проходить проверка и на сколько она замедлит работу программы? Ведь у меня получается 100 спрайтов, которые будут постоянно сравниваться на столкновения. Последний раз редактировалось Shpingalet, 12.09.2012 в 12:13. |
#13
|
||||
|
||||
![]() Цитата:
![]() Цитата:
Цитата:
p.s. Кстати DelphiX использует DirectDraw, который считается тормознутым и вообще устаревшим. Сейчас и 2D и 3D делают только через Direct3D (ну или OpenGL, но это другая история). |
#14
|
|||
|
|||
![]() Итак, я переделал условия для расчета столкновений и предыдущие проблемы сразу стали явными, хотя и повторяются вновь. Дело в том, что проверка идет по относительному положению спрайта блока и спрайта шарика в момент столкновения, но почему-то DelphiX рассчитывает этот момент ОЧЕНЬ неточно! Доходит до +/- 2 пикселов! Естественно что если по условию разница в координате должна быть 14, а она 12 (причем может и 16), то выполняется совершенно не то что надо.
В связи с этим такой вопрос: можно ли как-нибудь более точно отслеживать столкновения? Может быть что-нибудь впихнуть в таймер? ЗЫ прикрепил обновленный вариант программы (при столкновении sleep 5 сек) |
#15
|
||||
|
||||
![]() Исправил все ошибки предыдущей версии программы, но добавилась другая
![]() Если у кого-либо есть желание, просьба подсказать что в этом условии не так? (vector - угол полета шарика в градусах) Код:
Код:
|