• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed sfml - Polskie znaki w zmiennej string.

Object Storage Arubacloud
0 głosów
1,002 wizyt
pytanie zadane 26 sierpnia 2017 w C i C++ przez milosz263 Nowicjusz (240 p.)
zamknięte 31 sierpnia 2017 przez milosz263

Witam. Tak jak widać kodzie poniżej chciałem wprowadzić do zmiennej string polskie słowo używając L przed cudzysłowem (nie znam fachowej nazwy tego), ale niestety kompilator pokazuje taki błąd: 

error: no match for 'operator=' (operand types are 'std::string {aka std::basic_string<char>}' and 'const wchar_t [11]')

//początek
std::string volume;
//w obsłudze jakiegoś zdarzenia
volume = L"Głośność: "; 
//w pętli głównej programu

sf::Text glosnosc(volume , comic, 50 );

  Gdy usunę L sprzed cudzysłowu to wszystko się kompiluje ale w programie są krzaki zamiast polskich znaków. Jest jakiś sposób aby nie było tych krzaków?

EDIT: podaję kod źródłowy: 

#include <iostream>
#include <string>
#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>
#include <SFML/Audio.hpp>
#include <cmath>
int mainvolume =100;
int vol = mainvolume;
std::wstring volume;
std::wstring intToStr(int n);
int main( int argc, char ** argv )
{
    sf::RenderWindow oknoAplikacji ( sf::VideoMode (800,600,32),"Kurs1");
    sf::Texture tekstura; //grafika
    tekstura.loadFromFile( "Grafika/1.png" );
    sf::Sprite obrazek;
    obrazek.setTexture( tekstura ); //grafika koniec
    sf::Music muzyka;  //muzyka
    muzyka.openFromFile("Music.ogg");
    muzyka.play();
    muzyka.setVolume(mainvolume); //muzyka koniec
    sf::Font comic; //tekst i czcionki
    comic.loadFromFile ("Fonts/comic.ttf");
    //tekst i czcionki koniec
    while( oknoAplikacji.isOpen() ) // pêtla g³ówna
{
sf::Event zdarzenie;
        while( oknoAplikacji.pollEvent( zdarzenie ) ) //tu obs³uga zdarzeñ
        {
            if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Up )/* podgłaśnianie */ {
                mainvolume=vol+3;
                vol=mainvolume;
                if(mainvolume==99) { muzyka.setVolume(100);}
                else {muzyka.setVolume(mainvolume);}
                volume = L"Głośność: "  ;
                volume += mainvolume;
            }
            if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Down )/* przyciszanie */ {
                mainvolume=vol-3;
                vol=mainvolume;
                if(mainvolume==1) { muzyka.setVolume(0);}
                else {muzyka.setVolume(mainvolume);}
                volume =  L"Głośność: ";
                volume += mainvolume;
            }
            if( zdarzenie.type == sf::Event::Closed ) oknoAplikacji.close();
        }
    vol = mainvolume;
    oknoAplikacji.clear( sf::Color::Black );
    oknoAplikacji.draw( obrazek );
    sf::Text glosnosc(volume , comic, 50 );
    glosnosc.setColor(sf::Color::Green);
    oknoAplikacji.draw(glosnosc);
    oknoAplikacji.display();
}    return 0;
}

 

komentarz zamknięcia: Rozwiązanie w komentarzach do najlepszej odpowiedzi. Sama odpowiedź nic nie dała.

2 odpowiedzi

0 głosów
odpowiedź 26 sierpnia 2017 przez mokrowski Mędrzec (155,740 p.)
wybrane 30 sierpnia 2017 przez milosz263
 
