Вчера я писал это:
Правда я её добавил без применения ООП, поэтому, если я захочу добавить ещё NPC, то мне придётся громоздить процедурную кашу каждый раз. Потом нужно будет запилить класс для NPC, иначе тонны кода обеспечены
А сегодня я сделал достаточно значимую вещь для проекта, написал класс для NPC. Теперь создание и управление NPC можно уместить в нескольких строках, раньше бы пришлось громоздить "процедурную кашу".
Примеры ниже.
(на этом форуме нет специального BB-кода для C++, поэтому использую [сode type=php] )
#include <SFML/Graphics.hpp>
using namespace sf;
int main() {
Clock clock;
Texture NPCtex;
Sprite NPCsprt;
NPCtex.loadFromFile("images/sprite.png");
NPCsprt.setTexture(NPCtext);
NPCsprt.setPosition(20, 20);
NPCsprt.setTextureRect(intRect(21, 0, 21, 45));
while(true) {
float time = clock.getElapsedTime().asMicroseconds();
clock.restart();
time = time / 800;
NPCsprt.move(0, 0.2*time);
}
return 0;
}
(Если вы скопируете и вставите код, то ничего работать не будет, т.к. нужно создать окно, поработав с SFMLевским классом RenderWindow)
Видите код сверху? Он достаточно громоздкий и быть может он выполняет кучу задач? Э... Нет))
Он создаёт картинку и двигает её вниз...
ВСЁ! Он даже не анимирует спрайт! Просто двигает и всё!
А теперь попробует сделать аналогичный код, но с использованием моего класса:
#include <SFML/Graphics.hpp>
using namespace sf;
int main() {
Clock clock;
NPC myNPC("sprite.png", 21, 45);
myNPC.NPCteleport(20, 20);
while(true) {
float time = clock.getElapsedTime().asMicroseconds();
clock.restart();
time = time / 800;
myNPC.NPCanim(3, time, 0.007f, 21, 0);
myNPC.NPCmove(0, 0.1f, time);
}
return 0;
}
Код получился меньше! Более того, он не просто двигает спрайт, он ещё и анимирует его! Вот такая вот штука эти классы.
Для наглядности, по спойлером находятся фрагменты кода, напрямую связанную с функционированием NPC:
Без класса:
Texture NPCtex;
Sprite NPCsprt;
NPCtex.loadFromFile("images/sprite.png");
NPCsprt.setTexture(NPCtext);
NPCsprt.setPosition(20, 20);
NPCsprt.setTextureRect(intRect(21, 0, 21, 45));
NPCsprt.move(0, 0.2*time);
С классом:
NPC myNPC("sprite.png", 21, 45);
myNPC.NPCteleport(20, 20);
myNPC.NPCanim(3, time, 0.007f, 21, 0);
myNPC.NPCmove(0, 0.1f, time);
Напоминаю, код с классом ещё и анимирует спрайт. Что-бы код без класса тоже мог анимировать, к нему нужно дописать кусок, который по размерам больше него самого.
Теперь расскажу о конкретных методах класса.
Сам конструктор класса:
F — названия графического файла с текстурами для NPC.
X — длина спрайта по координате X.
Y — длина спрайта по координате Y.
Создаёт самого NPC.
Метод телепортации:
X — координата X.
Y — координата Y.
Телепортирует NPC в заданные координаты.
Метод отрисовки:
Самый простой, но самый важный метод. Отображает спрайт NPC в окне игры.
Метод движения:
X — скорость движения по X.
Y — скорость движения по Y.
TIME — временной стабилизатор/коэффициент для привязки ко времени. Это переменная, обратно пропорциональная скорости работы процессора. Делает движение равномерным.
Двигает NPC с заданной скоростью.
Метод... указания кадра?:
L — координата самого левого пикселя кадра спрайта.
T — координата самого верхнего пикселя кадра спрайта.
Задаёт спрайту нужный кадр. Если метод анимации нельзя использовать по каким-то причинам, можно использовать этот метод.
Метод анимации:
NPCanim(M, TIME, S, L, T);
M — количество кадров.
TIME — коэффициент для привязки ко времени.
S — частота кадров.
L — координата самого левого пикселя второго кадра спрайта(обычно равна длине).
T — координата самого верхнего пикселя второго кадра спрайта(обычно равна высоте).
Анимирует NPC.
Метод получения координат:
Записывает координаты NPC в переменные класса XC и YC.
Фух... Вроде всё перечислил.
В принципе, в вот и всё. Теперь для создания новых NPC не придётся писать тонны кода!
.