На этом уроке проскроллим карту курсором мыши. Подводя к краю экрана курсор, будем двигать камеру.
Видеоверсия sfml урок 15
Итак, чтобы двигать камеру с помощью краёв экрана и курсора (как в стратегиях, например), нам нужно забирать координаты курсора.
В функции int main() , сразу после управления персонажем, объявлю переменную вектор и сложу туда координаты курсора мыши, относительно окна.
1 |
sf::Vector2i localPosition = Mouse::getPosition(window);//заносим в вектор координаты мыши относительно окна (х,у) |
Можно посмотреть в консоле какими будут координаты:
1 |
std::cout << "locPos " << localPosition.x << "\n";//посмотрите как себя ведет позиция курсора Х |
Теперь необходимо знать край экрана. Координата левого края по иксу это , конечно ноль. Аналогично верхнему краю экрана – координата игрек тоже ноль. А вот право и низ это размер нашего окна.
Я сделал окно чуть побольше в начале оно выглядит так:
1 |
RenderWindow window(VideoMode(1366, 768), "Lesson 15. kychka-pc.ru"); |
Вот эти 1366 нам и надо получить для правого края, и 768 для нижнего края.
Можно просто написать 1366, а можно получить размер окна командой:
“window.getSize().x” или “window.getSize().y”
Теперь после снятия координат курсора (что после управления персонажем), напишу:
1 2 3 4 |
if (localPosition.x < 3) { view.move(-0.2*time, 0); }//если пришли курсором в левый край экрана,то двигаем камеру влево if (localPosition.x > window.getSize().x-3) { view.move(0.2*time, 0); }//правый край-вправо if (localPosition.y > window.getSize().y-3) { view.move(0, 0.2*time); }//нижний край - вниз if (localPosition.y < 3) { view.move(0, -0.2*time); }//верхний край - вверх |
почему здесь мелькает цифра три? давайте раберем для второго if :
1 |
if (localPosition.x > window.getSize().x-3) { view.move(0.2*time, 0); } |
Спрашивается : “Если координата курсора мыши больше чем размер окна (1366) минус 3, то двигаем камеру вправо. Отнимая минус три в данном случае мы тем самым даём возможность двигать камеру. Поскольку если мы не отнимем, то курсор ведь не уйдёт за пределы окна , если игра будет на весь экран. Аналогично для левого края, только там мы прибавляем 3. Можете прибавлять отнимать другие числа, как вам угодно.
Кстати, в управлении необходимо будет закомментировать строку
1 |
// getplayercoordinateforview(p.getplayercoordinateX(), p.getplayercoordinateY()); |
а то она будет перебивать вид. как правило в таких играх не требуется следить камерой за персонажем. но если надо, вы легко сможете это реализовать.
Чтобы было удобно пользоваться скроллингом – игру следует сделать на весь экран:
1 |
RenderWindow window(VideoMode(1366, 768), "Lesson 15. kychka-pc.ru",Style::Fullscreen); |
Обращаю ваше внимание на то, что размер окна при развороте на весь экран, – увеличится и станет равным вашему разрешению экрана. Всё будет работать, поскольку мы берем размер окна каждый раз при сравнении.
спасибо за уроки
пожалуйста:)
А будут ли уроки по динамическим объектам и всему что с ними связанно?
Конечно, всё будет, постепенно. К таковым объектам можно отнести пули, появляющихся новых врагов и т.д.
да именно. я вроде бы со всем разобрался кроме того,как их прорисовывать. в общем,ждем уроки)
например так.
Спасибо,теперь разобрался!
Добрый вечер.
Пытаюсь сделать скроллинг, но выдает следующие ошибки.
Подскажите пожалуйста идеи, которые помогут их исправить.
Вложение:
2
Вложение:
3
Вложение:
Создай пожалуйста тему на форуме и прикрепи весь код или проект
Главная › Форумы › SFML Project (делимся своими проектами) › Project Cell
переместил в более подходящую ветку – тот раздел просто для готовых игр, а не для вопросов. проект свой скинь через облако, например.
Подскажите, как при скролинге не смещаться за предел карты?
Mouse::getPosition() – только относительно окна (скорей камеры) или десктопа, а относительно реальных координат игры нет привязки.
сделать проверку как в случае с камерой для персонажа делали. если <0 коорд курсора, то не работает скроллинг влево