Алгоритм игры пинбол (pinball)
От: Maraba  
Дата: 02.07.05 10:48
Оценка:
Собираюсь делать игру пинбол для мобильного на j2me. Разрабатываю алгоритм и не могу кое-чего понять: как вычислить направление отскока шарика от кривой поверхности? (зал (игровое поле) хранится как картинка в растровом формате)
Re: Алгоритм игры пинбол (pinball)
От: Александр.Сергеевич Россия  
Дата: 02.07.05 11:12
Оценка: +1
Здравствуйте, Maraba, Вы писали:

M>Собираюсь делать игру пинбол для мобильного на j2me. Разрабатываю алгоритм и не могу кое-чего понять: как вычислить направление отскока шарика от кривой поверхности? (зал (игровое поле) хранится как картинка в растровом формате)


Ну это физика. Раздел Кинематика.

Игра 2Д или 3Д?
<<Winamp играет: Luminita Anghel & Sistem (Romania) — Let Me Try>>
Re: Алгоритм игры пинбол (pinball)
От: Рома Мик Россия http://romamik.com
Дата: 02.07.05 11:18
Оценка:
Здравствуйте, Maraba, Вы писали:

M>Собираюсь делать игру пинбол для мобильного на j2me. Разрабатываю алгоритм и не могу кое-чего понять: как вычислить направление отскока шарика от кривой поверхности? (зал (игровое поле) хранится как картинка в растровом формате)

Видимо определить все же угол наклона поверхности к горизонталив данной точке. Быстрее всего будет сделать это заранее и для каждой точки хранить этот угол.
... << RSDN@Home 1.1.4 beta 7 rev. 468>>
Re[2]: Алгоритм игры пинбол (pinball)
От: Mamut Швеция http://dmitriid.com
Дата: 02.07.05 12:41
Оценка:
M>>Собираюсь делать игру пинбол для мобильного на j2me. Разрабатываю алгоритм и не могу кое-чего понять: как вычислить направление отскока шарика от кривой поверхности? (зал (игровое поле) хранится как картинка в растровом формате)

АС>Ну это физика. Раздел Кинематика.


Я конечно могу ошибаться, но движения шариков в пинболах скорее напоминает движение под углом к горизонту в одной плоскости, чем движение по наклонной плоскости


dmitriid.comGitHubLinkedIn
Re[3]: Алгоритм игры пинбол (pinball)
От: Александр.Сергеевич Россия  
Дата: 02.07.05 13:08
Оценка:
Здравствуйте, Mamut, Вы писали:

M>>>Собираюсь делать игру пинбол для мобильного на j2me. Разрабатываю алгоритм и не могу кое-чего понять: как вычислить направление отскока шарика от кривой поверхности? (зал (игровое поле) хранится как картинка в растровом формате)


АС>>Ну это физика. Раздел Кинематика.


M>Я конечно могу ошибаться, но движения шариков в пинболах скорее напоминает движение под углом к горизонту в одной плоскости, чем движение по наклонной плоскости


Ничего не понимаю А это причем?

Хотя физика была на первом курсе, может я чего путаю
<<Winamp играет: Аквариум — Крюкообразность>>
Re[2]: Алгоритм игры пинбол (pinball)
От: Maraba  
Дата: 02.07.05 14:22
Оценка:
Здравствуйте, Рома Мик, Вы писали:

РМ>Здравствуйте, Maraba, Вы писали:


M>>Собираюсь делать игру пинбол для мобильного на j2me. Разрабатываю алгоритм и не могу кое-чего понять: как вычислить направление отскока шарика от кривой поверхности? (зал (игровое поле) хранится как картинка в растровом формате)

РМ>Видимо определить все же угол наклона поверхности к горизонталив данной точке. Быстрее всего будет сделать это заранее и для каждой точки хранить этот угол.
Да, но если это хранить угол наклона для каждой точки, то создание и хранение залов значительно усложняется.
Re[2]: Алгоритм игры пинбол (pinball)
От: Maraba  
Дата: 02.07.05 14:23
Оценка:
Здравствуйте, Александр.Сергеевич, Вы писали:

