Реализация игрока в FPS
Главный персонаж в FPS должен бегать, прыгать, приседать. Я реализовывал его следующим образом:
Пивот у пола (Pvt1) связанный с ним пивот в районе головы (Pvt2) и камера в районе головы:
Global Pvt1 = CreatePivot()
Global Pvt2 = CreatePivot(Pvt1)
Global Cam = CreateCamera(Pvt2)
PositionEntity Pvt1 0, 50, 0
PositionEntity Pvt2, 0, 70, 0
PositionEntity Cam, 0, 50, 0
Для перемещении игрока двигаю Pvt1
Для вращения головы вращаю камеру
Для определения возможности прыжка проверяю наличие колиизии Pvt1 с комнатой
При приседании опускаю Pvt2
При возникновении коллизии Pvt2 с комнатой (чтобы башка не съезжала при ударении в косяк например) перемещаю Pvt1 след. образом:
EntityParent Pvt2, 0
PositionEntity Pvt1, EntityX(Pvt2, True), EntityY(Pvt1, True), EntityZ(Pvt2, True), TrueEntity
Parent Pvt2, Pvt1
Наблюдается следующий артефакт - когда стоишь рядом со стеной то прыгать можно постоянно, т.к. имеется коллизия Pvt1 со стеной (которая также как и пол является частью комнаты)
Для устранения добавлял еще один пивот у пола Pvt3 - меньшего радиуса и для определения возможности прыжка проверяю наличие колиизии Pvt3 с комнатой.
Из-за меньшего радиуса он соприкасается только с полом а не со стеной.
В целом такая реализация срабатывает, но иногда наблюдается косяки. ИМХО все как то усложнено.Полагаю что я во многом перемудрил, вот и хотел узнать как подобное реализуют другие.
|