Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.02.2010, 16:23   #1
Манжосов Денис :)
Участник клуба
 
Регистрация: 29.01.2008
Сообщений: 1,039
По умолчанию Пересечение объектов. Проблема со скоростью движения

Здравствуйте. Про столкновения объектов было задано много вопросов, получено достаточное количество ответов. Я знаю, как сделать проверку пересечения одного объекта другим. В общем, я хотел бы спросить о следующем. Допустим, что на форме имеются два объекта - квадрата. Размер 25 на 25. Допустим, что один объект двигается со скоростью 30 пикселей каждые 10 мс. Вот здесь и возникает проблема. Если у первого объекта размер равен 25 на 25, то второй, с его перемещением в 30 px, просто "перелетит" первый объект. Получится, что с такой скоростью столкновения просто не будет и как определить, что оно было, я не знаю. Подскажите, как поступить, если скорость одного объекта больше чем размер другого? Спасибо за понимание.
Манжосов Денис :) вне форума Ответить с цитированием
Старый 27.02.2010, 16:49   #2
Levsha100
Заблокирован
Старожил
 
Регистрация: 20.07.2008
Сообщений: 4,033
По умолчанию

Все просто!
Ты не прибавляй сразу всю скорость, а прибавляй по частям, каждый раз делая проверку столкновения.
Код:
for(int i=0;i<Speed;i+=QuantSpeed)
{
    X+=QuantSpeed;
   processed();
}
Только это- не математический метод =) Если делать хорошую физику, то надо морочится с векторами и уравнениями прямых.

Последний раз редактировалось Levsha100; 27.02.2010 в 16:53.
Levsha100 вне форума Ответить с цитированием
Старый 27.02.2010, 16:51   #3
Манжосов Денис :)
Участник клуба
 
Регистрация: 29.01.2008
Сообщений: 1,039
По умолчанию

Ёлки. Голову мне отрубить. Точно ! =) Спасибо
Манжосов Денис :) вне форума Ответить с цитированием
Старый 27.02.2010, 16:56   #4
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Только скорость должна быть для такого больше не размера квадрата, а суммы их размеров!
Я делал в случае столкновения откат на одну единичку назад до тех пор, пока столкновение не исчезало. Можно (и, пожалуй, даже нужно...) и впрямь делать и наоборот.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 02.03.2010, 20:06   #5
Манжосов Денис :)
Участник клуба
 
Регистрация: 29.01.2008
Сообщений: 1,039
По умолчанию

Но всё равно здесь не всё так гладко... В программе на форме есть компонент Timer с интервалом в 33 мс. Каждые 33 мс рисуется картинка, проверяется нажатие клавиш. Допустим пользователь нажимает клавишу со стрелкой влево. Двигаем объект на 1 px влево, и увеличиваем количество пикселей для движения. То есть, в следующий раз к скорости объекта прибавится уже 2, потом 3 и т.д. Применим твою проверку, Levsha100.
Код:
for i := 1 to SpeedPX do // SpeedPX - скорость перемещения в px
  if DoCollistion then SpeedPX := 0; // DoCollision, функция, 
//возвращающая знчение true или false, в зависимости от того, столкнулся ли объект с другим объектом или нет
Поднимается другой вопрос. А как рисовать объект в цикле, если столкновение не произошло? Такое промежуточное рисование. А то так получается, что двигаться не будет объект, проверка будет выполняться, и на расстояние SpeedPX от сталкивающегося объекта наш объект остановится... Может нужно использовать не таймер!? =)
Спасибо за внимание.
Манжосов Денис :) вне форума Ответить с цитированием
Старый 02.03.2010, 20:17   #6
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

А зачем промежуточно рисовать? Обрабатывайте "промежутки" в памяти, а на экран выводите именно такую "частоту", которая требуется.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 02.03.2010, 20:28   #7
Манжосов Денис :)
Участник клуба
 
Регистрация: 29.01.2008
Сообщений: 1,039
По умолчанию

Я тебя не понимаю. Опять же вернёмся к объектам. Объект a движется со скоростью -50 px в 33 мс! В таймере мы должны подвинуть объект со скоростью 50 px... Я кажется нашёл решение, а что если скорость объекта 50 px, и через 45 он сталкивается с другим объектом. То мы прибавляем к позиции объекта 45 и останавливаем объект! Уря! =). Спасибо, Alex Cones, что натолкнул меня на эту мысль! Очень благодарен! =)
Манжосов Денис :) вне форума Ответить с цитированием
Старый 06.03.2010, 18:36   #8
Манжосов Денис :)
Участник клуба
 
Регистрация: 29.01.2008
Сообщений: 1,039
По умолчанию

Проблемы есть с проверкой столкновения. Объект сталкивается нормально, только если его позиция X или Y меньше чем позиция объекта X или Y. В остальных случаях объект наполовину "проваливается" в объект. Помогите пожалуйста, подскажите, что нужно делать. Спасибо
Вложения
Тип файла: rar TestCar.rar (1.6 Кб, 10 просмотров)

Последний раз редактировалось Манжосов Денис :); 06.03.2010 в 19:09.
Манжосов Денис :) вне форума Ответить с цитированием
Старый 06.03.2010, 18:51   #9
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Как вариант - сначала проверять, чей левый верхний угол выше, а чей - левее и исходя из этих четырех вариантов делать свою проверку. Я, когда столкнулся с такой же проблемой, решил, что этот первый вариант идет лесом, поэтому координатами объекта у меня были координаты его центра - тогда достаточно проверять, что (фрагмент моего кода - когда будет столкновение)
Код:
      if ( (abs(LandPos.X - NewPos.X) < ((LandSize.X + Size.X) / 2))
         && (abs(LandPos.Y - NewPos.Y) < ((LandSize.Y + Size.Y) / 2)) )
Единственный недостаток - могут быть небольшие неточности в плюс/минус полпикселя-пиксель из-за деления целого пополам.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 06.03.2010, 19:07   #10
Манжосов Денис :)
Участник клуба
 
Регистрация: 29.01.2008
Сообщений: 1,039
По умолчанию

Хм. Сейчас попробую подправить проект. Об изменениях напишу. Спасибо, Гром, за совет.
Да, не мог бы пояснить пожалуйста, что означают переменные LandPos, NewPos, LandSize, Size? Хотя, кажется понял уже.
P.S. Не тот проект скинул...

Последний раз редактировалось Манжосов Денис :); 06.03.2010 в 19:20.
Манжосов Денис :) вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
OpenGL. Проблема со скоростью передвижения объектов Blade Gamedev - cоздание игр: Unity, OpenGL, DirectX 5 26.10.2009 13:40
проблема создания массива объектов Meduzza Общие вопросы C/C++ 3 28.05.2009 05:07
Проблема с автоматическим подключением библиотек объектов iliy Общие вопросы Delphi 6 31.01.2009 06:39
Delphi: Проблема с созданием объектов Omedus Помощь студентам 4 08.08.2008 18:42