АС>Здравствуйте, Maraba, Вы писали:


M>>Собираюсь делать игру пинбол для мобильного на j2me. Разрабатываю алгоритм и не могу кое-чего понять: как вычислить направление отскока шарика от кривой поверхности? (зал (игровое поле) хранится как картинка в растровом формате)


АС>Ну это физика. Раздел Кинематика.


АС> Игра 2Д или 3Д?

Игра 2D, но все же это не физика а скорее геометрия
Re[3]: Алгоритм игры пинбол (pinball)
От: Александр.Сергеевич Россия  
Дата: 02.07.05 15:01
Оценка:
Здравствуйте, Maraba, Вы писали:

M>Здравствуйте, Александр.Сергеевич, Вы писали:


АС>>Здравствуйте, Maraba, Вы писали:


M>>>Собираюсь делать игру пинбол для мобильного на j2me. Разрабатываю алгоритм и не могу кое-чего понять: как вычислить направление отскока шарика от кривой поверхности? (зал (игровое поле) хранится как картинка в растровом формате)


АС>>Ну это физика. Раздел Кинематика.


АС>> Игра 2Д или 3Д?

M>Игра 2D, но все же это не физика а скорее геометрия

ага, а как насчет импульса? ускорения? скорости

В общем смотри у тебя есть структура такого типа:

struct ball
{
    int32_t x, y; // координаты
    int32_t vx, vy; // скорость по х и у
    [...тут еще чего-нибудь...]
};


теперь, когда сталкивешься с поверхностью, смотри куда она наклонена влево/право, вверх/низ и соответственно меняй знак у соответствующей компоненты скорости. Для мобилы алгоритм покатит — быстро, а реалистичность особая и не надо.
Можешь менять не просто знак скорости, а еще и величину.

В общем это то, что сейчас в голову пришло, может есть более простое решение.
<<Winamp играет: Аквариум — Марина>>
Re[4]: Алгоритм игры пинбол (pinball)
От: Maraba  
Дата: 02.07.05 15:28
Оценка:
Здравствуйте, Александр.Сергеевич, Вы писали:

АС>Здравствуйте, Maraba, Вы писали:


M>>Здравствуйте, Александр.Сергеевич, Вы писали:


АС>>>Здравствуйте, Maraba, Вы писали:


M>>>>Собираюсь делать игру пинбол для мобильного на j2me. Разрабатываю алгоритм и не могу кое-чего понять: как вычислить направление отскока шарика от кривой поверхности? (зал (игровое поле) хранится как картинка в растровом формате)


АС>>>Ну это физика. Раздел Кинематика.


АС>>> Игра 2Д или 3Д?

M>>Игра 2D, но все же это не физика а скорее геометрия

АС>ага, а как насчет импульса? ускорения? скорости


АС>В общем смотри у тебя есть структура такого типа:


АС>
АС>struct ball
АС>{
АС>    int32_t x, y; // координаты
АС>    int32_t vx, vy; // скорость по х и у
АС>    [...тут еще чего-нибудь...]
АС>};
АС>


АС>теперь, когда сталкивешься с поверхностью, смотри куда она наклонена влево/право, вверх/низ и соответственно меняй знак у соответствующей компоненты скорости. Для мобилы алгоритм покатит — быстро, а реалистичность особая и не надо.

АС>Можешь менять не просто знак скорости, а еще и величину.

АС>В общем это то, что сейчас в голову пришло, может есть более простое решение.

То, что надо ускорение и скорость — это понятно. Как раз самая сложная проблема состоит в том, чтобы определить куда наклонена поверхность. Ведь в пинболе поверхности не только прямые, но и изогнутые.
Re[5]: Алгоритм игры пинбол (pinball)
От: Александр Сергеевич Россия  
Дата: 02.07.05 15:35
Оценка:
Здравствуйте, Maraba, Вы писали:

M>То, что надо ускорение и скорость — это понятно. Как раз самая сложная проблема состоит в том, чтобы определить куда наклонена поверхность. Ведь в пинболе поверхности не только прямые, но и изогнутые.


А касательные для чего придумали?
<<Winamp играет: Аквариум — Сыновья молчаливых дней>>
Re[6]: Алгоритм игры пинбол (pinball)
От: Maraba  
Дата: 02.07.05 15:42
Оценка:
Здравствуйте, Александр Сергеевич, Вы писали:

АС>Здравствуйте, Maraba, Вы писали:


M>>То, что надо ускорение и скорость — это понятно. Как раз самая сложная проблема состоит в том, чтобы определить куда наклонена поверхность. Ведь в пинболе поверхности не только прямые, но и изогнутые.


АС>А касательные для чего придумали?

Ну вот а как касательную провести к кривой в данной точке?
Re[3]: Алгоритм игры пинбол (pinball)
От: Рома Мик Россия http://romamik.com
Дата: 02.07.05 15:46
Оценка:
Здравствуйте, Maraba, Вы писали:

M>Здравствуйте, Рома Мик, Вы писали:


РМ>>Здравствуйте, Maraba, Вы писали:


M>>>Собираюсь делать игру пинбол для мобильного на j2me. Разрабатываю алгоритм и не могу кое-чего понять: как вычислить направление отскока шарика от кривой поверхности? (зал (игровое поле) хранится как картинка в растровом формате)

РМ>>Видимо определить все же угол наклона поверхности к горизонталив данной точке. Быстрее всего будет сделать это заранее и для каждой точки хранить этот угол.
M>Да, но если это хранить угол наклона для каждой точки, то создание и хранение залов значительно усложняется.
Ну хранение конечно усложняется, но не принципиально. А насчет создания, то если ручками, это должно выглядеть так: задаешь прямую или кривую (дугу, параболу, сплайн) и программа в точках, через которые линия проходит выставляет значения, таких кривых на уровень будет ну штук двадцать, не так уж и сложно. Но можно и вообще автоматизировать, т.к. чего нельзя в ранйтаме можно всегда заранее, да хотя бы на этапе загрузки.
Алгоритм такой:
1)Берем точку заведомо внутри, там где может лететь шарик и стандартным алоритмом заливки заливаем. Запоминаем крайние точки. Эти точки и есть точки, в которых шарик может ударятся, то есть для них нужны угла.
2)Выстраиваем эти точки в последовательность. Это не сложно, но писать долго. Возможно последовательностей будет несколько.
3)Для каждой точки глядя на соседей определяем угол. Вариантов расположения двух соседей всего ничего, так что это не сложно.
... << RSDN@Home 1.1.4 beta 7 rev. 468>>
Re[4]: Алгоритм игры пинбол (pinball)
От: Maraba  
Дата: 02.07.05 16:01
Оценка:
Здравствуйте, Рома Мик, Вы писали:

РМ>Ну хранение конечно усложняется, но не принципиально. А насчет создания, то если ручками, это должно выглядеть так: задаешь прямую или кривую (дугу, параболу, сплайн) и программа в точках, через которые линия проходит выставляет значения, таких кривых на уровень будет ну штук двадцать, не так уж и сложно. Но можно и вообще автоматизировать, т.к. чего нельзя в ранйтаме можно всегда заранее, да хотя бы на этапе загрузки.

РМ>Алгоритм такой:
РМ>1)Берем точку заведомо внутри, там где может лететь шарик и стандартным алоритмом заливки заливаем. Запоминаем крайние точки. Эти точки и есть точки, в которых шарик может ударятся, то есть для них нужны угла.
РМ>2)Выстраиваем эти точки в последовательность. Это не сложно, но писать долго. Возможно последовательностей будет несколько.
РМ>3)Для каждой точки глядя на соседей определяем угол. Вариантов расположения двух соседей всего ничего, так что это не сложно.
Ну так если определять угол для точки глядя только на две соседние точки — то это будет достаточно неточное определения угла. И как определять угол по двум соседним точкам? Провести окружность через текущую точку и две соседние, провести касательную к этой окружности и т.д.?
Re[5]: Алгоритм игры пинбол (pinball)
От: Рома Мик Россия http://romamik.com
Дата: 02.07.05 16:11
Оценка: 2 (1)
Здравствуйте, Maraba, Вы писали:

M>Ну так если определять угол для точки глядя только на две соседние точки — то это будет достаточно неточное определения угла. И как определять угол по двум соседним точкам? Провести окружность через текущую точку и две соседние, провести касательную к этой окружности и т.д.?

Если через три точки, то соединить две крайние, а среднюю проигнорировать.
Если через большее число, то провести сплайн (за глаза достаточно третьей степени) сразу через все, и смотреть уже его производную.
... << RSDN@Home 1.1.4 beta 7 rev. 468>>
Re[6]: Алгоритм игры пинбол (pinball)
От: Maraba  
Дата: 02.07.05 16:30
Оценка:
Здравствуйте, Рома Мик, Вы писали:

РМ>Если через три точки, то соединить две крайние, а среднюю проигнорировать.

РМ>Если через большее число, то провести сплайн (за глаза достаточно третьей степени) сразу через все, и смотреть уже его производную.

То есть можно определить две соседние точки и провести через них прямую, от которой и просчитывать отскок? (А производную накладно считать)
Re[7]: Алгоритм игры пинбол (pinball)
От: Александр Сергеевич Россия  
Дата: 02.07.05 16:43
Оценка:
Здравствуйте, Maraba, Вы писали:

M>Здравствуйте, Александр Сергеевич, Вы писали:


АС>>Здравствуйте, Maraba, Вы писали:


M>>>То, что надо ускорение и скорость — это понятно. Как раз самая сложная проблема состоит в том, чтобы определить куда наклонена поверхность. Ведь в пинболе поверхности не только прямые, но и изогнутые.


АС>>А касательные для чего придумали?

M>Ну вот а как касательную провести к кривой в данной точке?
Я уже спрашивал как у тебя задается эта кривая. Параметрически? Или массивом?
Если массивом, то очень просто. Если массив такой:

struct vertex2d
{
    int32_t x, y;
};

vertex2d border[MAX_POINTS];


В этом случае касательная (а в данном случае правильнее — стенка или сторона многоугольника), грубо это 2 соседние точки в массиве:
border[i], border[i + 1]


Повторяю. Раз пишешь для мобилы, вычислять тебе надо как можно меньше. Всё что можно посчитать заранее — надо посчитать заранее и сохранить где-то, либо считать это всё при старте, либо считать на компе, а сохранять в файл.
В общем советую массив Тем более, что упрощает задачу пересечения. А вообще конечно если кривая очень гладкая нужна, то массив большой будет. В общем тут надо выбирать что-то среднее между красивостью и скоростью + память.
<<Winamp играет: Аквариум — Мы никогда не станем старше>>
Re[8]: Алгоритм игры пинбол (pinball)
От: Александр Сергеевич Россия  
Дата: 02.07.05 16:47
Оценка: 2 (1)
Здравствуйте, Александр Сергеевич, Вы писали:


M>>Ну вот а как касательную провести к кривой в данной точке?

АС>Я уже спрашивал как у тебя задается эта кривая. Параметрически? Или массивом?
АС>Если массивом, то очень просто. Если массив такой:

АС>
АС>struct vertex2d
АС>{
АС>    int32_t x, y;
АС>};

АС>vertex2d border[MAX_POINTS];
АС>


АС>В этом случае касательная (а в данном случае правильнее — стенка или сторона многоугольника), грубо это 2 соседние точки в массиве:

АС>
АС>border[i], border[i + 1]
АС>


АС>Повторяю. Раз пишешь для мобилы, вычислять тебе надо как можно меньше. Всё что можно посчитать заранее — надо посчитать заранее и сохранить где-то, либо считать это всё при старте, либо считать на компе, а сохранять в файл.

АС>В общем советую массив Тем более, что упрощает задачу пересечения. А вообще конечно если кривая очень гладкая нужна, то массив большой будет. В общем тут надо выбирать что-то среднее между красивостью и скоростью + память.

Кстати массив хорош еще тем, что просто создать редактор уровней. Потом можно заделать много уровней и пусть человек играет.
<<Winamp играет: Аквариум — Мы никогда не станем старше>>
Re[9]: Алгоритм игры пинбол (pinball)
От: Maraba  
Дата: 02.07.05 17:25
Оценка:
Здравствуйте, Александр Сергеевич, Вы писали:


АС>Кстати массив хорош еще тем, что просто создать редактор уровней. Потом можно заделать много уровней и пусть человек играет.


То есть мне надо хранить массив опорных точек, которые будут соответствовать границам стен зала? А если зал будет храниться в таком виде, то как определять столкновение со стенкой?
Re[7]: Алгоритм игры пинбол (pinball)
От: Рома Мик Россия http://romamik.com
Дата: 02.07.05 17:57
Оценка:
Здравствуйте, Maraba, Вы писали:

M>То есть можно определить две соседние точки и провести через них прямую, от которой и просчитывать отскок? (А производную накладно считать)

Ну надо еще предусмотреть случай, когда эти точки совпадают, тогда перпендикуляр линии соединяющей центральную и соседние точки, ну а все три совпадать не могут по построению.
Для трех точек это будет эквивалентно расчету производной. И я думаю, для пинбола достаточно точно.
... << RSDN@Home 1.1.4 beta 7 rev. 468>>
Re[10]: Алгоритм игры пинбол (pinball)
От: Александр Сергеевич Россия  
Дата: 02.07.05 18:33
Оценка: 2 (1)
Здравствуйте, Maraba, Вы писали:

M>Здравствуйте, Александр Сергеевич, Вы писали:



АС>>Кстати массив хорош еще тем, что просто создать редактор уровней. Потом можно заделать много уровней и пусть человек играет.


M>То есть мне надо хранить массив опорных точек, которые будут соответствовать границам стен зала? А если зал будет храниться в таком виде, то как определять столкновение со стенкой?


У твоего шарика есть радиус.
И есть отрезок который мы проверяем на столкновение с шариком.

Если точка (ball.x + ball.radius; ball.y + ball.radius) лежит на отрезке, то столкновение произошло. Узнать лежит ли точка на отрезке, можно через уравнение прямой. Вообще тут надо смотреть не совсем так.

  +-+
  |0|
  +-+

Вот смотри, нолик это твой шарик. И вокруг него квадрат с координатами левой верхней вершины (ball.center.x — ball.radius, ball.center.y — ball.radius) и правой нижней (ball.center.x + ball.radius, ball.center.y + ball.radius). Дык вот все 4 точки надо так проверить. Если хоть по одной координате есть пересечение — значит стукнулись.

Столкновение и отражение:
a   n    b
\   |   /                   
 \  |  /                     
  \ | /                       
   \|/                         
-------------------

n — нормаль.
а — вектор падения.
b — вектор отражения.

вектор а — его ты знаешь (скорость (vx, vy) ).
Пусть отрезок с которым идёт пересечение:
v1 ---------- v2


vec = (v2.x - v1.x; v2.y - v1.y) - вектор этой прямой.


Находишь нормаль (причем просто направление, длина не этого вектора нам нужна):
n = (-vec.y, vec.x)


Теперь вычислим еденичный нормальный вектор (он нам нужен для направления).
n1 = n / |n|


А теперь вычислим проекцию а на n1. Это и будет высота получившегося треугольника. Обозначим её как N.
N=(-a * n1) * n1

Т.е. скалярное произведение и n1 умноженное на вектор n1

Дальше геометрически:
b = 2N + a


Уффффф. В общем вот так. Короче говоря, тебе нужен будет учебник по геометрии. Я вот в него сейчас заглядывал .
<<Winamp играет: Аквариум — С утра шел снег>>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.