Форум программистов, компьютерный форум, киберфорум
Программирование игр
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
122 / 65 / 4
Регистрация: 12.04.2009
Сообщений: 1,047

Как дополнить алгоритм игры, схожей с бильярдом?

29.01.2010, 08:26. Показов 2923. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здраствуйте! Вообще-то моя прога на Action Script 3.0 (Flash). Но вопрос по сути об алгоритме!!

игра которую я разрабатываю чем-то схожа с билиардом! нашёл в сети функцию обработки сталкновения:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
  private function collideBall(ballA:Ball,ballB:Ball):void
{
  var plotnost = 0.95; 
 
    /**
  * Находим точку столкномвения
  * (Центр отрезка между двумя центрами)
  **/
  var cx = (ballA.tx + ballB.tx)/2;
  var cy = (ballA.ty + ballB.ty)/2;
  
    /**
  * Находим Растояние между шарами
  * (Может быть и меньше 2х радиусов, необходима для выравнивания шара)
  **/
  var d = geom.distance(ballA.tx, ballA.ty, ballB.tx, ballB.ty)/2;
  
    /**
  * Сдвигаем шарики (отскок)
  * (Может быть и меньше 2х радиусов, необходима для выравнивания шара)
  **/
  ballA.tx = cx + (_ballRadius) * (ballA.tx - ballB.tx)/2/d;
  ballA.ty = cy + (_ballRadius) * (ballA.ty - ballB.ty)/2/d;
  
  ballB.tx = cx + (_ballRadius) * (ballB.tx - ballA.tx)/2/d;
  ballB.ty = cy + (_ballRadius) * (ballB.ty - ballA.ty)/2/d;
  
  
    /**
  * Сдвигаем шарики промежуточное положение
  * (Может быть и меньше 2х радиусов, необходима для выравнивания шара)
  **/
  ballB.tx = ballB.tx - ballB.speedX/_delimiter;
  ballB.ty = ballB.ty - ballB.speedY/_delimiter;
  
  ballA.tx = ballA.tx - ballA.speedX/_delimiter;
  ballA.ty = ballA.ty - ballA.speedY/_delimiter;
  
    /**
  * Получаем скорости шаров
  **/
  var v1 = Math.sqrt(ballA.speedX * ballA.speedX + ballA.speedY * ballA.speedY);
  var v2 = Math.sqrt(ballB.speedX * ballB.speedX + ballB.speedY * ballB.speedY);
 
    /**
  * Получаем углы наклона скоростей к оси OX
  **/
  var fi1 = Math.atan2(ballA.speedY,ballA.speedX);
  var fi2 = Math.atan2(ballB.speedY,ballB.speedX);
 
    /**
  * Получаем углы наклона между линией соединяющей центры шаров и осью OX
  **/
  var lambda1 = Math.atan2(ballB.ty - ballA.ty, ballB.tx - ballA.tx);
  var lambda2 = Math.atan2(ballA.ty - ballB.ty, ballA.tx - ballB.tx);
  
    /**
  * Получаем проекции скоростей на соединяющую линию между шарами
  **/
  var pv1 = v1 * Math.cos(lambda1 - fi1)*plotnost;
  var pv2 = v2 * Math.cos(lambda2 - fi2)*plotnost;
  
    /**
  * Получаем новые скорости (векроты направления)
  **/
  ballA.speedX = ballA.speedX - pv1 * Math.cos(lambda1) + pv2 * Math.cos(lambda2);
  ballA.speedY = ballA.speedY - pv1 * Math.sin(lambda1) + pv2 * Math.sin(lambda2);
  
  ballB.speedX = ballB.speedX - pv2 * Math.cos(lambda2) + pv1 * Math.cos(lambda1);
  ballB.speedY = ballB.speedY - pv2 * Math.sin(lambda2) + pv1 * Math.sin(lambda1);
}
В принципе работает но...

Одно из главных отличий от билиарда в том чтто один из игровых снорядов(продолжим называть их шарами) значительно больше остальных! В реале у большенства диаметр 3,5 а у большого 5! А значит и тяжелее!(Матеиал одинаковый!)

какие поправки в алгоритм мне надо внести с учётом этого! поподробнее если можно! подобную прогу пишу в первый раз!!!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.01.2010, 08:26
Ответы с готовыми решениями:

Нужно дополнить алгоритм
Здравствуйте. Требуется составить алгоритм решения задачи на ассемблере. Текст задачи: В памяти записать два массива, например по пять...

Как реализовать алгоритм игры?
Добрый день! Возникла проблема с описанием алгоритма игры при помощи кода. Если в двух словах, игра такая. Есть поле nxn, где n...

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

10
 Аватар для Mr.Loner
42 / 42 / 10
Регистрация: 23.01.2010
Сообщений: 151
29.01.2010, 08:45
Насколько я знаю физику, нужно воспользоваться законом сохранения импульса. Больше не могу помочь.
0
62 / 61 / 6
Регистрация: 02.09.2008
Сообщений: 181
29.01.2010, 15:35
Вот маленькая статья, должна помочь.
http://www.neive.by.ru/bestsoft/1_21.htm
0
122 / 65 / 4
Регистрация: 12.04.2009
Сообщений: 1,047
02.02.2010, 13:24  [ТС]
Спасибо!!! но там не сказано как вычеслить новые вектора шаров если массы разные!!
0
62 / 61 / 6
Регистрация: 02.09.2008
Сообщений: 181
02.02.2010, 15:49
C++
1
2
3
4
//Получаем проекции скоростей на соединяющую линию между шарами
  
  var pv1 = v1 * Math.cos(lambda1 - fi1)*plotnost;
  var pv2 = v2 * Math.cos(lambda2 - fi2)*plotnost;
V1 = pv1; //Скорость первого шарика в момент удара по линии соединяющей центры шаров
V2 = pv2; //Скорость второго шарика в момент удара по линии соединяющей центры шаров

Нас интересуют только эти скорости. Скорость первого и второго шарика после удара будут равнятся:
w1*(m1+m2)=(m1-m2)*V1+2*m2*V2; //скорость первого шарика после удара
w2*(m1+m2)=2*m1*V1+(m2-m1)*V2; //скорость второго шарика после удара

Попробуем проверить: если m=m1=m2, V1=0, V2=10
То первый шар должен полететь после столкновения со скоростью второго шарика, а второй должен остановиться
w1*2*m=0*V1+2*m*V2 или w1=V2=10;
w2*2*m=2*m*0+0*V2 или w2=0;

Еще проверим с такими параметрами m1=10, m2=5, V1=0, V2=8
w1*(10+5)=(10-5)*0+2*5*8 или w1= 5.33333333 //первый шар с большим весом начал двигаться
w2*(10+5)=2*5*0+(5-10)*8 или w2=-2.66666666 //как мы видим второй шар изменил направление скорости
0
 Аватар для snake32
3504 / 1687 / 236
Регистрация: 26.02.2009
Сообщений: 8,414
Записей в блоге: 6
02.02.2010, 18:14
Мне кажется не так всё просто... Приведённый areostar'ом алгоритм колизий максимально упрощён из-за полной идентичности шаров. Он не учитывает ни радиус ни массу, а просто делит всё на 2. Буквально каждую строчку алгоритма надо переделывать и дописывать...
0
62 / 61 / 6
Регистрация: 02.09.2008
Сообщений: 181
02.02.2010, 19:25
Как раз здесь все просто. От радиусов шаров зависит только момент соударения (если шары больше то удар бы случился немного раньше). На обмен энергиями это не влияет. Если шарик с большим радиусом R1=100 мм и скоростью V1=20 мм/с центр которого находится на расстоянии от пола 120 мм момент удара произойдет через 1 секунду, делаем отскок V1=-20 (при абсолютно упругом соударении) . А шарик с R2=20 мм и скоростью V2=20 мм/с центр которого находится на расстоянии от пола 120 мм момент удара произойдет через 5 секунд и отскок V2=-20. Тоже будет если шарик падает под углом к плоскости просто эту скорость мы разбиваем на касательную и нормальную составляющие. Касательные не изменяются а нормальные поменяют направление. С ударами между шарами все тоже.
0
122 / 65 / 4
Регистрация: 12.04.2009
Сообщений: 1,047
02.02.2010, 20:39  [ТС]
Цитата Сообщение от snake32 Посмотреть сообщение
Мне кажется не так всё просто... Приведённый areostar'ом алгоритм колизий максимально упрощён из-за полной идентичности шаров. Он не учитывает ни радиус ни массу, а просто делит всё на 2. Буквально каждую строчку алгоритма надо переделывать и дописывать...
Радиус я уже учитываю! исправил!! а вот с изменением вектора направления я что то не догоняю!!
0
122 / 65 / 4
Регистрация: 12.04.2009
Сообщений: 1,047
06.02.2010, 21:24  [ТС]
Ну что то начало получаться!! ну во этот момент:

ballB.tx = ballB.tx - ballB.speedX/_delimiter;
ballB.ty = ballB.ty - ballB.speedY/_delimiter;

ballA.tx = ballA.tx - ballA.speedX/_delimiter;
ballA.ty = ballA.ty - ballA.speedY/_delimiter;

Было сказано что этот код предотвращает пролёт шарика сквозь шарик! вот тока как вычеслить значение для переменной _delimiter ???
0
122 / 65 / 4
Регистрация: 12.04.2009
Сообщений: 1,047
22.02.2010, 23:41  [ТС]
Цитата Сообщение от QWAN Посмотреть сообщение
C++
1
2
3
4
//Получаем проекции скоростей на соединяющую линию между шарами
  
  var pv1 = v1 * Math.cos(lambda1 - fi1)*plotnost;
  var pv2 = v2 * Math.cos(lambda2 - fi2)*plotnost;
V1 = pv1; //Скорость первого шарика в момент удара по линии соединяющей центры шаров
V2 = pv2; //Скорость второго шарика в момент удара по линии соединяющей центры шаров

Нас интересуют только эти скорости. Скорость первого и второго шарика после удара будут равнятся:
w1*(m1+m2)=(m1-m2)*V1+2*m2*V2; //скорость первого шарика после удара
w2*(m1+m2)=2*m1*V1+(m2-m1)*V2; //скорость второго шарика после удара

Попробуем проверить: если m=m1=m2, V1=0, V2=10
То первый шар должен полететь после столкновения со скоростью второго шарика, а второй должен остановиться
w1*2*m=0*V1+2*m*V2 или w1=V2=10;
w2*2*m=2*m*0+0*V2 или w2=0;

Еще проверим с такими параметрами m1=10, m2=5, V1=0, V2=8
w1*(10+5)=(10-5)*0+2*5*8 или w1= 5.33333333 //первый шар с большим весом начал двигаться
w2*(10+5)=2*5*0+(5-10)*8 или w2=-2.66666666 //как мы видим второй шар изменил направление скорости
А как выташить от суда скорости по обоим осям! и уклон!!???
0
62 / 61 / 6
Регистрация: 02.09.2008
Сообщений: 181
23.02.2010, 12:41
Это набросок, (примерно) как это сделать (кто будет делать уже посерьезней лучше сделать класс шарика). Я не проверял сильно ( могут быть и не стыковки в названиях), поэтому сильно не ругайте.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
//Координаты шарика
float ball_x[i];
float ball_y[i];
//Скорость шарика разложенная по осям ХУ
float xv[i];
float yv[i];
// Перемещение шариков
ball_x[i]+=xv[i];
ball_y[i]+=yv[i];
 
//Цикл по количеству шариков
//{
    // проверка столкновения шарика с бортами по оси Х
    if (ball_x[i] < left_wall + ball_radius[i] || ball_x[i] > width - ball_radius[i]) { 
        xv[i]=-xv[i];        // интвертируем скорость по Х
        ball_x[i]+=xv[i];    // толчек шарика обратно
    } 
    else
    // проверка столкновения первого шарика с бортами по оси У
    if (ball_y1 < top_wall + ball_radius[i] || ball_y1 > height - ball_radius[i]) { 
        yv1=-yv1;            // интвертируем скорость по У
        ball_y1+=yv1;        // толчек шарика обратно
    } 
//} END Цикл по количеству шариков
 
//циклы (проверяем столкновения) между шарами
    //Обработка столкновения шариков между собой
    float d_x = (ball_x[i] - ball_x[j]); // расстояние между шариками i и j по оси Х
    float d_y = (ball_y[i] - ball_y[j]); // расстояние между шариками i и j по оси Y
    float distance = sqrt(d_x*d_x+d_y*d_y);    
    //Проверка столкновения
    if(distance <= ball_radius[i] + ball_radius[j]) {
            //угол cos_a, cos_b
            float cos_a = (d_x)/c;     // угол между линией соединяющей центры шаров в момент столкновения и осью Х
            float cos_b = (d_y)/c;    // угол между линией соединяющей центры шаров в момент столкновения и осью Y
            // эти углы используем чтобы проецировать скорость шарика (xv[i], yv[i]) и (xv[j], yv[j]) по линии соединяющей центры шаров 
            // Разложить на осевую и тангенциальную
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.02.2010, 12:41
Помогаю со студенческими работами здесь

Нашел в схожей теме не могу понять в чем ошибка. Кроме того как конкретно сделать что были високосные года?
Пользователь вводит две даты (день, месяц, год в виде целых чисел). Необходимо определить и вывести количество дней между этими двумя...

Как написать игру, схожей с игрой "Компьютерщик"
Пытаюсь написать игра наподобие &quot;Компьютерщик&quot; написанную на делфи. Столкнулся с проблемой не передаются данные из одной форму в другую. ...

Написание функции в Excel, схожей с ВПР
Нужно написать функцию. Мне все время выдает ошибку ЗНАЧ. С чем это связано?Помогите, пожалуйста. Очень срочно)))

Демонстрация программы, схожей с Punto Switcher
накидал как я его вижу можно платно

Алгоритм игры "змейка". Как заставить двигаться хвост?
Подскажите плз, как заставить двигаться хвост змейки %) Голова бегает нормально, а вот хвост чтоит на месте. Покрайней мере заставил...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru