![]() |
|
|
![]()
|
|
| dieterb |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 23.8.2007 Репутация: нет Всего: нет |
у меня есть задача по типу арканоида, не могу решить:
условно: SX - X шарика SY - Y шарика SH - высота шарика SW - ширина шарика SVX - вектор движения шарика по X SVY - вектор движения шарика по Y SS - скорость шарика (очень важно что скорость движения шарика как правило не равна 1, а больше, т.е. он двигается не плавно, а рывками) BX - X блока BY - Y блока BH - высота блока BW - ширина блока вроде все написал, если какие еще нужны входные параметры, можно придумать, я реализую Задача: правильно определить вектор шарика после столкновениея с препятствием (желательно на паскале, хотя пофиг, я переработаю) Меня не интересует дальнейшая его скорость и пр. мне нужен только вектор (направление, "верх", "низ", "верх-лево" и т.д.), я написал сначала условие относительно центра шарика, но столкнулся с тем, что в случае, например 2 блоков подряд (горизонтально, придвинутых вплотную) при попадании в угол между этими двумя блоками, шар отлетает не под 45 градусов, а назад в обратном направлении, в этом вся проблема. заранее спасибо ! |
|||
|
||||
| _Y_ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 8 Всего: 34 |
Я когда-то писал подобную задачу. Все делалось по принципу "угол падения равен углу отражения". Если же шарик попадал в угол, то угол моделировался поверхностью отражения, наклоненной под 45 градусов. Шар, в результате, отлетал не под 45 градусов, но и не обратно, а, типа, под углом 90 минус начальный угол (в зависимости от того, какую стенку считать за ноль, естественно).
-------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
|||
|
||||
| kali |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 139 Регистрация: 9.11.2006 Где: Минск Репутация: нет Всего: 20 |
есть у меня подозрение, что расчет направления у тебя верный.
просто при попадании в точку соприкосновения двух блоков сначала шарик отскакивает от горизонтальной поверхности ближнего блока, а потом еще от вертикальной поверхности дальнего, в результате чего летит в обратном направлении. просто сделай отдельную обработку для таких случаев. --------------------
Работая над решением задачи, всегда полезно знать ответ. |
|||
|
||||
| dieterb |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 23.8.2007 Репутация: нет Всего: нет |
но ведь "наклонить поверхность отражения" можно в 2 стороны. допустим вот угол, это типа рисунок _I шар к нему летит справа-снизу, после "наклона поверхности отражения под 45 градусов" он может отскочить как в "верх-вправо", так и "вниз-влево", в зависимости от того как мы "наклоним поверхность", вот тут и возникает вопрос как повернуть ? разве что смотреть есть ли рядом с этом блоком соседние... Добавлено через 7 минут и 27 секунд
при попадании на угол для шарика срабатывает сначала условие как будто он отлетает от горизонтали на 90 градусов обратно и от вертикали на 90 обратно, в результате получается на 180 обратно. но это при обработке только центра шарика, шарик у меня пока просто точка. |
||||
|
|||||
| kali |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 139 Регистрация: 9.11.2006 Где: Минск Репутация: нет Всего: 20 |
dieterb,
так я не совсем понял. в чем у тебя проблема? --------------------
Работая над решением задачи, всегда полезно знать ответ. |
|||
|
||||
| dieterb |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 23.8.2007 Репутация: нет Всего: нет |
У меня есть 3 простых алгоритма и все они не правльно обрабатывают попадание шарика в точку между двумя блоками. В этом вся проблема. 1 способ: if SY + (SH/2) < BY then SVY:=-SVY; if SX + (SW/2) < BX then SVX:=-SVX; if SY + (SH/2) > BY + BH then SVY:=abs(SVY); if SX + (SW/2) > BX + BW then SVX:=abs(SVX); 2 способ: if SY + (SH/2) < BY then SVY:=-SVY; if (SX + (SW/2) < BX) and (SY + (SH/2) >= BY) and (SY + (SH/2) <= BY + BH) then SVX:=-SVX; if SY + (SH/2) > BY + BH then SVY:=abs(SVY); if (SX + (SW/2) > BX + BW) and (SY + (SH/2) >= BY) and (SY + (SH/2) <= BY + BH) then SVX:=abs(SVX); 3 способ: if (SY < BY + Sh[i,j].BitH) and (SY + SH > BY + Sh[i,j].BitH) and (SX + (SW/2) > BX) and (SX + (SW/2) < BX + Sh[i,j].BitW) then SVY:=-SVY; if (SY < BY) and (SY + SH > BY) and (SX + (SW/2) > BX) and (SX + (SW/2) < BX + Sh[i,j].BitW) then SVY:=-SVY; if (SX < BX) and (SX + SW > BY) and (SY + (SH/2) > BY) and (SY + (SH/2) < BY + Sh[i,j].BitH) then SVX:=-SVX; if (SX < BX + Sh[i,j].BitW) and (SX + SW > BX + Sh[i,j].BitW) and (SY + (SH/2) > BY) and (SY + (SH/2) < BY + BY) then SVX:=-SVX; |
|||
|
||||
| _Y_ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 8 Всего: 34 |
По мне - так прямой угол _I моделируется плоскостью / (45 градусов). Причем как в случае шарика летящего снизу-справа (внешний угол), так и сверху-слева (внутренний угол). А "варианты" получаются только если удар пришелся не точно в угол, а в одну из его сторон. Впрочем, по ощущениям, сам Арканоид давал некоторый разброс при отскоке от углов. Но это скорее было сделано специально датчиком случайных чисел, чтобы несколько усложнить игру. -------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
|||
|
||||
| dieterb |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 23.8.2007 Репутация: нет Всего: нет |
По твоему получается что в случае поподания шарика в угол блока он отлетит обратно - и это нормально. Хотя может быть я не правильно задачу поставил. Да, он должен отлететь обратно, но как сделать так что бы этого не произошло если к этому блоку приставлен другой и удар пришелся на стык этих двух блоков ? посмотри мои алгоритмы, может что подскажешь. Хотя бы для одного угла или стороны. |
||||
|
|||||
| likehood |
|
|||
|
666 ![]() ![]() Профиль Группа: Участник Сообщений: 536 Регистрация: 21.12.2005 Репутация: 1 Всего: 24 |
Можно несколько стоящих вплотную блоков представить в виде одного большого блока. Только придется придумать алгоритм объединения блоков.
|
|||
|
||||
| dieterb |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 23.8.2007 Репутация: нет Всего: нет |
я седня уже как раз над этим думал но в итоге решил, что в реальной жизни шар не взаимодействует с двумя блоками как с единым целым, более того, в этом случае шар соприкоснется одной своей точкой только с одним блоком и значит должно быть решение. придумал не идеальный, но все же нормальный вариант:
может кому нить понадобится. |
||||
|
|||||
| _Y_ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 8 Всего: 34 |
Нет, это не по моему
-------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
|||
|
||||
![]()
|
| Правила форума "Алгоритмы" | |
|
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Алгоритмы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |