Реалізація камери / огляду для двовимірної гри


21

Який найпрактичніший спосіб реалізувати камеру / область перегляду для 2D-гри?

Я читав, що я повинен зберігати світову позицію об'єкта замість положення відносно екрана?

Нинішня ситуація:

Я реалізував просту 2D-гру, де завантажую об'єкти та рівні з XML-файлів. Наразі XML-файл рівня виглядає приблизно так:

<map>
   <tile obj="ground" x="0" y="555" />
   <tile obj="ground" x="16" y="555" />
   <tile obj="ground" x="32" y="555" />
   ...
</map>

Усі об'єкти мають 2-векторну "позицію", що зберігає їх поточне розташування на екрані.

Що я хочу, щоб це було:

Ілюстрація з видом / ігровий світ

На малюнку:

  • Камера є або 800x600, або 640x480
  • Блоки та спрайти - 16х16 пікселів.
  • Розмір у світі може змінюватися
  • Координати, ймовірно, повинні бути нормалізовані щодо світу, а не до екрану?
  • Позиція перегляду по відношенню до x, y гравця та переміщується, коли гравець досягає мертвої зони камери (подібно до цього відео ).

Я запитую псевдо приклади / статті, але якщо вам потрібно знати, що я використовую для розробки: SDL & C / C ++.


1
Додайте своє третє посилання в коментарі тут, і я можу додати його до вашого питання.
MichaelHouse

Ось що я мав на увазі під мертвою зоною камери: youtube.com/watch?v=89TRXUm8jMI
bluekirai


Привіт @Arthur Вульф Білий, хочете детальніше? Спасибі.
bluekirai

Камера, яку ви згадуєте, - це специфічна версія загальної 2d камери, яка використовується лише для компенсації перегляду (відсутність обертання та збільшення масштабу). Поведінка відстеження може бути реалізована шляхом перевірки відстані між персонажем гравця та камерою, переміщенням камери, якщо відстань занадто велика.
вовчий світанок

Відповіді:


20

Потрібно, щоб кожен об'єкт розміщувався відносно світу, а не екран. Ваша камера також повинна мати власні координати світу, щоб її можна було намалювати у відносному положенні у світі. Також може бути зручно, щоб ваша фотокамера стежила за об’єктом, тому де б це не було, камера просто використовує свої координати. Зазвичай координати камери розміщуватимуть її з лівого верхнього кута. Це означає , що камера буде мати світове становище приблизно (0,24) в картині .

Що стосується насправді малювання об'єктів, які камера може "бачити", ви повинні намалювати всі об'єкти відносно світових координат камери. Щоб обчислити положення екрана об'єкта щодо камери, просто виконайте такі дії:

int screenX, screenY; //screen position of the object being drawn

screenX = object.x-camera.x;
screenY = object.y-camera.y;

Очевидно, що деякі об'єкти насправді не видно камері, тому, можливо, ви захочете запровадити систему вилучення подання.


2

Найкраще все це робити в GPU, використовуючи матриці World and View, а не змінюючи, де ви малюєте об'єкти на процесорі.

Таким чином, ви можете змінити камеру довільно (навіть збільшити її і зменшити!), І вона просто магічно спрацює. Ви все ще можете проглядати кулінг, а також економити час на нічию. І жоден ваш код для малювання світу не доведеться змінювати після правильної установки матриць подання та світу.

У SDL ви можете, ймовірно, просто вбудовувати виклики OpenGL, такі як glOrthoі glTranslate.

Дивіться цю нитку .


Чи може хтось пояснити сутичку? Це має сенс.
Hello World

1
Я не проголосував, але вважаю, що це навіть не відповідає на питання. Питання полягає в тому, як щось обчислити, а не про те, чи це ефективніше чи простіше це робити на GPU проти процесора. ОП навіть сказав, що шукає псевдоприклад. Немає сумнівів, що використання комбінації матриць камери / світу / моделі було б ефективнішим, тому mklingen має крапку.
Ден Уоткінс

Ця відповідь зовсім не погана! Він більш специфічний для розробки OpenGL / DX, але його правильний підхід, оскільки ви можете просто обчислити матрицю перекладу на основі камер камери та переміщати об'єкти через матрицю кулачка, не змінюючи їхніх фактичних позицій.
ненчев
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.