SFML и C++ Уроки \ Разработка игр › Форумы › SFML System, Window и другие вопросы › При загрузке картинки чёрный экран
В этой теме 1 ответ, 2 участника, последнее обновление Павел Букреев 7 года/лет, 9 мес. назад.
Просмотр 2 сообщений - с 1 по 2 (из 2 всего)
-
АвторСообщения
-
При загрузке картинки пропадает вся карта и персонаж, остаётся только чёрный фон. Что делать?
Содержимое health_bar.h
C++123#include <SFML\Graphics.hpp>const int hbpoints= 10;sf::String hpoint="OOOOOOOOOO";Cодержимое main.cpp
C++123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261#include <iostream>#include <SFML/Graphics.hpp>#include "map.h"#include "viev.h"#include "health_bar.h"#include <sstream>using namespace sf;class Player { // класс Игрокаprivate:float x, y;public:float w, h, dx, dy, speed; //координаты игрока х и у, высота ширина, ускорение (по х и по у), сама скоростьint dir,hp; //направление (direction) движения игрокаString File; //файл с расширениемImage image;//сфмл изображениеTexture texture;//сфмл текстураSprite sprite;//сфмл спрайтint maxhp;//int playerScore;bool life;Player(String F, float X, float Y, float W, float H, float S){ //Конструктор с параметрами(формальными) для класса Player. При создании объекта класса мы будем задавать имя файла, координату Х и У, ширину и высотуFile = F;//имя файла+расширениеw = W; h = H;//высота и ширина//playerScore=0;maxhp=100;hp=100;bool life=1;speed=S;//скорость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(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;//аналогично по игреку//if (x < 0) x = 0;//if (y < 0) y = 0;//if (y > 660) y = 660;speed = 0;//зануляем скорость, чтобы персонаж остановился.sprite.setPosition(x,y); //выводим спрайт в позицию x y , посередине. бесконечно выводим в этой функции, иначе бы наш спрайт стоял на месте.interactionWithMap();if (hp <= 0){ life = false; speed = 0; }}void interactionWithMap()//ф-ция взаимодействия с картой{for (int i = y / 32; i < (y + h) / 32; i++)//проходимся по всей карте, то есть по всем квадратикам размера 32*32, которые мы окрашивали в 9 уроке. про условия читайте ниже.for (int j = x / 32; j<(x + w) / 32; j++)//икс делим на 32, тем самым получаем левый квадратик, с которым персонаж соприкасается. (он ведь больше размера 32*32, поэтому может одновременно стоять на нескольких квадратах). А j<(x + w) / 32 - условие ограничения координат по иксу. то есть координата самого правого квадрата, который соприкасается с персонажем. таким образом идем в цикле слева направо по иксу, проходя по от левого квадрата (соприкасающегося с героем), до правого квадрата (соприкасающегося с героем){if (TileMap[i][j] == '0')//если наш квадратик соответствует символу 0 (стена), то проверяем "направление скорости" персонажа:{if (dy>0)//если мы шли вниз,{y = i * 32-h;//то стопорим координату игрек персонажа. сначала получаем координату нашего квадратика на карте(стены) и затем вычитаем из высоты спрайта персонажа.}if (dy<0){y = i * 32+32;//аналогично с ходьбой вверх. dy<0, значит мы идем вверх (вспоминаем координаты паинта)}if (dx>0){x = j * 32-w;//если идем вправо, то координата Х равна стена (символ 0) минус ширина персонажа}if (dx < 0){x = j * 32+32;//аналогично идем влево}}if (TileMap[i][j] == 's') { //если символ равен 's' (камень)//playerScore++;}if (TileMap[i][j] == 'f') {hp-=40;//если взяли ядовитейший в мире цветок,то переменная health=health-40;TileMap[i][j] = ' ';}if(hp<maxhp){if (TileMap[i][j] == 'h') {hp += 20;//если взяли сердечко,то переменная health=health+20;TileMap[i][j] = ' ';}}}}float getplayercoordinateX(){ //этим методом будем забирать координату Хreturn x;}float getplayercoordinateY(){ //этим методом будем забирать координату Yreturn y;}~Player(){}};int main(){RenderWindow window(sf::VideoMode(640, 480), "Game Test");view.reset(sf::FloatRect(0, 0, 640, 480));Font font;//шрифтfont.loadFromFile("files/CyrilicOld.ttf");//передаем нашему шрифту файл шрифтаText text("", font, 20);//создаем объект текст. закидываем в объект текст строку, шрифт, размер шрифта(в пикселях);//сам объект текст (не строка)text.setColor(Color::Red);//покрасили текст в красный. если убрать эту строку, то по умолчанию он белыйtext.setStyle(sf::Text::Bold | sf::Text::Underlined);//жирный и подчеркнутый текст. по умолчанию он "худой":)) и не подчеркнутыйfloat CurrentFrame = 0;//хранит текущий кадрClock clock;Clock gameTimeClock;int gameTime = 0;Image hp_image;//объект изображения для картыhp_image.loadFromFile("images/heal_bar.png");//загружаем файл для картыTexture hp_t;//текстура картыhp_t.loadFromImage(hp_image);//заряжаем текстуру картинкойSprite hp_s;//создаём спрайт для картыhp_s.setTexture(hp_t);//заливаем текстуру спрайтомImage map_image;//объект изображения для картыmap_image.loadFromFile("images/map.png");//загружаем файл для картыTexture map;//текстура картыmap.loadFromImage(map_image);//заряжаем текстуру картинкойSprite s_map;//создаём спрайт для картыs_map.setTexture(map);//заливаем текстуру спрайтомPlayer p("1.png",50,40,96.0, 96.0,0.001);//создаем объект p класса player,задаем "1.png" как имя файла+расширение, далее координата Х,У, ширина, высота.while (window.isOpen()){float time = clock.getElapsedTime().asMicroseconds();if (p.life) gameTime = gameTimeClock.getElapsedTime().asSeconds();//игровое время в секундах идёт вперед, пока жив игрок, перезагружать как time его не надо. оно не обновляет логику игрыclock.restart();time = time / 800;sf::Event event;while (window.pollEvent(event)){if (event.type == sf::Event::Closed)window.close();}///////////////////////////////////////////Управление персонажем с анимацией////////////////////////////////////////////////////////////////////////if(p.life){if (Keyboard::isKeyPressed(Keyboard::Left)){p.dir = 1;p.speed = 0.1;CurrentFrame += 0.005*time;if (CurrentFrame > 3) CurrentFrame -= 3;p.sprite.setTextureRect(IntRect(96 * int(CurrentFrame)+6, 136, 89, 55));}if (Keyboard::isKeyPressed(Keyboard::Right)){p.dir = 0;p.speed = 0.1;CurrentFrame += 0.005*time;if (CurrentFrame > 3) CurrentFrame -= 3;p.sprite.setTextureRect(IntRect(96 * int(CurrentFrame)+6, 231, 89, 55));}if (Keyboard::isKeyPressed(Keyboard::Up)){p.dir = 3;p.speed = 0.1;CurrentFrame += 0.005*time;if (CurrentFrame > 3) CurrentFrame -= 3;p.sprite.setTextureRect(IntRect(96 * int(CurrentFrame)+27, 305, 39, 89));}if (Keyboard::isKeyPressed(Keyboard::Down)){p.dir = 2;p.speed = 0.1;CurrentFrame += 0.005*time;if (CurrentFrame > 3) CurrentFrame -= 3;p.sprite.setTextureRect(IntRect(96 * int(CurrentFrame)+27, 6, 39, 89));}getplayercoordinateforview(p.getplayercoordinateX(), p.getplayercoordinateY());}p.update(time);//оживляем объект p класса Player с помощью времени sfml, передавая время в качестве параметра функции update. благодаря этому персонаж может двигаться;window.setView(view);//"оживляем" камеру в окне sfmlwindow.clear();for (int i = 0; i < HEIGHT_MAP; i++)for (int j = 0; j < WIDTH_MAP; j++){if (TileMap[i][j] == ' ') s_map.setTextureRect(IntRect(0, 0, 32, 32));if (TileMap[i][j] == 's') s_map.setTextureRect(IntRect(32, 0, 32, 32));if ((TileMap[i][j] == '0')) s_map.setTextureRect(IntRect(64, 0, 32, 32));if ((TileMap[i][j] == 'f')) s_map.setTextureRect(IntRect(96, 0, 32, 32));//добавили цветокif ((TileMap[i][j] == 'h')) s_map.setTextureRect(IntRect(128, 0, 32, 32));//и сердечкоs_map.setPosition(j * 32, i * 32);//по сути раскидывает квадратики, превращая в карту. то есть задает каждому из них позицию. если убрать, то вся карта нарисуется в одном квадрате 32*32 и мы увидим один квадратwindow.draw(s_map);//рисуем квадратики на экран}/*for (int i = 0; i < hbpoints; i++){if (hpoint[i] == 'O')hp_s.setTextureRect(IntRect(0, 0, 13, 18));hp_s.setPosition(p.getplayercoordinateX()+40+(i*13), p.getplayercoordinateY() - 200);//по сути раскидывает квадратики, превращая в карту. то есть задает каждому из них позицию. если убрать, то вся карта нарисуется в одном квадрате 32*32 и мы увидим один квадратwindow.draw(hp_s);//рисуем квадратики на экран}*/std::ostringstream playerHealthString, gameTimeString; // объявили переменнуюplayerHealthString << p.hp; //занесли в нее число здоровья, то есть формируем строкуgameTimeString << gameTime;text.setString("Здоровье:" + playerHealthString.str());if(!p.life)text.setString("\nВремя игры: "+gameTimeString.str());//задаем строку тексту и вызываем сформированную выше строку методом .str()text.setPosition(view.getCenter().x +150, view.getCenter().y - 200);//задаем позицию текста, отступая от центра камерыif(!p.life)text.setPosition(view.getCenter().x-30, view.getCenter().y);/* std::ostringstream playerScoreString; // объявили переменнуюplayerScoreString << p.playerScore; //занесли в нее число очков, то есть формируем строкуtext.setString("Собрано камней:" + playerScoreString.str());//задаем строку тексту и вызываем сформированную выше строку методом .str()text.setPosition(view.getCenter().x+150, view.getCenter().y - 200);//задаем позицию текста, отступая от центра камерыwindow.draw(text);//рисую этот текст*/if(p.life)window.draw(p.sprite);//рисуем спрайт объекта p класса playerwindow.draw(text);window.display();}return 0;}Сам код ещё не сделал до конца, но это должно было работать, ведь так? Прикрепил скрин.
Вложения:
You must be logged in to view attached files.на всякий случай – проинициализируй в конструкторе все переменные класса. дх , ду там не вижу.
путь до картинки проверь. попробуй загрузить без File параметра в конструкторе,а прям сразу в классе. -
АвторСообщения
Просмотр 2 сообщений - с 1 по 2 (из 2 всего)
Для ответа в этой теме необходимо авторизоваться.