forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   FPS: Проблема с реализацией игрока (http://forum.boolean.name/showthread.php?t=14225)

Aikon 12.02.2011 18:26

FPS: Проблема с реализацией игрока
 
Сделал, как в обучающих примерах, т.е. пивот с камерой сверху
Код:

        Const COLLISION_PLAYER = 1, COLLISION_SCENE = 2
        Collisions COLLISION_PLAYER, COLLISION_SCENE, 2, 2
...
        scenePlayer = CreatePivot()
        sceneCamera = CreateCamera(scenePlayer)

        MoveEntity sceneCamera, 0, 3,0
        MoveEntity scenePlayer, 0, 1, 0

        EntityRadius scenePlayer, 1.5
        EntityType scenePlayer, COLLISION_PLAYER

Предположим, что есть лестница. Чтобы игрок по ней взбирался быстрее, т.е. выталкивался обработчиком столкновений, надо увеличить радиус "ног игрока" (scenePlayer). Однако, из-за этого игрок перестает проходить, например в двери (если деревья или обстановку в доме можно расставить по шире, то квадратные двери смотрятся нелепо).
Так же малое значение радиуса позволяет подойти близко к стене и "заглянуть" через нее (это лечится заданием небольшого значения перового параметра в CameraRange).

Что посоветуете сделать?

Подскажите еще, как сделать звук шагов. Простое добавление "воспроизвести звук, если игрок шагнул" на звук шагов не похож.

Randomize 12.02.2011 18:29

Ответ: FPS: Проблема с реализацей игрока
 
уменьшить гравитацию?

Aikon 12.02.2011 18:40

Ответ: FPS: Проблема с реализацей игрока
 
Гравитация сделана вот так (в процедуре обработки движения игрока)
Код:

        mvy# = -0.2
        If EntityCollided(scenePlayer,COLLISION_SCENE)  Then mvy = mvy + 0.2
        TranslateEntity  scenePlayer, 0, mvy, 0

Если ставить не 0.2, а другое значение, то ничего не меняется. Однако, если сделать дельту выталкивания больше, чем дельту падения, то игрок начинает бодро забегать по лестнице. Однако в этом случае, происходит дрожание пола под ногами (игрока через кадр подкидывает столкновение с землей, и гравитация вновь прижимает).
Более того, игрок получает возможность забираться по стенам спиной.

RBK 12.02.2011 21:35

Ответ: FPS: Проблема с реализацией игрока
 
Давай по порядку:
Цитата:

Предположим, что есть лестница. Чтобы игрок по ней взбирался быстрее, т.е. выталкивался обработчиком столкновений, надо увеличить радиус "ног игрока" (scenePlayer). Однако, из-за этого игрок перестает проходить, например в двери (если деревья или обстановку в доме можно расставить по шире, то квадратные двери смотрятся нелепо).
Смотрим справку EntityRadius
Цитата:

EntityRadius entity,x_radius#[,y_radius#]
Параметры
entity - указатель объекта
x_radius# - радиус по оси x эллипсоида зоны столкновений
y_radius# (optional) - радиус по оси y эллипсоида зоны столкновений. Если не указано, то будет использоваться значение параметра x_radius# (будет сфера).
Простой выход: используем разную ширину и высоту (передаём два параметра)
Цитата:

Так же малое значение радиуса позволяет подойти близко к стене и "заглянуть" через нее (это лечится заданием небольшого значения перового параметра в CameraRange).
CameraRange лучше особенно не трогать, используй ScaleEntity sceneCamera, 0.1, 0.1, 0.1

Для гравитации сделай вертикальную скорость. Отнимай от скорости величину гравитации каждый цикл. Если игрок столкнётся с полом - скорость равна 0, для прыжка вверх один раз прибавь положительное число.
Каждый цикл используй MoveEntity scenePlayer, 0, <вертикальная скорость>, 0

Aikon 12.02.2011 23:04

Ответ: FPS: Проблема с реализацией игрока
 
RBK, да, спасибо, не углядел про второй параметр. Но, почему их всего два? :(
Получается, что можно задать растяжение в горизонтальной плоскости. А чтобы получить вытянутый вверх эллипсоид, придется еще и повернуть Pivot игрока. Придется пробовать.

Размеры камеры и координаты трогать не хочу, поскольку хочу манипулировать камерой отдельно (пролеты камеры, с последующим возвращением к игроку) и при этом указывать глобальные координаты.
Задание CameraRange насколько я понимаю ничем не чревато, поскольку это просто задает просчитываемый объем для DirectX.

Про гравитацию не совсем понял. У меня так и сделано - вертикальная скорость 0.2. Выталкивается вверх от столкновения с поверхностью, напр. лестница. Прыжка вверх нет (не надо).

Alex_Noc 12.02.2011 23:21

Ответ: FPS: Проблема с реализацией игрока
 
а че коллизионную модель (прозрачность 0) ктото отменял в местах лестниц?

Aikon 12.02.2011 23:25

Ответ: FPS: Проблема с реализацией игрока
 
Alex_Noc, немножко подробнее можно расшифровать?
На данный момент лестница (угол наклона ~45 градусов, ступеньки) содержится в mesh-уровня, т.е. нет отличия где ходит игрок - по лестнице или по уровню.

RBK 13.02.2011 01:33

Ответ: FPS: Проблема с реализацией игрока
 
Вложений: 1
Цитата:

Про гравитацию не совсем понял. У меня так и сделано - вертикальная скорость 0.2. Выталкивается вверх от столкновения с поверхностью, напр. лестница. Прыжка вверх нет (не надо).
Скорее всего надо наоборот(чтобы по стенам не летать)
Код:

        mvy# = mvy# - 0.2
        If EntityCollided(scenePlayer,COLLISION_SCENE)  Then mvy# = 0
        MoveEntity  scenePlayer, 0, mvy#, 0

Камеру конечно делай как нужно тебе, я предложил вариант.
Цитата:

Получается, что можно задать растяжение в горизонтальной плоскости. А чтобы получить вытянутый вверх эллипсоид, придется еще и повернуть Pivot игрока. Придется пробовать.
Не надо ничего поворачивать, EntityRadius scenePlayer, 1.5, 3 получим:

Aikon 13.02.2011 03:48

Ответ: FPS: Проблема с реализацией игрока
 
RBK, спасибо! Получилось. Теперь и по лестницам игрок нормально ходит и в дверях не застревает :)

А не подскажешь еще, как шаги озвучить? Понятно, что можно через таймер:
1. Запускаем звук, напр. на 2сек. Выставляем флаг, что больше звук играть нельзя + таймер на 2сек.
2. Через 2сек таймер снимет флаг.
Но, что то не очень, как мне кажется :(

RBK 13.02.2011 11:38

Ответ: FPS: Проблема с реализацией игрока
 
Действительно не очень, снова смотрим в справку:
Цитата:

ChannelPlaying (указатель_на_канал)
Параметры
указатель_на_канал = переменная, назначенная каналу

Описание
Часто вам необходимо узнать, воспроизводится звуковой канал в данный момент или нет. Эта команда возвращает 1, если звук играет, или 0, если звук остановлен. Используйте ее для повторного воспроизведения фоновой музыки или любого другого звука, который мог неожиданно остановиться.
Далее управление звуком сводится к трём пунктам:
1)Если игрок движется, звук не играет - запускаем звук
2)Если игрок движется, звук играет - ничего не делаем
3)Если игрок не движется, звук играет - звук останавливаем

LLI.T.A.L.K.E.R. 13.02.2011 23:13

Ответ: FPS: Проблема с реализацией игрока
 
Не!
В блитзе есть такое: звук прикрепляют к каналу (channel). Звук запускается loop-ом бесконечно.
Когда не нужен звук - уменьшается громкость звучания, когда нужен - увеличивается. (А звук так и играет повторами).
+ в этом ещё - можно менять звучность и получается, что звуки (шагов) разные..

RBK 13.02.2011 23:32

Ответ: FPS: Проблема с реализацией игрока
 
Как вариант подойдёт, но допустим у меня десяток звуков шагов по разным покрытиям. Мне их что, все запустить? Что-то мне подсказывает, что такое количество каналов совсем нехорошо.

Alex_Noc 14.02.2011 00:55

Ответ: FPS: Проблема с реализацией игрока
 
if not chanelplaying(музон) then playsound (музон)
как то так

Alex_Noc 14.02.2011 00:56

Ответ: FPS: Проблема с реализацией игрока
 
Цитата:

Сообщение от LLI.T.A.L.K.E.R. (Сообщение 178836)
Не!
В блитзе есть такое: звук прикрепляют к каналу (channel). Звук запускается loop-ом бесконечно.
Когда не нужен звук - уменьшается громкость звучания, когда нужен - увеличивается. (А звук так и играет повторами).
+ в этом ещё - можно менять звучность и получается, что звуки (шагов) разные..

ИЗВРАЩЕНЕЦ!!!

Alex_Noc 14.02.2011 00:57

Ответ: FPS: Проблема с реализацией игрока
 
Цитата:

Сообщение от RBK (Сообщение 178840)
Как вариант подойдёт, но допустим у меня десяток звуков шагов по разным покрытиям. Мне их что, все запустить? Что-то мне подсказывает, что такое количество каналов совсем нехорошо.

МЫСЛИ СИСТЕМНО!!!


Часовой пояс GMT +4, время: 15:45.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot