• 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.

VPS Starter Arubacloud
0 głosów
968 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,460 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,340 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,022 wizyt
0 głosów
2 odpowiedzi 711 wizyt
0 głosów
1 odpowiedź 1,125 wizyt
pytanie zadane 5 grudnia 2017 w C i C++ przez maciek061 Gaduła (4,490 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...