Урок 11 SFML Взаимодействие персонажа с картой

Давайте научим персонажа немного взаимодействовать с картой. Карта – массив , а значит нам необходимо взаимодействовать с элементами этого массива. Если короче, то 

Видеоверсия: http://www.youtube.com/watch?v=x6_E3RW0Mxo

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

Прежде чем начнем, сообщу, что я убрал последние две функции из файла камеры, убрал их вызов в main соответственно , а так же перенес слежение камеры за персонажем не в управление, а после, сократив код на 3 строки. Фишки с камерой были для демонстрации и если вам в вашей игре они нужны – оставляйте, конечно :)

Давайте реализуем столкновение с краями карты (символы ‘0’) и действие с камнем на карте. В классе игрока напишем функцию после функции update. Эту функцию мы потом передадим в update , чтобы оживить. Итак, пишем:

Персонаж может находиться сразу на нескольких квадратиках (которые 32*32, из них карта ж состоит). Так вот мы проходимся по всем квадратикам, с которыми он пересекается – по иксу слева направо, по игреку сверху вниз. Вверху алгоритм этого действия с комментариями.

А ниже небольшая схемка этого алгоритма:

sfml взаимодействие с картой
sfml взаимодействие с картой

Код будет работать некорректно (игрок будет не до конца подходить к объекту), поскольку я заметил, что допустил ошибку в предыдущих уроках. Короче – исправьте в методе update строчку последнюю на :

А то немного не в ту позицию спрайт выводили. Извиняюсь, скопировал с класса пули своей старой игры и не заметил (там то пуля от центра танка летела, поэтому такой код был)

И чтобы это всё заработало нам необходимо вызвать эту функцию в методе update, чтобы она постоянно работала. Где нибудь в конце воткните её:

Всё, готово. Запустите и посмотрите на результат. В следующем уроке поработаем с текстом с примером всё того же уже знаменитого камня. Будем считать количество собранных камней :)

Листинг main.cpp

 

Остальные файлы без изменений, за исключением еще view.h – в нем я оставил только метод getplayercoordinateXforview . Тут буква “Х” лишняя в названии метода, т.к мы считываем две координаты, а не только Х. Я у себя исправил и в прошлом уроке тоже исправил. Теперь метод называется “getplayercoordinateforview”

 

 

 

Буду благодарен, если поделитесь:
SFML вопросы, прошу, задавайте на форуме.
  1. Спасибо автору за столь хорошие уроки.Но у меня возник вопрос как сделать перемещение героя в точку клика,он у меня сразу перемещается при клике а хотелось чтобы он постепенно двигался

    1. Пожалуйста! Как время будет я подумаю и напишу об этом. Первое , что пришло в голову – забираешь координаты курсора мыши , а потом делаешь проверки в цикле типа “пока текущая координата игрока Х меньше координаты курсора, то идти вправо” и так далее с другими направлениями. Открылся форум, задай вопрос там, может sfml товарищи уже делали это :) Надо оживлять форум, тогда база знаний пополнится. А полезные ответы форума я потом буду закидывать в уроки.

  2. Спасибо автор за твою серию уроков. Однако мне кое-что не понятно. В комментариях ты говоришь, что “мы проходимся по всей карте”, но как так, если в определении переменных цикла фигурируют координаты игрока?

    И ещё, небольшая просьба: в последующих уроках постарайся более формально и точно излагать мысли. Ну например, вместо “мы проходимся по всей карте” стоило бы (лишь на мой взгляд) написать “мы проходимся по массиву символов…”. Просто иногда не очень понятно, что имеется в виду.

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

      1. Добрый день, хорошие уроки, вопрос следующий: при добавлении функции void interactionWithMap(),после компиляции появляется один белый экран, и windows аварийно завершает программу,в чем может быть проблема?

  3. Добрый день!
    Вы не могли бы объяснить, почему расчеты именно такие: в одном случае y = i * 32 – h, а в другом y = i * 32 + 32? Почему не -h/+h или не -32/+32 в обоих случаях?
    То есть, почему мы в одном случае отнимаем h,  равную 96 пикс, а в другом прибавляем 32 пикселя? Почему не оперировать одной и той же величиной в обоих случаях?
    Спасибо!

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