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

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

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


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

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

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

icq: 624983587
skype: viktorrulev
По умолчанию

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

icq: 380871124
skype: russian_pinky
По умолчанию

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

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

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

icq: 624983587
skype: viktorrulev
По умолчанию

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

icq: 380871124
skype: russian_pinky
По умолчанию

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

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

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

Цитата:
ты просто узнаешь расстояние от центра одной окружности до центра другой (по теореме пифагора) и сравниваешь с суммой их радиусов?
Нет, моя система построена по другому.Она сложнее, но дает больше возможностей, таких как
Цитата:
столкновение окружностей с чем угодно.
,возможность помещения одной геом. фигуры в другую(пример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 Кб, 33 просмотров)
Тип файла: rar Primer1.rar (155.8 Кб, 33 просмотров)
Тип файла: rar Primer2.rar (155.8 Кб, 29 просмотров)
Тип файла: rar Primer3.rar (154.3 Кб, 33 просмотров)
Вадим Буренков вне форума   Ответить с цитированием
Старый 15.05.2009, 19:10   #9
Ulex
Непрофессионал
Профессионал
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Адрес: город Н-ск.
Сообщений: 1,413
Репутация: 1100
По умолчанию

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

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

Опции темы

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

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

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

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


23:32.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru