![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#11 |
Старожил
Регистрация: 21.03.2009
Сообщений: 2,193
|
![]()
Моя версия:
Есть у нас координаты игрока, есть его скорость. Есть также функция, определяющая наличие столкновений (желательно - чтобы в ней проверялись коллизии со всеми возможными объектами, а не с одним). Сначала пробуем переместить игрока в координаты (X + Vx, Y + Vy) и проверяем, столкнется ли он с чем-нибудь в этом случае. Если нет - присваиваем ему новые координаты и радуемся. Если столкновение имело место - уменьшаем его скорости на квант перемещения (например, на 1 пиксель) Код:
Кстати, напомню на всякий случай, что для работы функции проверки столкновений нужно еще, конечно, знать размеры всех могущих сталкиваться прямоугольников. Опять же, можно пойти в обратную сторону - прибавлять к скоростям +1, 0, -1 (sign(Vx) и sign(Vy) соответственно) до тех пор, пока не будет столкновения, но по паре мелких деталей мне этот вариант кажется чуть менее изящным.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта Тема на форуме, посвященная ему же |
![]() |
![]() |
![]() |
#12 |
Дивиджей
Пользователь
Регистрация: 05.01.2009
Сообщений: 84
|
![]()
Гром спасибо Вам за помощь!
Впишите в google:
DVJ Serg-Grin И вы услышите мои песни ![]() |
![]() |
![]() |
![]() |
#13 |
not
Участник клуба
Регистрация: 27.06.2009
Сообщений: 1,399
|
![]()
Гром
А вот вопрос: Как мне сделать так, когда пуля у меня летит с маленькой скоростью то она сталкивается с объектом, а когда с очень большой то она не сталкивается, она просто тупа перелетает объект, как реализовать такое, чтобы пуля летела с очень большой скоростью, и сталкивалося с объектами? |
![]() |
![]() |
![]() |
#14 |
Старожил
Регистрация: 21.03.2009
Сообщений: 2,193
|
![]()
VintProg, в таком случае лучше использовать метод, обратный описанному мной, т.е. постепенно прибавлять кванты смещения. Благо в 2Д играх пули обычно летают не слишком быстро (по крайней мере, в большинстве своем). А в 3Д вообще физика гораздо сложнее.
Кстати, можно вообще пойти по другому пути и находить коллизии геометрически. В случае пули (если она действительно маленькая, а не как огненный шар размером с половину стреляющего, что тоже бывает) можно находить пересечение отрезка с прямоугольниками (в простейшем случае) или с битовыми масками объектов (в более сложном), при необходимости находить, кого из нескольких объектов она встретила первым. Если объект достаточно большой и при этом быстрый, можно поискать пересечения с премятствиями более сложных фигур, представляющих "большую пулю и весь пройденный ею за ход путь" - прямоугольников или такого вида: Код:
Ну а по точкам пересечения уже можно геометрически высчитать, куда поставить объект (в крайнем случае - потелепать его уже ближе к месту событий, пока, например, битовые образы не перестанут пересекаться). Для пули, конечно, все проще. Если уж она во что-то попала, то уничтожается и если нужно - наносит объекту урон. А вообще, по-моему, достаточно большие объекты редко в 2Д играх движутся очень быстро (т.е. смещение за ход у них редко больше их размеров), особенно при маленьких значениях игрового таймера. Разве что те же пули, но с ними можно поступать совсем просто: берем начальную точку, берем конечную точку, соединяем, находим пересечения с объектом, уничтожаем пуля, наносим объекту урон.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта Тема на форуме, посвященная ему же |
![]() |
![]() |
![]() |
#15 |
not
Участник клуба
Регистрация: 27.06.2009
Сообщений: 1,399
|
![]()
А вот такой вопрос, а если сделать так:
пуля у нас перемещается на 1 пикс, но цикл выполняет это допустим 100 раз, скорость пули у нас очень великая, и до точности проверяем столкновение, (такие способы могут использоваться? |
![]() |
![]() |
![]() |
#16 |
Старожил
Регистрация: 21.03.2009
Сообщений: 2,193
|
![]()
Чего? До какой точности? 100 раз в секунду или вообще? И какие - "такие" способы?
Не понял вопроса совсем.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта Тема на форуме, посвященная ему же |
![]() |
![]() |
![]() |
#17 | |
not
Участник клуба
Регистрация: 27.06.2009
Сообщений: 1,399
|
![]() Цитата:
bullet.x var speed : integer; Speed := 100; for i:=0 to Speed do begin bullet.x := bullet.x + 1; // Далеше проверка столкновения ... end; Теперь понял? |
|
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Скриншот в игре | 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 |