Форум программистов, компьютерный форум, киберфорум
Наши страницы
OpenGL
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
FOX3490
0 / 0 / 1
Регистрация: 01.03.2017
Сообщений: 14
#1

Криво работает алгоритм столкновений | Delphi 7 + dglOpenGL

14.08.2017, 20:35. Просмотров 881. Ответов 2

Вообщем, я пишу игру бродилку типа Wolf3d/Doom. Юзаю Opengl 4.3(dglOpengl) и Delphi 7, так сказать, делаю самопальный движок(прям конкурент UE4) Естественно, не о какой встроенной физики и речи быть не может
Поэтому решил написать алгоритм столкновений сам(Опять же идентичный старому доброму Wolf3D), к сожалению это у меня получилось лишь на половину

Карту делал по технологии тайлмап, то есть вся карта - это двухмерный массив.

Карта есть - 3 двумерных массива:
Я знаю, что можно было сделать 3х мерный массив, но я сделал так, что бы не запутаться.

1 - массив потолков, в нем я указываю, где какой потолок будет.

Выглядит так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
var
  CEILING : array [1..MAPSIZE, 1..MAPSIZE] of Integer = ( 
  (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1),
  (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1),
  (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1),
  (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1),
  (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1),
  (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1),
  (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1),
  (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1),
  (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1),
  (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1),
  (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1),
  (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1),
  (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1),
  (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1),
  (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1),
  (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1),
  (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1),
  (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1),
  (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1),
  (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1));
2 - массив стенок, в нем я указываю, где какие стенки стоят

Выглядит так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
var
  WALLS : array [1..MAPSIZE, 1..MAPSIZE] of Integer = ( // Пол
  (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1),
  (1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1),
  (1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1),
  (1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1),
  (1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1),
  (1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1),
  (1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1),
  (1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1),
  (1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1),
  (1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1),
  (1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1),
  (1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1),
  (1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1),
  (1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1),
  (1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1),
  (1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1),
  (1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1),
  (1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1),
  (1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1),
  (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1));
Ну и третий - массив пола, там я указываю, где какой пол
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
  FLOUR : array [1..MAPSIZE, 1..MAPSIZE] of Integer = ( //Стены
  (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1),
  (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1),
  (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1),
  (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1),
  (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1),
  (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1),
  (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1),
  (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1),
  (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1),
  (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1),
  (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1),
  (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1),
  (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1),
  (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1),
  (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1),
  (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1),
  (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1),
  (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1),
  (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1),
  (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1));
1 - стена/пол/потолок есть, 0 - нету.


Реализован класс камеры - координаты X, Y, Z - я естественно, пользуюсь только X и Z.

Сам алгоритм столкновений выглядит так:

BLOCKSIZE - размер ребра одной стенки

if (WALLS [Round(newX) div BLOCKSIZE, Round(newZ) div BLOCKSIZE] = 0) then
begin
Camera.Pos.X := newX;
Camera.Pos.Z := newZ;
end;

Самое интересное - код работает, но очень криво В некоторых местах стенки твердые, в некоторых нет, а чаще всего, в стенку можно войти наполовину.
Складывается ощущение, что алгоритм неправильно определяет, где находится игрок, но почему - не могу понять
Уже часов 30 убил, пытаясь понять, где собака зарыта.

Для большего понимания ошибки прикладываю код: yadi.sk/d/x5Dvb4Cr3Lz3K3

Понимаю, что вопрос не из легких, но это ведь форум, тут нужно задавать вопросы, разве нет?
Знающие люди, пожалуйста, помогите...
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.08.2017, 20:35
Ответы с готовыми решениями:

FPS в Delphi с использованием OpenGL (dglOpenGL)
Читал в гайде по OpenGL, что есть возможность регулировки FPS, но как, не...

Алгоритм множественных столкновений
Есть игра на js и сервер на nodejs, на карте более 1000 обьектов и все нужно...

Не работает проверка столкновений и вхождения в триггер
Такая проблема: я создаю игру для Android. Смысл игры: нужно тыкать пальцем и...

Криво работает do while
Есть рабочий код на паскале, var a, k, s, b, x1, x2, y1, y2, h: real; ...

Криво работает
У меня задание "Создать триггер. Нужно, чтобы при изменении столбца ПРЕМИЯ, у...

2
Excalibur921
750 / 425 / 68
Регистрация: 12.10.2013
Сообщений: 2,837
15.08.2017, 12:14 #2
Лучший ответ Сообщение было отмечено FOX3490 как решение

Решение

Камера не должна подходить к стенам ближе чем Порог. Габариты игрока.

1) Самый простой велик:
если расстояние от камеры до стены в следующем кадре при таком направлении движения будет меньше Порог то не двигать камеру.
Если упрется в стену то не сможет скользить вдоль нее пока не будет взгляд камеры от стены.

2)Велик сложней:
Если расстояние от камеры до стены меньше Порог то координаты игрока это проекция его вектора движения на стену умноженная на его скорость.
Стены будут как бы скользкие…как обычно в 3д шутерах.

Зеленый направление движения.
Красный проекция на стену.
Чем больше вскользь стены будет смотреть игрок и нажимать “Идти” тем сильней он будет скользить вдоль стены(величина красного вектора).
Название: x1.gif
Просмотров: 30

Размер: 131.4 Кб
1
FOX3490
0 / 0 / 1
Регистрация: 01.03.2017
Сообщений: 14
21.08.2017, 21:49  [ТС] #3
Спасибо тебе, я как то даже не подумал... вот я ламер)))
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.08.2017, 21:49

float работает криво
Здравствуйте, форумчане. То ли float работает криво, то ли я его криво...

Appendrtitem криво работает
Есть doc as NotesDocument и есть код. Dim rtitem As NotesRichTextItem...

Функиця криво работает
не могу понять в чем дело она не выводит весь текст.Нужно чтоб фунцкия два раза...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru