2015-01-05 10 views
0

Я новичок в SFML, теперь у меня есть опыт программирования игр. В моем коде у меня есть diffirent объекты с его координатами. Теперь я жестко задаю все x и y для фиксированного разрешения. Вопрос в том, как правильно его закодировать? Я имею в виду, как закодировать так, что если игрок изменит размер окна игры, все объекты тоже будут изменены?Изменение размера окна приложения sfml

Заранее спасибо

Up

ответ

3

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

Придумайте определенный размер, который вы хотите, чтобы ваш «виртуальный» дисплей был, скажем, 640 на 480. В вашем цикле основного окна вы должны быть опросом для событий; событие, которое мы ищем, это sf :: Event с типом SizeEvent. Когда окно будет изменено, это событие будет вызываться, и вы получите новое разрешение X/Y в области отображения.

Когда вы обрабатываете это событие, вам нужно будет генерировать новые числа, исходя из того, сколько вы должны масштабировать свои функции рисования. Например, если мой «целевой» или «виртуальный» дисплей равен 640 на 480, а размер окна - 1600 на 960, я посмотрю на текущее соотношение сторон и решит, насколько я могу масштабироваться. Для X, 1600/640 коэффициент составляет 250%, но мой Y составляет всего 960/480 на 200%. В этом случае я бы использовал коэффициент 2 для увеличения размера, а затем поместил 160 пиксельных черных полос слева и справа (таким образом, я сохраняю одинаковое соотношение сторон).

AFAIK, SFML на самом деле не имеет глобальной матрицы, к которой можно применить преобразования - я вполне мог ошибаться. Однако то, что вам может потребоваться, - это смещение позиции каждого спрайта на 160 пикселей по оси X, а затем масштабирование в 2,0 раза. Вы также можете рисовать черные прямоугольники слева и справа от экрана прямо перед Window.display, чтобы убедиться, что ничего не «скреплено» с краев.

Извините, я не дал никакого действительного кода - API-документ - ваш друг, и особенно посмотрите на setScale(), setPositition() и setTransform() на странице this.

+0

Большое спасибо! Может быть, вы знаете, где я могу прочитать о деталях реализации? Я думаю, не очень хорошо изменить размер каждого объекта «вручную», может быть, проще сделать абстрактный класс для всех объектов, где я могу реализовать некоторые методы? Любой ссылки, где я могу прочитать об этом, будет достаточно. – OneOne

+0

В нижней части [link] (http://www.sfml-dev.org/tutorials/2.0/graphics-transform.php) он указывает, что все объекты преобразуются относительно их родителя. Поэтому, вероятно, лучшим подходом является наличие одного родительского объекта, который содержит все остальные игровые объекты. Затем, если вы измените размер этого объекта, все остальное будет автоматически настроено. –

Смежные вопросы