Вот мы плавно подошли к главной составной части физики Блитц3Д (не надо только пугаться – никаких формул типа mc^2 вспоминать не нужно – здесь вы их сами будете придумывать!), и одного из его самых главных компонентов – проверки на соприкосновение! Я думаю, после того, как мы его разберём, вы будете готовы к тому, что бы приступить к самой разработке игр.

SeedRnd MilliSecs() 

Graphics3D 640,480,16,1

SetBuffer BackBuffer()

Const TypePlayer=1,TypeWall=2

Player=CreateSphere()

EntityType Player,TypePlayer

Wall=CreateCube()

PositionEntity Wall,0,0,10

EntityType Wall,TypeWall

Collisions TypePlayer,TypeWall,2,3

cam=CreateCamera()

PositionEntity cam,0,30,0

TurnEntity cam,90,0,0

lit=CreateLight()

TurnEntity lit,70,70,0


Repeat
	
	If KeyDown(200) MoveEntity Player,0,0,.1
	
	If KeyDown(208) MoveEntity Player,0,0,-.1
	
	If KeyDown(203) TurnEntity Player,0,2,0
	
	If KeyDown(205) TurnEntity Player,0,-2,0
	
	
	UpdateWorld
	
	RenderWorld
	
	Flip

Until KeyHit(1)

End

Итак, в этой программке представлен основной принцип проверки на прикосновения. Здесь мы создаём шар и куб, затем, стрелками управляем шаром, и, если вы захотите заехать внутрь куба, у вас ничего не получится ! УРА! Это и есть тот самый коллизион детекшн – он не пропускает одни объекты в другие, если, конечно перед этим указать, какие именно объекты, и куда именно не пускать (J) …

А теперь разберём все нововведения.

Сначала мы создали две константы – TypePlayer, равной единице и TypeWall, равной двойке. Зачем мы это сделали? Так это чтобы не запутаться! Я думаю, потом поймёте в чём именно… Ещё, вы, наверное, заметили, ещё одну новую команду – EntityType объект, тип объекта – присваивает данному объекту данный тип. Тип (в данном случае) - это просто цифры. Здесь мы вместо цифр использовали константы – чтобы не запутаться, да и чтобы легко можно было прочитать – к какому типу этот объект относится, и с чем соприкасается ( а то представьте такую ситуацию… у нас есть (какие-то) цифры для главного героя, стены, врагов, ну, и прочей дряни – всё это мы вначале создания проекта распределили, расставили, и благополучно забыли за ненадобностью… но вдруг в середине проекта вы вспоминаете, что забыли задать проверку на столкновение между врагом и героем , и начинаете судорожно вспоминать какая же цифра у вас обозначала врага, просматриваете килобайты кода… ну в общем можно поступить намного удобней, задав сразу константы, таким вот образом Тип_Герой = 1, Тип_Стена = 2, Тип_Пол = 3, Тип_Враг = 13, Тип_Враг_Босс = 113… Тип_какая-то_хрень_-_просто_валяться_где-нибудь_будет = 2147483647…! И мы тут уже не цифры пишем, а типа «Коллизион между Типом_Врагом и Типом_Героем»!!!

Следуящая команда: Collision первый тип, второй тип, метод, результат – в общем то, что она делает я только что написал, ну а подробней:

Первый тип – объект, который будет проверяться на столкновения.
Второй тип – объект, с которым эти самые столкновения и будут происходить…

Метод:
1 – соприкосновение сферы со сферой
2 – соприкосновение сферы с полигонами
3 – соприкосновение сферы с параллелепипедом

Результат:
1 – остановка
2 – скольжение – полное скольжение
3 – скольжение – защита объекта от скольжения вниз (может я перевёл не правильно, конечно, ну в общем этот метод создан для работы с террайнами в 3Д)

Теперь постараюсь обо всём этом, да поподробнее… начнём с методов:

Как видите, объект, который будет проверяться на столкновения (первый объект) должен будет иметь «сферу» столкновения – так как методы столкновения бывают только сферы с чем-нибудь. Величину этой самой сферы проверки можно задать для каждого объекта отдельно – с помощью команды EntityRadius объект, радиус#. Это накладывает некоторые ограничения (зато сама проверка – очень быстро реализована) и как бы ваша фигура не выглядела – коллизия будет проверяться именно по какой-то сфере – т.е. допустим, у вас есть предмет – спичка – здесь вам придётся делать либо большую сферу, получая довольно приличное расстояние в середине спички между радиусом сферы соприкосновения и радиусом самой спички, либо сделать сферу поменьше, но сверху и снизу спичка будет вылезать из сферы (как вариант – только верхняя или нижняя часть) – т.е. тут уже эта выпирающая часть может залезть в другой объект… ну, со спичкой я опять же утрирую – но, вот моделки людей, например, тоже не похожи на шары – так что рано или поздно, такой вопрос встанет, и о нём лучше подумать заранее – например, можно сделать более приземистых, коренастых юнитов – как в Квейке первом, например…

Далее – насчёт коллизиона. 1-е: этот самый коллизион происходит только при движении первого объекта внутрь второго… 2-е: Коллизион – вещь односторонняя – т.е. если мы, как в примере, хотим, чтобы герой соприкасался с врагами, а те, в свою очередь – с ним, то нам нужно писать две команды - «Коллизион между Типом_Героем и Типом_Врагом» и «Коллизион между Типом_Врагом и Типом_Героем»… а так как первый объект должен иметь именно СФЕРУ соприкосновения, то единственный доступный метод здесь – первый! Так что к сфере надо будет привыкнуть, и уже начинать думать, что с ними делать… правда, я слышал о том, что разработчики думают сделать коллизиион по эллипсоиду, но когда это будет?…

Так, незадолго до того, как я дописал туториал, вышел апдейт 1.82 (поэтому я тут немного дополняю), где эллипсоидный метод столкновения уже реализован, правда удлинять или сплющивать можно только по Y оси, но и это неплохо! Если я не ошибаюсь, новая команда выглядит так: EntityRadius объект, радиус по X и Z, радиус по Y...

Теперь будет намного интереснее. При условии конечно, что вы старательно изучали все эти главы, на которые потратили лучшие минуты своей жизни и большую часть поняли. Что же пора заняться тем, о чём я там обещал наверху – парой простеньких игрушек!