Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 1.0/2.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 11.06.2006, 02:24
ir73 вне форума Посмотреть профиль Отправить личное сообщение для ir73 Найти все сообщения от ir73
  № 1  
Ответить с цитированием
ir73
FD Team

блогер
Регистрация: Dec 2005
Сообщений: 365
Записей в блоге: 6
По умолчанию Перескакивание препятствия при эмуляции движения

Возникла у меня такая задача.
Есть некая игра, допустим бильярд, в котором есть биток и остальные шары. Мы бьем биток, он бьет остальные шары, они катаются по столу, отскакивают. Тут проблем нет. Все реализовано на векторах.

Проблема начинается при сильном удабе битка (вектор скорости > радиуса шарика в 2 и более раз). Получается как бы "перелетание" шара битком. Например бьем биток, сообщая ему скорость в 50 пикселей (что означает, что в следущем кадре биток переместится на 50 пикселей). Но если на пути находился какой либо шар (радиуом в 10 пикселей), то биток его просто напросто перескочит.

Решения, как я вижу, два: 1. ограничить скорость шаров до скорости радиуса (не вариант, слишком медленно), 2. в случае слишком длиного вектора, разбивать его на части (в нашем случае можно разбить вектор длиной 50 пикселей на 5 векторов) и проверять на наличие препятствия в каждом из них. -- тоже не вариант, так как очень брольшие тормоза.

Хотелось бы услышать, какие еще есть варианты? А они, по идее должны быть, так как я видел бильярды где скорость шров достаточно велика и нет перескакивания.

Спасибо

Старый 11.06.2006, 03:35
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 2  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
Почитай может поможет, не поможет все равно полезное найдешь.
http://noregret.org/tutor/n/collision/
http://noregret.org/tutor/n/grid/
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 11.06.2006, 15:51
ir73 вне форума Посмотреть профиль Отправить личное сообщение для ir73 Найти все сообщения от ir73
  № 3  
Ответить с цитированием
ir73
FD Team

блогер
Регистрация: Dec 2005
Сообщений: 365
Записей в блоге: 6
то есть получается всего два метода : 1. Проверки в протяженности и 2.Выборка положений ?

Старый 11.06.2006, 17:12
VIO вне форума Посмотреть профиль Отправить личное сообщение для VIO Найти все сообщения от VIO
  № 4  
Ответить с цитированием
VIO

Регистрация: May 2006
Сообщений: 47
на мой взгляд 1-й вариант и проще создать в коде и более приемлем... и еще... может и не совсем к месту(не знаю ведь по какому принципу ты там у себя делаешь), но все же...
почему бы не определять силу удара по дальности кия от шара, затем эту дальность, т.е. силу передавать уже самому шару?
а насчет перескока - ведь если удар сильный, то практически не обязателен быть заметным глазу, ведь так?
тогда просто пусти цикл
while(true){
сдвигай кий хоть на 1 пиксель;
проверь хиттестом на столкновениекия с шаром, и если оно имеет место., то меняей логическую величину на false
}
и делов то)

Старый 11.06.2006, 17:48
Fann вне форума Посмотреть профиль Отправить личное сообщение для Fann Найти все сообщения от Fann
  № 5  
Ответить с цитированием
Fann
 
Аватар для Fann

Регистрация: Jun 2006
Адрес: crimea
Сообщений: 69
Отправить сообщение для Fann с помощью ICQ
Проверяем столкновение 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;
}
}
Проверяй каждого движущегося шара с каждым(for в forе)


Последний раз редактировалось iNils; 11.06.2006 в 17:53.
Старый 11.06.2006, 17:53
Fann вне форума Посмотреть профиль Отправить личное сообщение для Fann Найти все сообщения от Fann
  № 6  
Ответить с цитированием
Fann
 
Аватар для Fann

Регистрация: Jun 2006
Адрес: crimea
Сообщений: 69
Отправить сообщение для Fann с помощью ICQ
очень классные ссылочки, сенкс

Старый 11.06.2006, 21:38
ir73 вне форума Посмотреть профиль Отправить личное сообщение для ir73 Найти все сообщения от ir73
  № 7  
Ответить с цитированием
ir73
FD Team

блогер
Регистрация: Dec 2005
Сообщений: 365
Записей в блоге: 6
Fann, спасибо за код. Не очень вдавался в него, но интересно, он может обойти проблему "перескакивания"?
В общем то проверять на коллизии я умею, и могу определять новые вектора направления шаров. Интересует только нюанс с "перескакиванием"

Старый 12.06.2006, 22:53
Fann вне форума Посмотреть профиль Отправить личное сообщение для Fann Найти все сообщения от Fann
  № 8  
Ответить с цитированием
Fann
 
Аватар для Fann

Регистрация: Jun 2006
Адрес: crimea
Сообщений: 69
Отправить сообщение для Fann с помощью ICQ
при обычном определении коллизии, при скорости большей диаметра шаров,
её(коллизию)ты пропустишь. Данная функция определяет перед каждым перемещением шара возмужную коллизию при данном векторе направления, и если она имеет место, то шар сдвигается не на реальную скорость, а на оставшееся расстояние до столкновения и дальше считаешь новые вектора и скорости.

Создать новую тему Ответ Часовой пояс GMT +4, время: 21:13.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 21:13.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.