Урок 10 SFML Камера вида

У нас уже есть карта, но когда персонаж двигается – игра за ним не следит, а он уходит за края экрана. Такого быть не должно и для этого в sfml есть возможность работать с камерой вида.


Видеоверсия:

Я буду передавать координаты персонажа для нашей камеры. Можно было просто передать типа “view.setCenter(p.x,p.y);” и всё будет норм, но мы с камерой будем работать сейчас по крупному и как помните из урока  я говорил, что к свойствам обращаться напрямую не стоит. Короче говоря – в классе Player допишем метод, после метода void update пишем:

А две переменные x , y в начале класса сделаем приватными. Так выглядит теперь начало класса Player:

Это принцип инкапсуляции ООП. Когда вы работаете в крупной компании по разработке игр – вам не нужно знать свойства объекта , какие то там х, у и тд. Вам здесь и сейчас нужно использовать его координаты и вы используете метод get…чётотам(что разрабы ваши предложили). Короче говоря , – у вас есть машина в реале (в ООП – класс машина) и вам не важно как там устроен двигатель, какие процессы в ней происходят, как она едет и прочее. Вы просто используете готовый инструмент (руль, газ, кпп) и едете! По сути то , что вы едете и есть использование публичных методов класса. А то что она сосёт бензин при этом, работает двигатель, коробка передач что то там шестеренки бла-бла-бла – вас не волнует вобще – вы едете и юзаете эту коробку передач, эту машину. так вот приватный метод (функция) это и есть тот процесс, который происходит, но вас он не касается. оно просто работает. В крупных проектах, повторюсь, – та же басня. Вам пофиг что там ваш коллега накатал и по какой логике оно работает – вы просто пользуетесь и не лезете в эти внутренности кода. Я думаю можно будет сделать дополнение к уроку 8 и рассказать про ООП подробнее , если попросите.




Идём далее:

Создадим новый заголовочный файл view.h. (забыли как создать? см пример в предыдущем уроке)

В нем напишем:

Теперь напишем функцию “слежения камеры за игроком”:

Перейдем в файл main.cpp , подключите заголовочник:

#include “view.h”//подключили код с видом камеры

А там где объявляются переменные функции, (хоть сразу после RenderWindow window(sf::VideoMode(640, 480), “Lesson 10. kychka-pc.ru”);) Напишем:

(Так же уберем управление на W,S,A,D и оставим только стрелочки. На W,S,A,D у нас теперь другие планы :-) )

И теперь нам нужно по нажатию каждой клавиши передвигать камеру, следя за игроком:

 

Можно было вызвать функцию сразу после управления и она бы работала, но у нас задел будет на то, чтобы передвигать камеру по карте на W,S,A,D и если оставить чуть ниже , вне управления – то скроллинг карты будет перебиваться нашим героем, потому что камера всегда будет хотеть встать по координатам персонажа. А так она встает только когда мы нажимаем стрелки.

Теперь перед очисткой экрана (window.clear), пишем:

Запустите, должно работать :)

Теперь вопрос, как двигать камеру для игры типа стратегии? Ну, так же, как и персонажа, примерно :-)

В файле view.h пишем:

 

Смотрим комменты. Чтобы заработало – пишем в main.cpp в месте например после p.update(time):

Запускаем и пробуем двигать на wsad. Если вы хотите двигать камеру вручную и чтобы она не следила за персонажем – удаляете строки слежения за игроком в нашей первой функции камеры. (там где set.center…)

Теперь о возможностях камеры sfml. Её можно повернуть , масштабировать, двигать(выше двинули уже:-)) и даже сделать несколько камер, каждая из которых показывает определенный участок в игре. Так, например, можно сделать игру на двоих с раздельным экраном. Или какую-то миникарту. В файлы view.h напишите ф-цию:

А в файле main.cpp вызовите её примерно в том же месте, где мы карту двигали:

Запустите и потыкайте на кнопки, которые написаны в коде.

На этом всё, у нас остался один глюк после этого – мы видим края карты. Самое простое решение – сделать бордюр игры (у меня это кирпичи с символом ‘0’, см урок 9 ) и очистку экрана window.clear () , – одного цвета. Можно передать этой функции параметр, узнав приблизительный код цвета текстуры бордюра (как узнать код цвета в конце этой статьи) .




Я написал

И смотрите результат:

работа с камерой sfml
работа с камерой sfml

 

Выглядит лучше, чем черный фон.

Ещё один способ, который не даст камере просто показать то , что находится снаружи бордюра – проверка координат. Что-то типа – если мы зашли левее такого то икса, то установить камеру вот так то и всё. Так же по игреку и во все четыре стороны. Вернуть черный цвет , чтобы лучше видеть разницу и методом подбора искать край. Для моего этого примера код такой (переписал нашу первую функцию):

 

Код работает на три стороны, кроме правой. Одно условие надо добавить – если вам надо попробуйте сами. Карта всё равно разрастется и придется это действие делать по новой, так что не парьтесь пока.

Вот мы слева вверху, а черных краёв не видно:

убираем края карты sfml
убираем края карты sfml

На рисунке ниже клавишами повернул, отдалил камеру:

работа с камерой sfml
работа с камерой sfml

Нашли ошибку в статье? Сообщите в комментарии!

На следующей уроке научимся взаимодействовать персонажем с самой картой.

Листинг урока:

main.cpp

 

view.h

 

 

 

 

 

 

 

 

Буду благодарен, если поделитесь:
SFML вопросы, прошу, задавайте на форуме.
  1. Я тут такую штуку запилил, мб пригодится кому. (я стратегию делаю)
    view.setSize(window.getSize().x, window.getSize().y);
    Пихаем в главный цикл игры и получаем: если изменяются размеры окна, сама игра не растягивается.

    1. Спасибо! Может пригодится. Но когда ты сделаешь игру до конца – скорее всего ты сделаешь окно на весь экран , как у полноценной игры, без возможности растягивать. Так же не получится с таким способом убрать края экрана (то , что за бордюром игры, тот самый черный фон). Может быть и получится, но не это надо постараться. Вобще если устраивает, то можно юзать:)

  2. У меня проблема возникла…

    Теперь перед очисткой экрана (window.clear), пишем:

    1

    window.setView(view);//”оживляем” камеру в окне sfml

    Запустите, должно работать

    Дошел до этого Момента. При запуске у меня пропал страйт персонажа, а если нажимаю нажимать на стрелки, то пропадает карта.

     

    Вложение: 1 р

Добавить комментарий