Урок 18 SFML движение спрайта в место клика мыши

Движение спрайта по клику часто применяется в играх, таких как стратегии или RPG. В этом уроке рассмотрим реализацию такого движения.

Видеоверсия: https://youtu.be/nqAkujaiOps

Будет немного аналитической геометрии, но тут всё просто, советую сесть и разобраться :-)

Рекомендуется к прочтению: http://habrahabr.ru/post/131931/

Для создания движения по клику необходимо иметь вектор, который берет свое начало в координатах нашего персонажа, а конец – в точке клика курсора.

Начнём:-)

Добавим в класс игрока переменную isMoved и isClicked:

Инициализировали их в конструкторе:

Переменная isMove будет отвечать за состояние движения персонажа, то есть пока он идёт isMove=true, иначе =false.
Переменная isClicked позволит игроку тыкнуть по персонажу и сказать куда ему надо идти. Если он не тыкнет и не выберет его, то и идти он не сможет. Всё как в стратегиях!

Теперь объявим переменные в int main ()

У нас уже есть с прошлого урока игровые координаты курсора, проверьте чтобы они остались:

 

Теперь в цикле событий запилим левый тык мыши, который будет отвечать за выбор объекта.

Если тыкнули левую клавишу и при этом попали курсором на наш спрайт игрока, то красим спрайт в зеленый цвет(например так игрок поймет что тыкнул и объект готов к действиям) и меняем переменную isSelect на значение true.

Далее перед концом цикла событий реализуем правый клик, который возможен , если мы выбрали объект. Этот клик сделает переменную isMove true, запишет координаты клика курсора, вернет спрайту прежний цвет, скажет что объект уже не выбран:

После конца цикла событий и его закрытия напишем код, реализующий движение героя:

Тут пока переменная “Объект идёт (isMove)” равна истине – выполняется подсчёт дистанции, которая стремится к нулю (но не сходится по причине икса и игрека ниже) в своих расчётах. Дистанция это есть расстояние от игрока до точки клика. Условие больше двух создано для того, чтобы убрать дёргание спрайта после его прихода в конец. Всё потому, что p.x+= и p.y+= будут дёргать спрайт из-за дистанции, которая так и не сможет обнулиться из-за них же самих. Короче не суть важно, главное – работает. :)
p.x+= и p.y+= двигают персонажа вперед пока дистанция уменьшается. Происходит это за счёт нормализации вектора. Мы делим его компонент на его длину, получая 1. Если сложно, то думайте так: p.x+=0.1*time (пока мы не пришли в пункт назначения). Именно нормализация вектора даёт нам направление движения персонажа. Итак, как только мы пришли в пункт назначения – переменная isMove=false, выводим для себя веселое сообщение в консоль -“приехали”.

Вот еще немного для понимания картины:

sfml урок 18
sfml lesson 18

На скриншоте у меня вместо героя стрелка потому, что мой спрайт котика не годится для стратегий, а так же в следующем уроке мы будем поворачивать спрайт в сторону места его направления движения (а так же курсора), поэтому стрелка более точно укажет это направление.

движение по клику мыши
движение по клику мыши

Вот вам веселая картинка в тему))

Хотелось бы отметить, что бы забирали координаты курсора постоянно, а лучше это делать по клику мыши, то есть при клике мыши переключать флаг, который снимет координаты, попробуйте реализовать это в isSelect условии.

Код урока:
main.cpp

 

 

Буду благодарен, если поделитесь:
SFML вопросы, прошу, задавайте на форуме.
  1. меня почему-то при нажатии в координаты 0,0 кидает
    не могу понять, почему
    не подскажете?

    1. player.x = 0.1*time… Не правильно записал, не равно а +=.
      Случайно узнал пока свой косяк пытаюсь исправить. Тебе это не надо, но может кому поможет.

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