Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 15 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

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

icq: 482-373-277
По умолчанию

Моя версия:
Есть у нас координаты игрока, есть его скорость. Есть также функция, определяющая наличие столкновений (желательно - чтобы в ней проверялись коллизии со всеми возможными объектами, а не с одним). Сначала пробуем переместить игрока в координаты (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
Репутация: 10
По умолчанию

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

icq: 646-858-802
По умолчанию

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

icq: 482-373-277
По умолчанию

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

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

icq: 646-858-802
По умолчанию

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

icq: 482-373-277
По умолчанию

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

icq: 646-858-802
По умолчанию

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

var
speed : integer;


Speed := 100;

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

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

Опции темы

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

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

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Скриншот в игре 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
Вопрос по игре!!! Ыть Паскаль 2 28.03.2008 10:02


17:52.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.

Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru