![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
FD Team
|
Возникла у меня такая задача.
Есть некая игра, допустим бильярд, в котором есть биток и остальные шары. Мы бьем биток, он бьет остальные шары, они катаются по столу, отскакивают. Тут проблем нет. Все реализовано на векторах. Проблема начинается при сильном удабе битка (вектор скорости > радиуса шарика в 2 и более раз). Получается как бы "перелетание" шара битком. Например бьем биток, сообщая ему скорость в 50 пикселей (что означает, что в следущем кадре биток переместится на 50 пикселей). Но если на пути находился какой либо шар (радиуом в 10 пикселей), то биток его просто напросто перескочит. Решения, как я вижу, два: 1. ограничить скорость шаров до скорости радиуса (не вариант, слишком медленно), 2. в случае слишком длиного вектора, разбивать его на части (в нашем случае можно разбить вектор длиной 50 пикселей на 5 векторов) и проверять на наличие препятствия в каждом из них. -- тоже не вариант, так как очень брольшие тормоза. Хотелось бы услышать, какие еще есть варианты? А они, по идее должны быть, так как я видел бильярды где скорость шров достаточно велика и нет перескакивания. Спасибо |
|
|||||
|
Негуру
администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
|
Почитай может поможет, не поможет все равно полезное найдешь.
http://noregret.org/tutor/n/collision/ http://noregret.org/tutor/n/grid/ |
|
|||||
|
Регистрация: May 2006
Сообщений: 47
|
на мой взгляд 1-й вариант и проще создать в коде и более приемлем... и еще... может и не совсем к месту(не знаю ведь по какому принципу ты там у себя делаешь), но все же...
почему бы не определять силу удара по дальности кия от шара, затем эту дальность, т.е. силу передавать уже самому шару? а насчет перескока - ведь если удар сильный, то практически не обязателен быть заметным глазу, ведь так? тогда просто пусти цикл while(true){ сдвигай кий хоть на 1 пиксель; проверь хиттестом на столкновениекия с шаром, и если оно имеет место., то меняей логическую величину на false } и делов то) |
|
|||||
|
Проверяем столкновение mc с mc_check. (edX;edY)-координаты единичного вектора направления mc,
Vel-скорость mc, radius-радиус шаров. proect-проекция линии действия(соединяет центры шаров) на вектор направления(если отрицательная, то и проверять на данном шаге не нада). function Collision(){
var collis=false;
var lineAcX=mc_check._x-mc._x; var lineAcY=mc_check._y-mc._y;
var lineAc=lineAcX*lineAcX+lineAcY*lineAcY;
proect=edX*lineAcX+edY*lineAcY;
normal=lineAc-proect*proect;
if(normal<=4*radius*radius){
VelEps=proect-Math.sqrt(4*radius*radius-normal);
if(Vel>=VelEps){
collis=true;
mc._x+=VelEps*edX;
mc._y+=VelEps*edY;
Refraction(mc,mc_check)-функция, которая у тя считает новые вектора и скорости после коллизии
}
}
if(!collis){
mc._x+=Vel*edX;
mc._y+=Vel*edY;
}
}
Последний раз редактировалось iNils; 11.06.2006 в 17:53. |
|
|||||
|
очень классные ссылочки, сенкс
|
|
|||||
|
FD Team
|
Fann, спасибо за код. Не очень вдавался в него, но интересно, он может обойти проблему "перескакивания"?
В общем то проверять на коллизии я умею, и могу определять новые вектора направления шаров. Интересует только нюанс с "перескакиванием" |
|
|||||
|
при обычном определении коллизии, при скорости большей диаметра шаров,
её(коллизию)ты пропустишь. Данная функция определяет перед каждым перемещением шара возмужную коллизию при данном векторе направления, и если она имеет место, то шар сдвигается не на реальную скорость, а на оставшееся расстояние до столкновения и дальше считаешь новые вектора и скорости. |
![]() |
![]() |
Часовой пояс GMT +4, время: 21:13. |
|
|
« Предыдущая тема | Следующая тема » |
|
|