2017-08-21 10 views
1

SFMLのようなライブラリを使用するときに、ドライブからフォントやその他の単一のファイルを取り除くにはどうすればいいでしょうか?ファイルパスからフォントを読み込みます。SFMLなどのグラフィックライブラリを使用するときにフォントやその他のイメージファイルを埋め込む方法

私はどのように実行可能ファイルにそのデータを埋め込むのですか?その結果、実行ファイルはそれらのリソースファイルに依存しません。

答えて

2

まず、リソースを取得する必要があります。私はGoogleフォントから "BalooBhaijaan-Regular.ttf"フォントをダウンロードしました。
次に、指定されたフォントのバイナリデータを取得する必要があります。私の意見でこれを達成する最も簡単な方法は、Linuxの "xxd"コマンドを-iパラメータとともに使用してCスタイルの配列を出力することです。通常、私たちは真のタイプのフォントや大きな画像について話している場合は長くなるだろうので
の出力をファイルにリダイレクトしてみましょう:

xxd -i BalooBhaijaan-Regular.ttf > font_data.txt 

空のC/C++ヘッダーを作成するかにフォントデータを入れます既に存在するファイルです。私は出力が本当に長くなるので、新しいヘッダーファイルを使うほうが好きです。
もちろん、あなたのIDEに貼り付けた後、フォントの内容が通常変更されないので、配列型をconstに変更することができます。
これは私のIDEで見える方法です: enter image description here もちろん、これはchar配列です - なぜなら、文字配列ではそれぞれ "field"が1バイトを表すからです。

気づいたことがあるかもしれないが、xxdは別の変数も作成します.fold_data.txtの最後の変数は、配列の長さを知らせるunsigned intです。これは後で必要になります。組み込みの方法を使用してメモリから
1負荷フォント(一部:「長報知」整数の名前が進行する2つの方法があり、

今「_len」接尾辞配列の名前と同じです)
2.「偽」ファイルを作成し、それが
はこの1つは、SFMLは、それがアドレスです与えられたメモリからロードファイルをかなり単純なサポートされて


1.
両方のケースについての話をします読み込むライブラリは、それをサポートする、SFMLはありませんサイズを調整してください。

#include "BalooBhaijaanFont.hpp" 
#include <SFML/Graphics.hpp> 

int main(int argc, char** argv) { 
    sf::RenderWindow mainWindow(sf::VideoMode(200,100), L"TEST"); 
    sf::Font fromMem; 
    fromMem.loadFromMemory(&BalooBhaijaan_Regular_ttf, BalooBhaijaan_Regular_ttf_len); 
    sf::Text text("WORKS!", fromMem); 
    while(mainWindow.isOpen()){ 
     mainWindow.draw(text); 
     mainWindow.display(); 
    } 
    return 0; 
} 

ご覧のとおり、組み込み関数を使って読み込むのは簡単です。



2.
今では私は本当にお勧めしません一時ファイルのアプローチのための時間だ - ほとんどの図書館は、メモリからのロードをサポートし、独自のライブラリを作っている場合は、メモリを有するで終了しようとしていますとにかくロード機能。
ファイルをフォントクラスに読み込んで削除することはできますが、削除することはできますが、フォルダ内の追加ファイルが非常に面倒でない限り、この方法を使用する感覚はありません。
参考:

#include "BalooBhaijaanFont.hpp" 
#include <SFML/Graphics.hpp> 

int main(int argc, char** argv) { 
    sf::RenderWindow mainWindow(sf::VideoMode(200,100), L"TEST"); 
    sf::Font fromFile; 
    { 
     FILE * tempFile = fopen("tmpfont.ttf", "wb"); 
     fwrite(BalooBhaijaan_Regular_ttf, sizeof(char), BalooBhaijaan_Regular_ttf_len, tempFile); 
     fclose(tempFile); 
     fromFile.loadFromFile("tmpfont.ttf"); 
     std::remove("tmpfont.ttf"); 
    } 
    sf::Text text("WORKS!", fromFile); 
    while(mainWindow.isOpen()){ 
     mainWindow.draw(text); 
     mainWindow.display(); 
    } 
    return 0; 
} 
+0

一時ファイルまたはバッファを作成する必要はありません。単に '' sf :: Font :: loadFromMemory() '](https://www.sfml-dev.org/documentation/2.4.2/classsf_1_1Font.php#abf2f8d6de31eb4e1db02e061c323e346)を使ってフォントファイルをメモリから直接読み込みます。 – Mario

+0

@Marioは私が書いたものではありませんか?私は第二のアプローチを推奨しないと言ったが、それでも可能である –

+0

ああ、私の悪い。ちょうどコードに出荷されました。 :) – Mario

関連する問題