Сделаем перемещение персонажа с помощью клавиатуры.
Наш герой может перемещаться в четыре стороны. В будущем мы сделаем всё более красиво и перепишем под ООП, но сейчас главное понять суть работы с клавиатурой с помощью SFML.
Видеоверсия:
Работа с клавиатурой осуществляется так:
if (Keyboard::isKeyPressed(Keyboard::клавиша)) { какое то действие;}
Я добавил четыре строки в код предыдущего урока и теперь персонаж двигается во все четыре стороны. Нужный код находится именно в бесконечном цикле “пока открыто окно”. Посмотрите комментарии к этим строкам.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
#include <SFML/Graphics.hpp> using namespace sf; int main() { RenderWindow window(sf::VideoMode(640, 480), "Lesson 5. kychka-pc.ru"); Texture herotexture; herotexture.loadFromFile("images/hero.png"); Sprite herosprite; herosprite.setTexture(herotexture); herosprite.setTextureRect(IntRect(0, 192, 96, 96));//получили нужный нам прямоугольник с котом herosprite.setPosition(250,250); //выводим спрайт в позицию x y while (window.isOpen()) { sf::Event event; while (window.pollEvent(event)) { if (event.type == sf::Event::Closed) window.close(); } if (Keyboard::isKeyPressed(Keyboard::Left)) { herosprite.move(-0.1, 0); } //первая координата Х отрицательна =>идём влево if (Keyboard::isKeyPressed(Keyboard::Right)) { herosprite.move(0.1, 0); } //первая координата Х положительна =>идём вправо if (Keyboard::isKeyPressed(Keyboard::Up)) { herosprite.move(0, -0.1); } //вторая координата (У) отрицательна =>идём вверх (вспоминаем из предыдущих уроков почему именно вверх, а не вниз) if (Keyboard::isKeyPressed(Keyboard::Down)) { herosprite.move(0, 0.1); } //вторая координата (У) положительна =>идём вниз (если не понятно почему именно вниз - смотрим предыдущие уроки) window.clear(); window.draw(herosprite); window.display(); } return 0; } |
В данном случае метод move(x,y) двигает спрайт на указанные координаты. В будущем мы привяжем все эти действия ко времени => глюков или наоборот ускорений, которые вы можете наблюдать при управлении героем сейчас – не будет. Иначе говоря – сейчас мы привязаны к загруженности процессора.
Нам необходимо развернуть героя в сторону его движения. Я переписал эти ключевые четыре строки, теперь герой поворачивается:
1 2 3 4 |
if (Keyboard::isKeyPressed(Keyboard::Left)) { herosprite.move(-0.1, 0); herosprite.setTextureRect(IntRect(0, 96, 96, 96)); } //координата Y, на которой герой изображен идущим влево равна 96 if (Keyboard::isKeyPressed(Keyboard::Right)) { herosprite.move(0.1, 0); herosprite.setTextureRect(IntRect(0, 192, 96, 96)); } //координата Y, на которой герой изображен идущем вправо равна 96+96=192 if (Keyboard::isKeyPressed(Keyboard::Up)) { herosprite.move(0, -0.1); herosprite.setTextureRect(IntRect(0, 288, 96, 96)); } //координата Y на которой герой изображен идущим вверх равна 288 if (Keyboard::isKeyPressed(Keyboard::Down)) { herosprite.move(0, 0.1); herosprite.setTextureRect(IntRect(0, 0, 96, 96)); } //координата 0, это верхняя часть изображения с героем, от нее и отталкиваемся ровными квадратиками по 96. |
Помните в предыдущем уроке мы вырезали главного героя из общей картинки (тайлсета) ? Здесь нам это пригодилось. Мы нажимаем клавишу и вырезаем нужный участок изображения, тем самым делая нашего героя более “живым”.
Аналогичным образом вы можете использовать не только стрелки, но и, например, буквенные клавиши. Ниже, для примера, я переписал код и добавил управление на W,S,A,D:
1 2 3 4 |
if ((Keyboard::isKeyPressed(Keyboard::Left) || (Keyboard::isKeyPressed(Keyboard::A)))) { herosprite.move(-0.1, 0); herosprite.setTextureRect(IntRect(0, 96, 96, 96)); } //добавили управление на клавиши W,S,A,D if ((Keyboard::isKeyPressed(Keyboard::Right) || (Keyboard::isKeyPressed(Keyboard::D)))) { herosprite.move(0.1, 0); herosprite.setTextureRect(IntRect(0, 192, 96, 96)); } if ((Keyboard::isKeyPressed(Keyboard::Up) || (Keyboard::isKeyPressed(Keyboard::W)))) { herosprite.move(0, -0.1); herosprite.setTextureRect(IntRect(0, 288, 96, 96)); } if ((Keyboard::isKeyPressed(Keyboard::Down) || (Keyboard::isKeyPressed(Keyboard::S)))) { herosprite.move(0, 0.1); herosprite.setTextureRect(IntRect(0, 0, 96, 96)); } |
Похожим образом осуществляется работа с мышью. Давайте закрасим героя в красный по нажатию левой клавиши мыши:
1 2 3 4 |
if (sf::Mouse::isButtonPressed(sf::Mouse::Left)) { herosprite.setColor(Color::Red); } |
Вот на одной картинке мы нажали левую клавишу мыши и герой стал красным:
Здесь мы нажали стрелку вверх и герой повернулся вверх соответственно:
Более продвинутая работа с мышью (стрелять в место наведения курсора, например) будет потом в одном из уроков.
На следующем уроке мы сделаем привязку к бесконечному циклу времени. А чуть позже – анимацию героя.