В этой теме 14 ответов, 3 участника, последнее обновление Dallon Avery 9 года/лет, 1 месяц назад.
-
АвторСообщения
-
Начал тут разбирать этот SFML2.1 и тут же влетел в тупик.
Проблема вот в чём: я пытаюсь вывести надпись на экран самым простым доступным способом – Text text(“SFML text”); и конечно же window.draw(text);
Однако VS2012 подчёркивает мне мой стринг как показано на скрине.
PS:
#include <SFML/Graphics.hpp>
#include <SFML/System.hpp>
using namespace sf;Вложения:
You must be logged in to view attached files.Ты не можешь нарисовать текст , не используя шрифт. смотрел 12 урок?
C++123Font font;//шрифтfont.loadFromFile("CyrilicOld.ttf");//передаем нашему шрифту файл шрифтаText text("", font, 20);//создаем объект текст. закидываем в объект текст строку, шрифт, размер шрифта(в пикселях). это сам сфмл объект текст (не строка с++ овая)Интересно, но некоторые рисуют текст без всяких шрифтов, например в этом видео парниша делает то, что пытался сделать я: http://www.youtube.com/watch?v=dS6hpo0etaI
Смотри 1:00 – 1:40
А вот код из другого туториала:
источник(https://riseagain.wordpress.com/2012/07/15/sfml-2-tutorial-introduction/)
#include <SFML\System.hpp>
#include <SFML\Graphics.hpp>using namespace sf;
int main()
{
VideoMode videoMode(320,240);
RenderWindow window(videoMode,”Hello Text”);Text text(“Hello \nSFML 2 \nWorld!”);
text.setPosition(20,10);
//text.setColor(Color::Red);while (window.isOpen())
{
window.clear();
window.draw(text);
window.display();Event event;
while (window.pollEvent(event))
{
if ( (event.type == Event::Closed) ||
((event.type == Event::KeyPressed) && (event.key.code==Keyboard::Escape)) )
window.close();}
}
return EXIT_SUCCESS;
}точно) просто я всегда шрифты использовал свои, т.к там кириллицу скорее всего не нарисуешь. скинь свой код (исп кнопку вставки кода)
C++123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657#include <SFML/Graphics.hpp>#include <SFML/System.hpp>using namespace sf;int main(){VideoMode videoMode(320, 240);RenderWindow window(videoMode, "KeyEvent and text Window");//create some textText text("SFML text");//create rect shapeRectangleShape rectangle;rectangle.setPosition(30,30);rectangle.setSize(Vector2f(50,30));//set rect's propertiesrectangle.setFillColor(Color::Yellow);rectangle.setOutlineColor(Color::Blue);rectangle.setOutlineThickness(3);while (window.isOpen()){window.clear();window.draw(text);//window.draw(rectangle);window.display();Event event;while(window.pollEvent(event)){if( (event.type == Event::Closed) || (event.type == Event::KeyPressed) && (event.key.code==Keyboard::Escape) ) //allows to close the window by using close button on the title bar of the window (or by pressing ESC), also allows using two other buttons of the title bar.window.close();/*else{if (event.type == Event::KeyPressed){switch(event.key.code){case Keyboard::Up: rectangle.move(0,-10);break;case Keyboard::Down: rectangle.move(0,10);break;case Keyboard::Left: rectangle.move(-10,0);break;case Keyboard::Right: rectangle.move(10,0);break;}}}*/}}//system("PAUSE");return EXIT_SUCCESS;}не знаю почему, но работает только с тремя параметрами конструктора Text ( пример выше ). Можешь попробовать для интереса скачать старый сфмл (тот урок с ютуба загружен в 2011г и тогда была версия меньше чем 2.0 точно).
Ясненько, буду знать теперь.
Я уже не знаю, что делать, опять проблема со шрифтом.
Исходный код (игра понг):
C++123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284#include <SFML/Graphics.hpp>#include <algorithm>#include <sstream>using namespace sf;bool intersects (const RectangleShape & rect1,const RectangleShape & rect2){FloatRect r1=rect1.getGlobalBounds();FloatRect r2=rect2.getGlobalBounds();return r1.intersects (r2);}int clamp (const int x, const int a, const int b){return std::min(std::max(a,x),b);}int main(){const int width = 640;const int height= 480;const int borderSize= 12;const int margin = 50;const int moveDistance = 5;VideoMode videoMode(width, height);RenderWindow window(videoMode,"Pong SFML 2");Font font;if (!font.loadFromFile("TOMB.ttf"))return EXIT_FAILURE;RectangleShape top;RectangleShape left;RectangleShape right;RectangleShape bottom;// setting up all itemstop.setPosition(0, 0);top.setSize(Vector2f(width, borderSize));left.setPosition(-borderSize, 0);left.setSize(Vector2f(borderSize, height));right.setPosition(width, 0);right.setSize(Vector2f(borderSize, height));bottom.setPosition(0, height-borderSize);bottom.setSize(Vector2f(width, borderSize));top.setFillColor(Color(100,100,100));top.setOutlineColor(Color::Blue);top.setOutlineThickness(3);left.setFillColor(Color(100,100,100));left.setOutlineColor(Color::Blue);left.setOutlineThickness(3);right.setFillColor(Color(100,100,100));right.setOutlineColor(Color::Blue);right.setOutlineThickness(3);bottom.setFillColor(Color(100,100,100));bottom.setOutlineColor(Color::Blue);bottom.setOutlineThickness(3);RectangleShape ball;ball.setPosition(width/2, height/2);ball.setSize(Vector2f(20, 20));ball.setFillColor(Color::Yellow);ball.setOutlineColor(Color::Red);ball.setOutlineThickness(2);Vector2<float> ballSpeed(0.1,0.1);RectangleShape player1;player1.setSize(Vector2f(borderSize, 90));player1.setPosition(margin-borderSize, height/2-25);player1.setFillColor(Color(0,122,245));player1.setOutlineColor(Color::Red);player1.setOutlineThickness(3);RectangleShape player2;player2.setSize(Vector2f(borderSize, 90));player2.setPosition(width-margin, height/2-25);player2.setFillColor(Color(0,122,245));player2.setOutlineColor(Color::Red);player2.setOutlineThickness(3);RectangleShape middleLine;middleLine.setFillColor(Color(100,100,100,30));middleLine.setOutlineColor(Color(0,0,100,30));middleLine.setOutlineThickness(2);middleLine.setPosition(width/2, 0);middleLine.setSize(Vector2f(0, height));Text title("Pong SFML 2",font,50);title.setPosition(width/2-title.getGlobalBounds().width/2,100);title.setColor(Color::Blue);Text start("Press any key to start",font,30);start.setPosition(width/2-start.getGlobalBounds().width/2,400);start.setColor(Color::Red);Text won("You have won this game.\n\n Congratulations !",font,20);won.setPosition(width/2-won.getGlobalBounds().width/2,height/2-won.getGlobalBounds().height/2);won.setColor(Color::Green);Text lost("You have lost this game, \n better luck next time!",font,20);lost.setPosition(width/2-lost.getGlobalBounds().width/2,height/2-lost.getGlobalBounds().height/2);lost.setColor(Color::Red);Text score("0 0",font,50);score.setPosition(width/2-score.getGlobalBounds().width/2,40);score.setColor(Color(0,0,100,50));unsigned int p1Score=0, p2Score=0;enum states {INTRO, PLAYING, P1WON, P1LOST};int gameState=INTRO;while (window.isOpen()){window.clear(Color::White);switch(gameState){case INTRO:window.draw(title);window.draw(start);break;case PLAYING:window.draw(middleLine);window.draw(left);window.draw(right);window.draw(player1);window.draw(player2);window.draw(ball);window.draw(score);window.draw(top);window.draw(bottom);break;case P1WON:window.draw(won);break;case P1LOST:window.draw(lost);break;}window.display();Event event;while (window.pollEvent(event)){if ( (event.type == Event::Closed) ||((event.type == Event::KeyPressed) && (event.key.code==Keyboard::Escape)) )window.close();elseif ((event.type == Event::KeyPressed) && (gameState == INTRO))gameState=PLAYING;}if (gameState!=PLAYING)continue;// auto move player2 padif (ball.getPosition().y < player2.getPosition().y)player2.move(0, -moveDistance/40.0);else if(ball.getPosition().y+ball.getSize().y > player2.getPosition().y+player2.getSize().y)player2.move(0, moveDistance/40.0);// move player 1 padif (Keyboard::isKeyPressed(Keyboard::Up)){player1.move(0,-moveDistance/50.0);}elseif (Keyboard::isKeyPressed(Keyboard::Down)){player1.move(0,moveDistance/50.0);}// block players pad inside the play areaif ( intersects(player1,bottom) || intersects(player1,top) ){FloatRect t=top.getGlobalBounds();FloatRect b=bottom.getGlobalBounds();Vector2f p=player1.getPosition();p.y=clamp(p.y,t.top+t.height+5,b.top-player1.getSize().y-5);player1.setPosition(p);}if ( intersects(player2,bottom) || intersects(player2,top) ){FloatRect t=top.getGlobalBounds();FloatRect b=bottom.getGlobalBounds();Vector2f p=player2.getPosition();p.y=clamp(p.y,t.top+t.height+5,b.top-player2.getSize().y-5);player2.setPosition(p);}// ball collides with top and bottomif (intersects(ball,top)){FloatRect t=top.getGlobalBounds();FloatRect b=ball.getGlobalBounds();ballSpeed.y=-ballSpeed.y;int u = t.top + t.height - b.top;ball.move(0,2*u);}if ( intersects(ball,bottom) ){FloatRect bot= bottom.getGlobalBounds();FloatRect b= ball.getGlobalBounds();ballSpeed.y=-ballSpeed.y;int u = bot.top - b.height - b.top;ball.move(0,2*u);}// ball collides with player1 and player2if (intersects(ball,player1)){FloatRect p= player1.getGlobalBounds();FloatRect b= ball.getGlobalBounds();ballSpeed.x= -ballSpeed.x;ballSpeed.y= (b.top+b.height/2 - p.top - p.height/2) / 100;int u = p.left + p.width - b.left;b.left = p.left + p.width + u;ball.setPosition(b.left,b.top);//increase ball speed by 1%ballSpeed.x=ballSpeed.x*1.01;ballSpeed.y=ballSpeed.y*1.01;}if ( intersects(ball,player2) ){FloatRect p=player2.getGlobalBounds();FloatRect b=ball.getGlobalBounds();ballSpeed.x=-ballSpeed.x;ballSpeed.y= (b.top+b.height/2 - p.top - p.height/2) / 100;int u = b.left + b.width - p.left;b.left = p.left - b.width - u;ball.setPosition(b.left,b.top);//increase ball speed by 1%ballSpeed.x=ballSpeed.x*1.01;ballSpeed.y=ballSpeed.y*1.01;}// check for scoringif (intersects(ball,left)){p2Score++;std::stringstream str;str << p1Score << " " << p2Score;score.setString(str.str());score.setPosition(width/2-score.getGlobalBounds().width/2,40);FloatRect p=player2.getGlobalBounds();FloatRect b=ball.getGlobalBounds();ball.setPosition(p.left-b.width-5, height/2);ballSpeed.x=-0.1;ballSpeed.y=0.1;}if (intersects(ball,right)){p1Score++;std::stringstream str;str << p1Score << " " << p2Score;score.setString(str.str());score.setPosition(width/2-score.getGlobalBounds().width/2,40);FloatRect p=player1.getGlobalBounds();FloatRect b=ball.getGlobalBounds();ball.setPosition(p.left+p.width+5, height/2);ballSpeed.x=0.1;ballSpeed.y=0.1;}// detect if game is overif (p1Score >=11 && p1Score >= p2Score +2)gameState=P1WON;if (p2Score >=11 && p2Score >= p1Score +2)gameState=P1LOST;ball.move(ballSpeed.x,ballSpeed.y);}return EXIT_SUCCESS;}И скрин с ошибкой
Вложения:
You must be logged in to view attached files.У меня такие ошибки выдавал, когда я пытался создать объекты классов самого SFML в глобальной области. Но файл с ассемблером он мне не показывал оО, аж самому интересно что это такое)
хм. не вижу косяка.. напиши код более проще, используя лишь один текст. просто закомментируй, например.
соответствующая dll ка в которой вылазит исключение – у тебя имеется в проекте?Что значит проще?
И ещё, он ругается именно на применение шрифта (30-32строка), причём фальм со шрифтом лежит там где надо.
Update: я заменил все случаи вывода текста на экран с помощью шрифта на вывод текста в консоль через обычный cout, про ведение счёта я не запаривался. Как не трудно догадаться всё работает как часы. Так что подтвердилось, что проблема только с использованием шрифта и выводом текста на экран. в SFML для этого есть Font и Text соответственно, только вот в чём конкретно проблема я не знаю
в 2.0 таких проблем не встречал.
Проблема решена. Напомню, в чём она заключалась: программа отказывалась использовать шрифты и выводить текст на экран, выдавая следующую ошибку: SFML (32-bit VS12) – Unhandled exception at 0x701ADEF8 (msvcr110.dll) in SFML.exe: 0xC0000005: Access violation reading location 0x0526. LoadFromFile.
Как оказалось такая хрень возникает из-за путаницы sfml-библиотек в Debug и Release модах. Собственно, чтобы исправить данный касяк нужно в пропертях проекта в Debug указать библиотеки с суффиксом -d, а для релиза оставить без суффикса.
Таким образом, библиотеки дебага выглядят так:
sfml-main-d.lib
sfml-system-d.lib
sfml-graphics-d.lib
sfml-window-d.libИсточник решения проблемы по ссылке здесь.
-
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.