SFML и C++ Уроки \ Разработка игр › Форумы › SFML System, Window и другие вопросы › Выдает ошибку (урок 8) (плюс черный экран)
В этой теме 7 ответов, 2 участника, последнее обновление vlad 8 года/лет, 11 мес. назад.
-
АвторСообщения
-
Запускаю код программы с твоего урока, а мне выдает ошибку, на скриншоте видно, вот код, он из урока 8. Единственное что я в нем изменил, это инициализировал переменную, так как у меня vc 2010. Из-за чего может быть такая проблема, выручайте
C++123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118#include <iostream>#include <SFML/Graphics.hpp>using namespace sf;////////////////////////////////////////////////////КЛАСС ИГРОКА////////////////////////class Player { // класс Игрокаpublic:float x, y, w, h, dx, dy, speed; //координаты игрока х и у, высота ширина, ускорение (по х и по у), сама скоростьint dir; //направление (direction) движения игрокаString File; //файл с расширениемImage image;//сфмл изображениеTexture texture;//сфмл текстураSprite sprite;//сфмл спрайтPlayer(String F, int X, int Y, float W, float H){ //Конструктор с параметрами(формальными) для класса Player. При создании объекта класса мы будем задавать имя файла, координату Х и У, ширину и высотуdir = 0;speed = 0;File = F;//имя файла+расширениеw = W; h = H;//высота и ширинаimage.loadFromFile("images/" + File);//запихиваем в image наше изображение вместо File мы передадим то, что пропишем при создании объекта. В нашем случае "hero.png" и получится запись идентичная image.loadFromFile("images/hero/png");image.createMaskFromColor(Color(41, 33, 59));//убираем ненужный темно-синий цвет, эта тень мне показалась не красивой.texture.loadFromImage(image);//закидываем наше изображение в текстуруsprite.setTexture(texture);//заливаем спрайт текстуройx = X; y = Y;//координата появления спрайтаsprite.setTextureRect(IntRect(w, h, w, h)); //Задаем спрайту один прямоугольник для вывода одного льва, а не кучи львов сразу. IntRect - приведение типов}void update(float time) //функция "оживления" объекта класса. update - обновление. принимает в себя время SFML , вследствие чего работает бесконечно, давая персонажу движение.{switch (dir)//реализуем поведение в зависимости от направления. (каждая цифра соответствует направлению){case 0: dx = speed; dy = 0; break;//по иксу задаем положительную скорость, по игреку зануляем. получаем, что персонаж идет только вправоcase 1: dx = -speed; dy = 0; break;//по иксу задаем отрицательную скорость, по игреку зануляем. получается, что персонаж идет только влевоcase 2: dx = 0; dy = speed; break;//по иксу задаем нулевое значение, по игреку положительное. получается, что персонаж идет только внизcase 3: dx = 0; dy = -speed; break;//по иксу задаем нулевое значение, по игреку отрицательное. получается, что персонаж идет только вверх}x += dx*time;//то движение из прошлого урока. наше ускорение на время получаем смещение координат и как следствие движениеy += dy*time;//аналогично по игрекуspeed = 0;//зануляем скорость, чтобы персонаж остановился.sprite.setPosition(x,y); //выводим спрайт в позицию x y , посередине. бесконечно выводим в этой функции, иначе бы наш спрайт стоял на месте.}};int main(){RenderWindow window(sf::VideoMode(640, 480), "Lesson 8. kychka-pc.ru");float CurrentFrame = 0;//хранит текущий кадрClock clock;Player p("hero.png",250,250,96.0, 96.0);//создаем объект p класса player,задаем "hero.png" как имя файла+расширение, далее координата Х,У, ширина, высота.while (window.isOpen()){float time = clock.getElapsedTime().asMicroseconds();clock.restart();time = time / 800;sf::Event event;while (window.pollEvent(event)){if (event.type == sf::Event::Closed)window.close();}///////////////////////////////////////////Управление персонажем с анимацией////////////////////////////////////////////////////////////////////////if ((Keyboard::isKeyPressed(Keyboard::Left) || (Keyboard::isKeyPressed(Keyboard::A)))) {p.dir = 1; p.speed = 0.1;//dir =1 - направление вверх, speed =0.1 - скорость движения. Заметьте - время мы уже здесь ни на что не умножаем и нигде не используем каждый разCurrentFrame += 0.005*time;if (CurrentFrame > 3) CurrentFrame -= 3;p.sprite.setTextureRect(IntRect(96 * int(CurrentFrame), 96, 96, 96)); //через объект p класса player меняем спрайт, делая анимацию (используя оператор точку)}if ((Keyboard::isKeyPressed(Keyboard::Right) || (Keyboard::isKeyPressed(Keyboard::D)))) {p.dir = 0; p.speed = 0.1;//направление вправо, см вышеCurrentFrame += 0.005*time;if (CurrentFrame > 3) CurrentFrame -= 3;p.sprite.setTextureRect(IntRect(96 * int(CurrentFrame), 192, 96, 96)); //через объект p класса player меняем спрайт, делая анимацию (используя оператор точку)}if ((Keyboard::isKeyPressed(Keyboard::Up) || (Keyboard::isKeyPressed(Keyboard::W)))) {p.dir = 3; p.speed = 0.1;//направление вниз, см вышеCurrentFrame += 0.005*time;if (CurrentFrame > 3) CurrentFrame -= 3;p.sprite.setTextureRect(IntRect(96 * int(CurrentFrame), 288, 96, 96)); //через объект p класса player меняем спрайт, делая анимацию (используя оператор точку)}if ((Keyboard::isKeyPressed(Keyboard::Down) || (Keyboard::isKeyPressed(Keyboard::S)))) { //если нажата клавиша стрелка влево или англ буква Аp.dir = 2; p.speed = 0.1;//направление вверх, см вышеCurrentFrame += 0.005*time; //служит для прохождения по "кадрам". переменная доходит до трех суммируя произведение времени и скорости. изменив 0.005 можно изменить скорость анимацииif (CurrentFrame > 3) CurrentFrame -= 3; //проходимся по кадрам с первого по третий включительно. если пришли к третьему кадру - откидываемся назад.p.sprite.setTextureRect(IntRect(96 * int(CurrentFrame), 0, 96, 96)); //проходимся по координатам Х. получается 96,96*2,96*3 и опять 96}p.update(time);//оживляем объект p класса Player с помощью времени sfml, передавая время в качестве параметра функции update. благодаря этому персонаж может двигатьсяwindow.clear();window.draw(p.sprite);//рисуем спрайт объекта p класса playerwindow.display();}return 0;}Вложения:
You must be logged in to view attached files.Попробуй инициализировать все переменные в конструкторе класса, а так же загрузить текстуру для персонажа не через конструктор с параметрами, а внутри конструктора, тем самым убрав первый параметр String F.
С картинкой не могу разобраться
Загрузи картинку внутри конструктора как в начальных уроках.
Вот здесь:
C++1image.loadFromFile("images/" + File);Пропиши полный путь до файла, типа images/hero.png
Все ошибку больше не выдает, но появилась новая проблема, я не вижу картинки, просто черный фон и все.
C++123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122///////////////////////Урок 8////////////////////////////////////#include <iostream>#include <SFML/Graphics.hpp>using namespace sf;////////////////////////////////////////////////////КЛАСС ИГРОКА////////////////////////class Player { // класс Игрокаpublic:float x, y, w, h, dx, dy, speed; //координаты игрока х и у, высота ширина, ускорение (по х и по у), сама скоростьint dir; //направление (direction) движения игрокаString File; //файл с расширениемImage image;//сфмл изображениеTexture texture;//сфмл текстураSprite sprite;//сфмл спрайтPlayer(float X, float Y, float W, float H){ //Конструктор с параметрами(формальными) для класса Player. При создании объекта класса мы будем задавать имя файла, координату Х и У, ширину и высотуfloat x, y, w, h, dx, dy, speed;int dir;dir = 0;speed = 0;//имя файла+расширениеw = W; h = H;//высота и ширинаimage.loadFromFile("images/hero.png");//запихиваем в image наше изображение вместо File мы передадим то, что пропишем при создании объекта. В нашем случае "hero.png" и получится запись идентичная image.loadFromFile("images/hero/png");image.createMaskFromColor(Color(41, 33, 59));//убираем ненужный темно-синий цвет, эта тень мне показалась не красивой.texture.loadFromImage(image);//закидываем наше изображение в текстуруsprite.setTexture(texture);//заливаем спрайт текстуройx = X; y = Y;//координата появления спрайтаsprite.setTextureRect(IntRect(0, 0, w, h)); //Задаем спрайту один прямоугольник для вывода одного льва, а не кучи львов сразу. IntRect - приведение типов}void update(float time) //функция "оживления" объекта класса. update - обновление. принимает в себя время SFML , вследствие чего работает бесконечно, давая персонажу движение.{switch (dir)//реализуем поведение в зависимости от направления. (каждая цифра соответствует направлению){case 0: dx = speed; dy = 0; break;//по иксу задаем положительную скорость, по игреку зануляем. получаем, что персонаж идет только вправоcase 1: dx = -speed; dy = 0; break;//по иксу задаем отрицательную скорость, по игреку зануляем. получается, что персонаж идет только влевоcase 2: dx = 0; dy = speed; break;//по иксу задаем нулевое значение, по игреку положительное. получается, что персонаж идет только внизcase 3: dx = 0; dy = -speed; break;//по иксу задаем нулевое значение, по игреку отрицательное. получается, что персонаж идет только вверх}x += dx*time;//то движение из прошлого урока. наше ускорение на время получаем смещение координат и как следствие движениеy += dy*time;//аналогично по игрекуspeed = 0;//зануляем скорость, чтобы персонаж остановился.sprite.setPosition(x,y); //выводим спрайт в позицию x y , посередине. бесконечно выводим в этой функции, иначе бы наш спрайт стоял на месте.}};int main(){RenderWindow window(sf::VideoMode(640, 480), "Lesson 8. kychka-pc.ru");float CurrentFrame = 0;//хранит текущий кадрClock clock;Player p(250,250,96.0, 96.0);//создаем объект p класса player,задаем "hero.png" как имя файла+расширение, далее координата Х,У, ширина, высота.while (window.isOpen()){float time = clock.getElapsedTime().asMicroseconds();clock.restart();time = time / 800;sf::Event event;while (window.pollEvent(event)){if (event.type == sf::Event::Closed)window.close();}///////////////////////////////////////////Управление персонажем с анимацией////////////////////////////////////////////////////////////////////////if ((Keyboard::isKeyPressed(Keyboard::Left) || (Keyboard::isKeyPressed(Keyboard::A)))) {p.dir = 1; p.speed = 0.1;//dir =1 - направление вверх, speed =0.1 - скорость движения. Заметьте - время мы уже здесь ни на что не умножаем и нигде не используем каждый разCurrentFrame += 0.005*time;if (CurrentFrame > 3) CurrentFrame -= 3;p.sprite.setTextureRect(IntRect(96 * int(CurrentFrame), 96, 96, 96)); //через объект p класса player меняем спрайт, делая анимацию (используя оператор точку)}if ((Keyboard::isKeyPressed(Keyboard::Right) || (Keyboard::isKeyPressed(Keyboard::D)))) {p.dir = 0; p.speed = 0.1;//направление вправо, см вышеCurrentFrame += 0.005*time;if (CurrentFrame > 3) CurrentFrame -= 3;p.sprite.setTextureRect(IntRect(96 * int(CurrentFrame), 192, 96, 96)); //через объект p класса player меняем спрайт, делая анимацию (используя оператор точку)}if ((Keyboard::isKeyPressed(Keyboard::Up) || (Keyboard::isKeyPressed(Keyboard::W)))) {p.dir = 3; p.speed = 0.1;//направление вниз, см вышеCurrentFrame += 0.005*time;if (CurrentFrame > 3) CurrentFrame -= 3;p.sprite.setTextureRect(IntRect(96 * int(CurrentFrame), 288, 96, 96)); //через объект p класса player меняем спрайт, делая анимацию (используя оператор точку)}if ((Keyboard::isKeyPressed(Keyboard::Down) || (Keyboard::isKeyPressed(Keyboard::S)))) { //если нажата клавиша стрелка влево или англ буква Аp.dir = 2; p.speed = 0.1;//направление вверх, см вышеCurrentFrame += 0.005*time; //служит для прохождения по "кадрам". переменная доходит до трех суммируя произведение времени и скорости. изменив 0.005 можно изменить скорость анимацииif (CurrentFrame > 3) CurrentFrame -= 3; //проходимся по кадрам с первого по третий включительно. если пришли к третьему кадру - откидываемся назад.p.sprite.setTextureRect(IntRect(96 * int(CurrentFrame), 0, 96, 96)); //проходимся по координатам Х. получается 96,96*2,96*3 и опять 96}p.update(time);//оживляем объект p класса Player с помощью времени sfml, передавая время в качестве параметра функции update. благодаря этому персонаж может двигатьсяwindow.clear();window.draw(p.sprite);//рисуем спрайт объекта p класса playerwindow.display();}return 0;}Зачем ты занова в конструкторе объявляешь int dir. инициализируй в конструкторе dir=0; и так же остальные переменные, типа dx и dy.
черный фон вместо картинки? или вобще ничего не видно? карты нету?Проблема в том, что ты занова объявил переменные в конструкторе. Их там надо было инициализировать. Вот рабочий код:
C++12345678910111213Player(float X, float Y, float W, float H){ //Конструктор с параметрами(формальными) для класса Player. При создании объекта класса мы будем задавать имя файла, координату Х и У, ширину и высотуdx = 0; dy = 0;dir = 0;speed = 0;//имя файла+расширениеw = W; h = H;//высота и ширинаimage.loadFromFile("images/hero.png");//запихиваем в image наше изображение вместо File мы передадим то, что пропишем при создании объекта. В нашем случае "hero.png" и получится запись идентичная image.loadFromFile("images/hero/png");image.createMaskFromColor(Color(41, 33, 59));//убираем ненужный темно-синий цвет, эта тень мне показалась не красивой.texture.loadFromImage(image);//закидываем наше изображение в текстуруsprite.setTexture(texture);//заливаем спрайт текстуройx = X; y = Y;//координата появления спрайтаsprite.setTextureRect(IntRect(0, 0, w, h)); //Задаем спрайту один прямоугольник для вывода одного льва, а не кучи львов сразу. IntRect - приведение типов}Не ну ты красавчик, так всю проблему раскидал, я просто в шоке. Я в С++ новичок(думаю, что еще не раз посещу форум), курсовая подкралась незаметно. А по-твоим урокам думаю что теперь сдам. Продолжай в том же духе.
-
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.