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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.07.2010, 10:26   #11
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Моя версия:
Есть у нас координаты игрока, есть его скорость. Есть также функция, определяющая наличие столкновений (желательно - чтобы в ней проверялись коллизии со всеми возможными объектами, а не с одним). Сначала пробуем переместить игрока в координаты (X + Vx, Y + Vy) и проверяем, столкнется ли он с чем-нибудь в этом случае. Если нет - присваиваем ему новые координаты и радуемся.
Если столкновение имело место - уменьшаем его скорости на квант перемещения (например, на 1 пиксель)
Код:
if (Vx)   //Паскаль: Vx <> 0
   Vx -= Vx / abs(Vx);   //Vx = Vx - Vx/abs(Vx)
if (Vy)
   Vy -= Vy / abs(Vy);
Снова проверяем с помощью функции, будет ли столкновение, если игрок будет в координатах (X + Vx, Y + Vy). И так повторяем до тех пор, пока либо нам не удастся переместить игрока, либо пока обе проекции скорости не станут равны нулю.

Кстати, напомню на всякий случай, что для работы функции проверки столкновений нужно еще, конечно, знать размеры всех могущих сталкиваться прямоугольников.

Опять же, можно пойти в обратную сторону - прибавлять к скоростям +1, 0, -1 (sign(Vx) и sign(Vy) соответственно) до тех пор, пока не будет столкновения, но по паре мелких деталей мне этот вариант кажется чуть менее изящным.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 17.07.2010, 11:22   #12
Serg-Grin
Дивиджей
Пользователь
 
Аватар для Serg-Grin
 
Регистрация: 05.01.2009
Сообщений: 84
По умолчанию

Гром спасибо Вам за помощь!
Впишите в google:
DVJ Serg-Grin
И вы услышите мои песни
Serg-Grin вне форума Ответить с цитированием
Старый 17.07.2010, 12:17   #13
VintProg
not
Участник клуба
 
Аватар для VintProg
 
Регистрация: 27.06.2009
Сообщений: 1,399
По умолчанию

Гром
А вот вопрос:
Как мне сделать так, когда пуля у меня летит с маленькой скоростью то она сталкивается с объектом, а когда с очень большой то она не сталкивается, она просто тупа перелетает объект, как реализовать такое, чтобы пуля летела с очень большой скоростью, и сталкивалося с объектами?
VintProg вне форума Ответить с цитированием
Старый 17.07.2010, 13:23   #14
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

VintProg, в таком случае лучше использовать метод, обратный описанному мной, т.е. постепенно прибавлять кванты смещения. Благо в 2Д играх пули обычно летают не слишком быстро (по крайней мере, в большинстве своем). А в 3Д вообще физика гораздо сложнее.
Кстати, можно вообще пойти по другому пути и находить коллизии геометрически. В случае пули (если она действительно маленькая, а не как огненный шар размером с половину стреляющего, что тоже бывает) можно находить пересечение отрезка с прямоугольниками (в простейшем случае) или с битовыми масками объектов (в более сложном), при необходимости находить, кого из нескольких объектов она встретила первым. Если объект достаточно большой и при этом быстрый, можно поискать пересечения с премятствиями более сложных фигур, представляющих "большую пулю и весь пройденный ею за ход путь" - прямоугольников или такого вида:
Код:
    _
   / |
  /  /
 /  /
/  /
|_/
в зависимости от того, могут поворачиваться объекты и их изображения кроме как на pi/2 или нет.
Ну а по точкам пересечения уже можно геометрически высчитать, куда поставить объект (в крайнем случае - потелепать его уже ближе к месту событий, пока, например, битовые образы не перестанут пересекаться). Для пули, конечно, все проще. Если уж она во что-то попала, то уничтожается и если нужно - наносит объекту урон.

А вообще, по-моему, достаточно большие объекты редко в 2Д играх движутся очень быстро (т.е. смещение за ход у них редко больше их размеров), особенно при маленьких значениях игрового таймера. Разве что те же пули, но с ними можно поступать совсем просто: берем начальную точку, берем конечную точку, соединяем, находим пересечения с объектом, уничтожаем пуля, наносим объекту урон.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 17.07.2010, 13:38   #15
VintProg
not
Участник клуба
 
Аватар для VintProg
 
Регистрация: 27.06.2009
Сообщений: 1,399
По умолчанию

А вот такой вопрос, а если сделать так:
пуля у нас перемещается на 1 пикс, но цикл выполняет это допустим 100 раз, скорость пули у нас очень великая, и до точности проверяем столкновение, (такие способы могут использоваться?
VintProg вне форума Ответить с цитированием
Старый 17.07.2010, 14:01   #16
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Чего? До какой точности? 100 раз в секунду или вообще? И какие - "такие" способы?
Не понял вопроса совсем.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 17.07.2010, 14:10   #17
VintProg
not
Участник клуба
 
Аватар для VintProg
 
Регистрация: 27.06.2009
Сообщений: 1,399
По умолчанию

Цитата:
Чего? До какой точности? 100 раз в секунду или вообще? И какие - "такие" способы?
Не понял вопроса совсем.
Допустим у нас пуля и ее координаты
bullet.x

var
speed : integer;


Speed := 100;

for i:=0 to Speed do
begin
bullet.x := bullet.x + 1;
// Далеше проверка столкновения
...
end;

Теперь понял?
VintProg вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Скриншот в игре Marsik Общие вопросы Delphi 17 14.01.2014 03:03
Движение со скоростью света и быстрее скорости света - Сверхсветовое движение Alar Свободное общение 354 13.11.2011 21:32
Ресурсы в игре ZotaC Gamedev - cоздание игр: Unity, OpenGL, DirectX 5 04.05.2010 17:39
Звуки к игре Crivel Gamedev - cоздание игр: Unity, OpenGL, DirectX 8 07.09.2008 23:40
Вопрос по игре!!! Ыть Паскаль, Turbo Pascal, PascalABC.NET 2 28.03.2008 09:02