Понедельник, 11 Ноября 2024, 13:23

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
[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. Работает только последний аргумент, если его меняю происходит нечто странное biggrin

Добавлено (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)
Интерполяция по точкам
не, не слышал))

Можно примерчик с пояснениями? biggrin
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)
Блин.. Не выходит ничего.

Значит плохо старался! wink

Делать будем так:

Создаю структуру, которая будет отвечать за объект "Камера":
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)
---------------------------------------------
А нет все сик) Поигрался с "настройками", код менять не пришлось biggrin
Спасибо)

ReanДата: Воскресенье, 09 Декабря 2012, 10:42 | Сообщение # 14
участник
Сейчас нет на сайте
Quote (sooqua)
А нет все сик) Поигрался с "настройками", код менять не пришлось

Вся суть в том, что "менять" там практически нечего. Единственное, что можно сделать - "поиграть" с параметрами функций.
Основная задача была: реализовать плавное движение камеры. Остальное - побрякушки, которые делаются еще проще.

Quote (sooqua)
Спасибо)

Всегда пожалуйста! )
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг