A
areostar
Здраствуйте! Вообще-то моя прога на Action Script 3.0 (Flash). Но вопрос по сути алгоритме!!
игра которую я разрабатываю чем-то схожа с билиардом! нашёл в сети функцию обработки сталкновения:
В принципе работает но...
Одно из главных отличий от билиарда в том чтто один из игровых снорядов(продолжим называть их шарами) значительно больше остальных! В реале у большенства диаметр 3,5 а у большого 5!
какие поправки в алгоритм мне надо внести с учётом этого! поподробнее если можно! подобную прогу пишу в первый раз!!!
игра которую я разрабатываю чем-то схожа с билиардом! нашёл в сети функцию обработки сталкновения:
Код:
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!
какие поправки в алгоритм мне надо внести с учётом этого! поподробнее если можно! подобную прогу пишу в первый раз!!!