[HGE] Камера
| |
sooqua | Дата: Пятница, 07 Декабря 2012, 23:22 | Сообщение # 1 |
был не раз
Сейчас нет на сайте
| Как сделать камеру за игроком в HGE? http://gcup.ru/forum/3-12419-1 - у меня не работает hge->Gfx_SetTransform, не знаю почему.. Игрался с аргументами, все бестолку)
|
|
| |
Нохчи | Дата: Пятница, 07 Декабря 2012, 23:31 | Сообщение # 2 |
заслуженный участник
Сейчас нет на сайте
| Quote (sooqua) у меня не работает hge->Gfx_SetTransform, не знаю почему.. Игрался с аргументами, все бестолку) У всех работает. Поиграйся еще.
Многие вопросы по Windows отпадут, если посмотреть тут
|
|
| |
sooqua | Дата: Пятница, 07 Декабря 2012, 23:36 | Сообщение # 3 |
был не раз
Сейчас нет на сайте
| Нохчи, ну я делал так: hge->Gfx_SetTransform(50, 50, 150, 150); в FrameFunc, в RenderFunc, в WinMain, менял аргументы, заполнял все, оставлял нули, ставил 500, ставил 50, ставил 0.5. Работает только последний аргумент, если его меняю происходит нечто странное Добавлено (07.12.2012, 23:36) --------------------------------------------- За что отвечает каждый аргумент? Какие изменить чтоб сместить камеру, допустим, на 50 вправо и на 20 вниз?
|
|
| |
Нохчи | Дата: Пятница, 07 Декабря 2012, 23:58 | Сообщение # 4 |
заслуженный участник
Сейчас нет на сайте
| Набросал сэмпл. Камера перемещается стрелками: Code float dispX = 0; float dispY = 0;
bool FrameFunc() { // Process keys if (hge->Input_GetKeyState(HGEK_ESCAPE)) return true; if (hge->Input_GetKeyState(HGEK_LEFT)) { dispX += 0.1; hge->Gfx_SetTransform(0,0,dispX,dispY,0,1,1); } if (hge->Input_GetKeyState(HGEK_RIGHT)) { dispX -= 0.1; hge->Gfx_SetTransform(0,0,dispX,dispY,0,1,1); } if (hge->Input_GetKeyState(HGEK_UP)) { dispY += 0.1; hge->Gfx_SetTransform(0,0,dispX,dispY,0,1,1); } if (hge->Input_GetKeyState(HGEK_DOWN)) { dispY -= 0.1; hge->Gfx_SetTransform(0,0,dispX,dispY,0,1,1); } }
Про параметры в справке почитай.
Многие вопросы по Windows отпадут, если посмотреть тут
|
|
| |
sooqua | Дата: Суббота, 08 Декабря 2012, 00:38 | Сообщение # 5 |
был не раз
Сейчас нет на сайте
| Работает) Благодарю)
Добавлено (08.12.2012, 00:38)
Эмм. Один вопрос. А как сделать чтоб не все элементы смещались? Оставить, допустим, шрифт в левом верхнем углу.
Сообщение отредактировал sooqua - Суббота, 08 Декабря 2012, 00:38 |
|
| |
Нохчи | Дата: Суббота, 08 Декабря 2012, 00:43 | Сообщение # 6 |
заслуженный участник
Сейчас нет на сайте
| Quote (sooqua) Оставить, допустим, шрифт в левом верхнем углу. 1)Установить трансформацию 2)Отрисовать все объекты 3)Сбросить трасформацию 4)Отрисовать шрифт.
Многие вопросы по Windows отпадут, если посмотреть тут
|
|
| |
sooqua | Дата: Суббота, 08 Декабря 2012, 12:15 | Сообщение # 7 |
был не раз
Сейчас нет на сайте
| А вот еще) Я сделал класс "камера", в нём функцию "connect", она связывает объект с камерой, и она движется за объектом ( в моем случае за игроком ). Но она слишком резкая)) Игрок может поворачивать вправо-влево очень быстро и она в этих моментах просто трясется) Как сделать её "мягче"? Чтоб она плавно следовала за игроком?)
|
|
| |
Rean | Дата: Суббота, 08 Декабря 2012, 12:24 | Сообщение # 8 |
участник
Сейчас нет на сайте
| Quote Но она слишком резкая)) Интерполяция по точкам? Не помню, есть ли она в HGE, но реализуется она достаточно просто.
Правка: интерполяция координат камеры позволит перемещать ее плавно. Допустим, необходимо переместить камеру по горизонтали. Тогда, следует взять текущую координату Х и конечную Х1. В результате интерполяции получаем новое значение Х и повторяем операцию до тех пор, пока Х не станет Х1.
Сообщение отредактировал Rean - Суббота, 08 Декабря 2012, 12:31 |
|
| |
sooqua | Дата: Суббота, 08 Декабря 2012, 12:29 | Сообщение # 9 |
был не раз
Сейчас нет на сайте
| Quote (Rean) Интерполяция по точкам не, не слышал))
Можно примерчик с пояснениями?
|
|
| |
Rean | Дата: Суббота, 08 Декабря 2012, 12:55 | Сообщение # 10 |
участник
Сейчас нет на сайте
| Quote (sooqua) Можно примерчик с пояснениями? Тебе подойдет реализация линейной интерполяции из Microsoft XNA:
Code value1 + (value2 - value1) * amount
value1 - это будет X. value2 - это будет X1. amount - вес точки X1. Значение должно находится в [0;1].
Если мне не изменяет память, то amount будет влиять на резкость-плавность движения. Задача из простых: реализуешь данный алгоритм в виде функции. Если у тебя камера "привязана" к объекту, то каждый такт процессора изменяешь значение X камеры, интерполируя текущую координату X и координату X объекта.
|
|
| |
sooqua | Дата: Суббота, 08 Декабря 2012, 21:21 | Сообщение # 11 |
был не раз
Сейчас нет на сайте
| Блин.. Не выходит ничего. Решил так - камера будет плавно "обгонять" игрока до определённого "предела", чтобы было видно что впереди)
Вот код который делает чтоб камера просто бегала за игроком (по Х): Code float Offset = -Player.X + Window.Width/2; hge->Gfx_SetTransform(0, 0, Offset, 0, 0, 1, 1); Добавлено (08.12.2012, 21:21) --------------------------------------------- Поможет кто реализовать то что я написал?)
|
|
| |
Rean | Дата: Воскресенье, 09 Декабря 2012, 00:25 | Сообщение # 12 |
участник
Сейчас нет на сайте
| Quote (sooqua) Блин.. Не выходит ничего. Значит плохо старался!
Делать будем так:
Создаю структуру, которая будет отвечать за объект "Камера": Code struct Camera { // Координаты камеры float X; float Y; // Функция интерполяции float hLerp(float value, float amount) { return X + (value - X) * amount; } }; Camera camera;
Функция hLerp - в нашем случае, это функция линейной интерполяции по горизонтали. X - это value1. value - это соответственно value2. amout - он и есть amount
Далее, для наглядности опишем еще одну структуру - GameObject Code struct GameObject { // Координаты объекта float X; float Y; // Спрайт объекта hgeSprite *sprite; }; GameObject obj; Здесь, думаю, все ясно.
А теперь, "финт ушами": в функции, которая отвечает у нас за просчет кадра (HGE_FRAMEFUNC), следует ввести следующее: Code bool FrameFunc() { // Выход из программы if (hge->Input_GetKeyState(HGEK_ESCAPE)) return true; // Передвижение объекта по оси Х с учетом дельта-времени (к нашему делу мало относится) if (hge->Input_GetKeyState(HGEK_LEFT)) obj.X -= 500 * hge->Timer_GetDelta(); if (hge->Input_GetKeyState(HGEK_RIGHT)) obj.X += 500 * hge->Timer_GetDelta();
// Король Вечеринки - Линейная Интерполяция! camera.X = camera.hLerp(obj.X-100, hge->Timer_GetDelta() * 2);
return false; } Основной смысл несет предпоследняя строчка. Здесь мы указываем, что интерполировать надо по координате X нашего игрового объекта (100 я отнимаю лишь для того, чтобы объект не был с самого края окна - костыль). Стоит обратить внимание на то, что в позицию параметра amount мы вставили GetDelta. По той простой причине, что интерполяция у нас должна происходить как бы в действии, чтобы мы могли наблюдать эффект "наплыва" камеры. Умножение на 2 - чтобы интерполяция происходила чуть быстрее.
Ну и в завершении: Code bool RenderFunc() { // Применяем трансформацию с заданными параметрами. hge->Gfx_SetTransform(0, 0, -camera.X, camera.Y, 0, 1, 1); // Выполняем отрисовку hge->Gfx_BeginScene(); hge->Gfx_Clear(0xFFFFFF); obj.sprite->Render(obj.X, obj.Y); hge->Gfx_EndScene(); // TODO: отрисовать HUD // для этого "скидываем" трансформацию по нулями и рисуем то, что надо. return false; } Теперь это не должно вызвать каких-либо трудностей.
|
|
| |
sooqua | Дата: Воскресенье, 09 Декабря 2012, 03:20 | Сообщение # 13 |
был не раз
Сейчас нет на сайте
| Не плохо)))) Но эффект не совсем тот) Попробую пока сам разобраться как это работает и сделать как мне нужно .______.Добавлено (09.12.2012, 03:20) --------------------------------------------- А нет все сик) Поигрался с "настройками", код менять не пришлось Спасибо)
|
|
| |
Rean | Дата: Воскресенье, 09 Декабря 2012, 10:42 | Сообщение # 14 |
участник
Сейчас нет на сайте
| Quote (sooqua) А нет все сик) Поигрался с "настройками", код менять не пришлось Вся суть в том, что "менять" там практически нечего. Единственное, что можно сделать - "поиграть" с параметрами функций. Основная задача была: реализовать плавное движение камеры. Остальное - побрякушки, которые делаются еще проще.
Всегда пожалуйста! )
|
|
| |
|