Урок 9 SFML Добавляем карту в игру

Есть несколько способов добавить карту в нашу игру. Сегодня разберем самый простой для понимания. Итак, карта – это набор 

ячеечек с картинками. Все эти ячейки имеют одинаковый размер и в совокупности дают картинку. Они таким же образом, как и наш герой, загружаются из одной картинки , но каждая из них имеет свой прямоугольник.
Видеоверсия: http://www.youtube.com/watch?v=_ZBePRNttPU

Рассмотрим на примере, я накидал простую картинку (тайлсет) для нашего урока. Вот он, скачивайте:map

 

Итак – в данном случае три квадратика (прямоугольничка), но одна картинка, ну как всегда. Белый фон справа я оставил просто так для вашей и моей фантазии, что нибудь можете впихнуть(подрисовать справа) и поэкспериментировать. Каждый квадратик имеет размер 32*32. Значит нам надо в программе выбирать нужный квадратик в зависимости от условия. Давайте попробуем:




Создадим отдельный заголовочный файл для карты. Слева, в обозревателе решений, нажимаем правой кнопкой на пункт “Файлы исходного кода”, выбираем “добавить”, “создать элемент”, “Заголовочный файл.h”, называем его map.h жмем окей. Теперь в этом файле пишем:

Объясняю, что сделали: сначала подключили библиотеку SFML, чтобы можно было воспользоваться строкой (работа со String ниже), затем объявили две переменные (константы) , которые отвечают за ширину высоту карты. Потом объявили массив строк и инициализировали его.

Здесь у нас встречается три символа = ‘ ‘ , ‘0’ , ‘s’ , то есть пробел, ноль, s. Когда мы будем рисовать карту (пока у нас три квадратика, поэтому три символа), мы будем спрашивать – если элемент массива равен ‘ ‘, то рисуем первый квадратик (коричневая плитка), если ‘s’, то рисуем камень и тд. Старайтесь называть осмысленно все переменные, чтобы в будущем быстрее понимать какая из них что делает. Символ ‘s’ , например, в данном случае потому, что у нас на этом месте будет камень (с англ. stone). ‘0’ можно было назвать ‘b’ от слова brick(кирпич), но вот тут у меня свое замороченное объяснение и я оставлю его при себе и 0 тоже оставлю))

Теперь идём в main.cpp файл и подключаем наш только что созданный заголовочный:

 

В главной ф-ции main объявляем

 

И в конце нам остается все это дело нарисовать, пробежавшись по этому массиву. После window.clear(); пишем:

 

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

Как вы видите все спрайты хорошо друг на друга накладываются и остается прозрачность. Посмотрите как лев и камень взаимодействуют графически:

lesson9

 

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

Previewxx35[1]

 

Слюньки потекли, да? :-)

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

main.cpp:

map.h:

 

 

 

 

 

 

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

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

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

    1. Досмотрю те уроки, что есть к тому времени надеюсь выйдут уроки по гравитации и взаимодействию с врагами. После планирую написать красочный 2D платформер не слишком большой но с хорошей графикой и увлекательным сюжетом. Сейчас пишу сценарий игры.
      Затем после выхода урока по работе с тайлсет редактором планирую сделать РПГ .
      У меня есть очень хороший Тайлсет редактор для РПГ с помошью которого можно не только составлять карты но и вбивать логику игры, анимацию, квесты, и т.д. Практически без использования кода и 58 уроков к нему, а так же около 6 гигов различных текстур, тайлсетов, чарсетов и т.д.
      Но им пока не пользуюсь так как у меня 2 цели:
      1. Из небольших (3-4 уровня) но красочных игр с хорошей графикой, логикой и сюжетом составить портфолио.
      2 Подтянуть С++.

      1. Отличный план. Делитесь ехе-шниками потом, поиграем:) Быть может вы сделаете онлайн РПГ, ведь sfml это сделать позволяет достаточно не сложно:)

        p.s. уроки по тому, что вы перечислили – как раз сейчас в разработке. Может за два дня сделаю.

  3.  Когда ввожу в main.cpp строку #include “map.h” и пытаюсь запустить, то выдает вот что получается:
    1>—— Сборка начата: проект: testsfml, Конфигурация: Debug x64 ——
    1> main.cpp
    1>main.cpp(5): error C2059: синтаксическая ошибка: using
    1>main.cpp(11): error C2146: синтаксическая ошибка: отсутствие “;” перед идентификатором “File”
    1>main.cpp(11): error C4430: отсутствует спецификатор типа – предполагается int. Примечание. C++ не поддерживает int по умолчанию
    1>main.cpp(12): error C2146: синтаксическая ошибка: отсутствие “;” перед идентификатором “image”
    1>main.cpp(12): error C4430: отсутствует спецификатор типа – предполагается int. Примечание. C++ не поддерживает int по умолчанию
    1>main.cpp(13): error C2146: синтаксическая ошибка: отсутствие “;” перед идентификатором “texture”
    1>main.cpp(13): error C4430: отсутствует спецификатор типа – предполагается int. Примечание. C++ не поддерживает int по умолчанию
    1>main.cpp(14): error C2146: синтаксическая ошибка: отсутствие “;” перед идентификатором “sprite”
    1>main.cpp(14): error C4430: отсутствует спецификатор типа – предполагается int. Примечание. C++ не поддерживает int по умолчанию
    1>main.cpp(15): error C2061: синтаксическая ошибка: идентификатор “String”
    1>main.cpp(16): error C2065: File: необъявленный идентификатор
    1>main.cpp(16): error C2065: F: необъявленный идентификатор
    1>main.cpp(17): error C2065: W: необъявленный идентификатор
    1>main.cpp(18): error C2065: H: необъявленный идентификатор
    1>main.cpp(19): error C2065: image: необъявленный идентификатор
    1>main.cpp(19): error C2228: выражение слева от “.loadFromFile” должно представлять класс, структуру или объединение
    1> тип: unknown-type
    1>main.cpp(19): error C2065: File: необъявленный идентификатор
    1>main.cpp(20): error C2065: image: необъявленный идентификатор
    1>main.cpp(20): error C2228: выражение слева от “.createMaskFromColor” должно представлять класс, структуру или объединение
    1> тип: unknown-type
    1>main.cpp(20): error C3861: Color: идентификатор не найден
    1>main.cpp(21): error C2065: texture: необъявленный идентификатор
    1>main.cpp(21): error C2228: выражение слева от “.loadFromImage” должно представлять класс, структуру или объединение
    1> тип: unknown-type
    1>main.cpp(21): error C2065: image: необъявленный идентификатор
    1>main.cpp(22): error C2065: sprite: необъявленный идентификатор
    1>main.cpp(22): error C2228: выражение слева от “.setTexture” должно представлять класс, структуру или объединение
    1> тип: unknown-type
    1>main.cpp(22): error C2065: texture: необъявленный идентификатор
    1>main.cpp(23): error C2065: X: необъявленный идентификатор
    1>main.cpp(23): error C2065: Y: необъявленный идентификатор
    1>main.cpp(24): error C2065: sprite: необъявленный идентификатор
    1>main.cpp(24): error C2228: выражение слева от “.setTextureRect” должно представлять класс, структуру или объединение
    1> тип: unknown-type
    1>main.cpp(24): error C3861: IntRect: идентификатор не найден
    1>main.cpp(34): error C2065: sprite: необъявленный идентификатор
    1>main.cpp(34): error C2228: выражение слева от “.setPosition” должно представлять класс, структуру или объединение
    1> тип: unknown-type
    1>main.cpp(38): error C2065: RenderWindow: необъявленный идентификатор
    1>main.cpp(38): error C2146: синтаксическая ошибка: отсутствие “;” перед идентификатором “window”
    1>main.cpp(38): error C3861: window: идентификатор не найден
    1>main.cpp(40): error C2065: Image: необъявленный идентификатор
    1>main.cpp(40): error C2146: синтаксическая ошибка: отсутствие “;” перед идентификатором “map_image”
    1>main.cpp(40): error C2065: map_image: необъявленный идентификатор
    1>main.cpp(41): error C2065: map_image: необъявленный идентификатор
    1>main.cpp(41): error C2228: выражение слева от “.loadFromFile” должно представлять класс, структуру или объединение
    1> тип: unknown-type
    1>main.cpp(42): error C2065: Texture: необъявленный идентификатор
    1>main.cpp(42): error C2146: синтаксическая ошибка: отсутствие “;” перед идентификатором “map”
    1>main.cpp(42): error C2065: map: необъявленный идентификатор
    1>main.cpp(43): error C2065: map: необъявленный идентификатор
    1>main.cpp(43): error C2228: выражение слева от “.loadFromImage” должно представлять класс, структуру или объединение
    1> тип: unknown-type
    1>main.cpp(43): error C2065: map_image: необъявленный идентификатор
    1>main.cpp(44): error C2065: Sprite: необъявленный идентификатор
    1>main.cpp(44): error C2146: синтаксическая ошибка: отсутствие “;” перед идентификатором “s_map”
    1>main.cpp(44): error C2065: s_map: необъявленный идентификатор
    1>main.cpp(45): error C2065: s_map: необъявленный идентификатор
    1>main.cpp(45): error C2228: выражение слева от “.setTexture” должно представлять класс, структуру или объединение
    1> тип: unknown-type
    1>main.cpp(45): error C2065: map: необъявленный идентификатор
    1>main.cpp(47): error C2661: Player::Player: нет перегруженной функции, принимающей 5 аргументов
    1>main.cpp(50): error C2065: Clock: необъявленный идентификатор
    1>main.cpp(50): error C2146: синтаксическая ошибка: отсутствие “;” перед идентификатором “clock”
    1>main.cpp(50): warning C4551: в вызове функции отсутствует список аргументов
    1>main.cpp(52): error C2065: window: необъявленный идентификатор
    1>main.cpp(52): error C2228: выражение слева от “.isOpen” должно представлять класс, структуру или объединение
    1> тип: unknown-type
    1>main.cpp(52): fatal error C1903: не удается восстановить после предыдущих ошибок; остановка компиляции
    ========== Сборка: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========

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