Najlepsza
#include <iostream>
#include <string>
#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>
#include <SFML/Audio.hpp>
#include <cmath>
int mainvolume =100;
int vol = mainvolume;
std::wstring volume;
std::wstring intToStr(int n);
int main( int argc, char ** argv )
{
    sf::RenderWindow oknoAplikacji ( sf::VideoMode (800,600,32),"Kurs1");
    sf::Texture tekstura; //grafika
    tekstura.loadFromFile( "Grafika/1.png" );
    sf::Sprite obrazek;
    obrazek.setTexture( tekstura ); //grafika koniec
    sf::Music muzyka;  //muzyka
    muzyka.openFromFile("Music.ogg");
    muzyka.play();
    muzyka.setVolume(mainvolume); //muzyka koniec
    sf::Font comic; //tekst i czcionki
    comic.loadFromFile ("Fonts/comic.ttf");
    //tekst i czcionki koniec
    while( oknoAplikacji.isOpen() ) // pêtla g³ówna
{
sf::Event zdarzenie;
        while( oknoAplikacji.pollEvent( zdarzenie ) ) //tu obs³uga zdarzeñ
        {
            if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Up )/* podgłaśnianie */ {
                mainvolume=vol+3;
                vol=mainvolume;
                if(mainvolume==99) { muzyka.setVolume(100);}
                else {muzyka.setVolume(mainvolume);}
                volume = L"Głośność: "  ;
                volume += std::to_wstring(mainvolume);
            }
            if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Down )/* przyciszanie */ {
                mainvolume=vol-3;
                vol=mainvolume;
                if(mainvolume==1) { muzyka.setVolume(0);}
                else {muzyka.setVolume(mainvolume);}
                volume =  L"Głośność: ";
                volume += std::to_wstring(mainvolume);
            }
            if( zdarzenie.type == sf::Event::Closed ) oknoAplikacji.close();
        }
    vol = mainvolume;
    oknoAplikacji.clear( sf::Color::Black );
    oknoAplikacji.draw( obrazek );
    sf::Text glosnosc;
    glosnosc.setString(volume);
    glosnosc.setFont(comic);
    glosnosc.setCharacterSize(50);
    glosnosc.setColor(sf::Color::Green);
    glosnosc.setStyle(sf::Text::Bold);
    oknoAplikacji.draw(glosnosc);
    oknoAplikacji.display();
}    return 0;
}

 

komentarz 30 sierpnia 2017 przez milosz263 Nowicjusz (240 p.)

@j23 Są dwa znaki. @Patrycjerz to nic nie dało. Mam na dolnej belce utf-8  i nawet po konwersji przez notepad++ jest tak jak na obrazku wyżej. 

1
komentarz 30 sierpnia 2017 przez maly Nałogowiec (37,190 p.)
sf::Text glosnosc(volume , comic, 50 );

Przecież tekst który wyświetlasz nie konwertujesz z utf-8.

1
komentarz 30 sierpnia 2017 przez j23 Mędrzec (194,920 p.)

@miłosz263, dziwne. Pewny jesteś, że czcionka obsługuje polskie litery? Testowałeś kod na "pewnych" czcionkach?

 

BTW, pozbądź się tych zmiennych globalnych i zrób tak:

std::ostringstream os;	
os << u8"Głośność " << mainvolume;
std::string volume = os.str();
	
sf::Text glosnosc(sf::String::fromUtf8(volume.begin(), volume.end()), comic);

 

komentarz 30 sierpnia 2017 przez Patrycjerz Mędrzec (192,320 p.)
maly, dobrze mówisz. Aż dziw bierze, że tego wcześniej nie zauważyłem.
komentarz 30 sierpnia 2017 przez milosz263 Nowicjusz (240 p.)

maly @j23 Dziękuje! pomogliście.

0 głosów
odpowiedź 26 sierpnia 2017 przez vector Dyskutant (9,200 p.)
zamist std::string użyj std::wstring
komentarz 26 sierpnia 2017 przez milosz263 Nowicjusz (240 p.)
Nie działa. Zamiast głośność: 100 to jest Głośność: d

Podobne pytania

0 głosów
1 odpowiedź 2,112 wizyt
0 głosów
2 odpowiedzi 725 wizyt
0 głosów
1 odpowiedź 1,147 wizyt
pytanie zadane 5 grudnia 2017 w C i C++ przez maciek061 Gaduła (4,490 p.)

92,631 zapytań

141,498 odpowiedzi

319,869 komentarzy

62,011 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...