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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.05.2009, 20:33   #1
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию Обработка столкновений окружностей.

Я написал модуль для своего движка, который позволяет обрабатывать столкновения с окружностями.Выкладываю demo(движение окружности клавишами wasd).Если кого заинтересует как сделать такое могу обьяснить.
Вложения
Тип файла: rar Engine2D.rar (155.0 Кб, 112 просмотров)
Вадим Буренков вне форума Ответить с цитированием
Старый 14.05.2009, 21:34   #2
Тёма(C@$pEr)
Пользователь
 
Регистрация: 24.01.2009
Сообщений: 36
По умолчанию

Да хотел бы услышать объяснения)
Тёма(C@$pEr) вне форума Ответить с цитированием
Старый 15.05.2009, 10:03   #3
Juffin
Форумчянин
Форумчанин
 
Аватар для Juffin
 
Регистрация: 05.04.2009
Сообщений: 446
По умолчанию

ты просто узнаешь расстояние от центра одной окружности до центра другой (по теореме пифагора) и сравниваешь с суммой их радиусов?
Nobody expects Spanish Inquisition!
Juffin вне форума Ответить с цитированием
Старый 15.05.2009, 14:57   #4
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

формулировка подразумеват столкновение окружностей с чем угодно
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс

Последний раз редактировалось ROD; 15.05.2009 в 17:27.
ROD вне форума Ответить с цитированием
Старый 15.05.2009, 17:14   #5
Juffin
Форумчянин
Форумчанин
 
Аватар для Juffin
 
Регистрация: 05.04.2009
Сообщений: 446
По умолчанию

да? а почему в ЕХЕшнике этого нету?
Nobody expects Spanish Inquisition!
Juffin вне форума Ответить с цитированием
Старый 15.05.2009, 17:26   #6
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Значит автор немного не правильно сформулировал предложение.
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс
ROD вне форума Ответить с цитированием
Старый 15.05.2009, 17:28   #7
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию

Цитата:
да? а почему в ЕХЕшнике этого нету?
Я сейчас пишу сюда объяснение и принципы работы системы.Опубликую идею и исходники так что можете не гадать.
Вадим Буренков вне форума Ответить с цитированием
Старый 15.05.2009, 19:02   #8
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
Лампочка Работа с коллизией окружностей.

Цитата:
ты просто узнаешь расстояние от центра одной окружности до центра другой (по теореме пифагора) и сравниваешь с суммой их радиусов?
Нет, моя система построена по другому.Она сложнее, но дает больше возможностей, таких как
Цитата:
столкновение окружностей с чем угодно.
,возможность помещения одной геом. фигуры в другую(пример3),
возможность определить точку, в которой произошло столкновение и др.

Начну с того, что я за время программирования придумал две системы проверки столкновений: по сторонам прямоугольника(только квадраты и прямоугольники) и по точкам(любая геом. фигура(пока только для окружностей)).


Система заточена под мой движок, поэтому примеры будут на нем(если нужно можно перенести систему в любую программу или игру без проблем, ведь главное идея а не исполнение).

Движок состоит из модулей
Engine.pas --- основной модуль

MainClass.pas - тут находится класс TGraphicObject для обьектов на экране
Effects2D.pas - класс для работы с анимациями
Characters.pas - класс для работы с игроком и AI
Sound2D.pas - класс для работы со звуком
и нужные для работы со столкновениями модули
Geometry2D.pas - геометрия
CollisionSys.pas - модуль обработки столкновений


Идея этой системы в том, что каждый объект на экране имеет переменную, которая включает в себя точки, необходимые к проверке на столкновение.(В TGraphicObject есть переменная
PhysPoint типа TPhysPoints)


PhysPoint , изначально пуста т.е в нее не занесены точки для проверки.Теперь нам нужно их занести.Вручную это делать невозможно, позтому пользуемся функцией(эта для занесения точек окружности(подобную функцию можно написать для чего угодно, например многоугольников, квадратов, треугольников и.т.д ))
Код:
function SaveCirclePoints(R:real):TPhysPoints;
Данная функция заносит точки в PhysPoint для окружности с радиусом в R.
Мы занесли точки и можно проверять столкновение:
(функция PointsCollision в модуле CollisionSys.pas)
Код:
Function PointsCollision(X,Y,X2,Y2:real;P,P2:TPhysPoints):integer;
Данная функция проверяет столкновение обьектов с координатами
X,Y и X2,Y2 и точками P,P2 и возвращает значение 1
Она основана на том, что если одна из точек одного объекта по координатам равна любой из точек второго объекта, то произошло столкновение.

Также мы можем вывести рисунок по точкам из PhysPoint процедурой
Код:
procedure DrawPoints(X,Y:real;P:TPhysPoints);
Рисование в точках X,Y Из PhysPoint
Я понимаю, что прочитав этот текст вы ничено не поняли , поэтому перейдем к практике.
Скачайте движок, откройте в Delphi проект и перейдите к файлу Engine.pas к процедуре LoadEngine(тут происходит загрузка наших окружностей).
Сделаю пример простого создания окружности с помощью PhysPoint (пример1)
Код:

var
  Circles: array [0..1] of TGraphicObject;
..........
procedure TMainForm.LoadEngine(Sender: TObject);
begin
................

//создание обьектов
Circles[0]:=TGraphicObject.Create; //создание первой окружности в памяти

//устанавливаем значения

//координаты обьекта
Circles[0].Xpos:=430;
Circles[0].Ypos:=420;
//Радиус окружности
Circles[0].R:=50;
//Заносим в PhysPoint точки окружности !!!!!!!!!!!!!!!!!!!!!!
Circles[0].PhysPoint:=SaveCirclePoints(Circles[0].R);
И в таймере пишем для рисования
Код:
//Сделаем чтобы окружность рисовалась по точкам
DrawPoints(Circles[0].Xpos,Circles[0].Ypos,Circles[0].PhysPoint);
А теперь усложним пример: сделаем еще одну окружность и проверим столкновение.
Тут я не буду писать код создания второй окружности, а напишу код для движения окружности клавишами WASD и проверку столкновения
В процедуре KeysDown пишем
Код:
//Этот код заставит двигаться окружность
//движение вверх
if Keypressed(87) then Circles[0].Ypos:=Circles[0].Ypos-Circles[0].Yspeed;
//движение вниз
if Keypressed(83) then Circles[0].Ypos:=Circles[0].Ypos+Circles[0].Yspeed;
//движение влево
if Keypressed(68) then Circles[0].Xpos:=Circles[0].Xpos+Circles[0].Xspeed;
//движение вправо
if Keypressed(65) then Circles[0].Xpos:=Circles[0].Xpos-Circles[0].Xspeed;
А в таймер пишем
Код:
//Сделаем чтобы окружность рисовалась по точкам
DrawPoints(Circles[0].Xpos,Circles[0].Ypos,Circles[0].PhysPoint);
//Сделаем чтобы окружность 2 рисовалась по точкам
DrawPoints(Circles[1].Xpos,Circles[1].Ypos,Circles[1].PhysPoint);

//Если столкновение произошло
if PointsCollision(Circles[0].Xpos,Circles[0].Ypos,Circles[1].Xpos,Circles[1].Ypos,Circles[0].PhysPoint,Circles[1].PhysPoint)=1
then buffer.Canvas.Pen.Color:=ClYellow //то рисуем желтую рамку
else buffer.Canvas.Pen.Color:=ClWhite; //а если нет то белую
Выкладываю движок и примеры.Если есть вопросы задавайте.
Также я собираюсь делать редактор коллизий.

P.S Во всех примерах выход клавишей EcsAP2
Вложения
Тип файла: rar Engine2D.rar (161.8 Кб, 40 просмотров)
Тип файла: rar Primer1.rar (155.8 Кб, 39 просмотров)
Тип файла: rar Primer2.rar (155.8 Кб, 36 просмотров)
Тип файла: rar Primer3.rar (154.3 Кб, 40 просмотров)
Вадим Буренков вне форума Ответить с цитированием
Старый 15.05.2009, 19:10   #9
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,432
По умолчанию

В этом случае двигаться налево немогу, хотя препятствий вроде нет.
Изображения
Тип файла: bmp 1111.bmp (2.5 Кб, 191 просмотров)
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 15.05.2009, 19:23   #10
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
Счастье

Цитата:
В этом случае двигаться налево немогу, хотя препятствий вроде нет.
Настолько незначительно, что можно закрыть на это глаза.
Но я знаю в чем дело: просто в данном примере коллизия работает с опережением, и дальность опережения зависит от скорости движения объекта.Т.е чем больше скорость тем больше погрешность(тут 1 пиксель)
Я знаю как это убрать и могу объяснить что значит "коллизия работает с опережением",если конечно надо.
Вадим Буренков вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сопряжение окружностей GibiW Мультимедиа в Delphi 5 06.04.2009 23:18
Код проверки столкновений не работает. Манжосов Денис :) Общие вопросы Delphi 8 02.02.2009 10:31
Даны координаты центров n окружностей.... ZhooZhik Помощь студентам 3 09.01.2008 19:11
Добавление окружностей ivp88 Помощь студентам 3 14.02.2007 16:31