1

環境

SDL と OpenGL を使用してゲーム エンジンを作成しています。ファンシーなTrue Typeフォントを使用して画面にテキストを出力する最良の方法を見つけようとしていますが、FTGLに出会いました。(より良い/より簡単な解決策がある場合は、自由に共有してください。)

FTGL のコンパイル

動作させるには FreeType2 が必要なので、入手してコンパイルし (Code::Block を使用)、次に Code::Block を使用して FTGL ライブラリをコンパイルしました。

CDT プラグインで Eclipse Indigo を使用しています。.lib.dllファイルがあるため、どのライブラリを使用すればよいかわかりません。私は両方を試しましたが、これは現在この行にある私の問題をまったく変えないようです:

FTfont* m_Font = new FTTextureFont(filename.c_str());

エラーは次のとおりです。

The type 'FTTextureFont' must implement the inherited pure virtual method 'FTFont::MakeGlyph'

FTPixmapFont コンストラクターなど、別の FTfont サブクラスを使用しても変わりません。

私が試したリンカーフラグは次のとおりです。

-lmingw32 -lSDLmain -lSDL -lSDL_image -lSDL_net -lSDL_ttf -lftgl -lfreetype234_D -lopengl32 -lglu32

-lmingw32 -lSDLmain -lSDL -lSDL_image -lSDL_net -lSDL_ttf -lftgl -llibfreetype -lopengl32 -lglu32

MinGWでEclipseを使用しています。

コピーして貼り付けました

  • src/FTGLフォルダと
  • Includeフリータイプ ライブラリのフォルダの内容

MinGWディレクトリのincludeフォルダに。

freetype2 ( と があり、freetype.libプロジェクトのプロパティにリンクするかどうかは不明) と ftgl ( 、、) の両方の lib ファイルを、MinGW ディレクトリの対応する lib フォルダーに入れます。freetype248_D.libfreetype-bcc.libftgl.dllftgl_D.libftgl_static_D.lib

エラーがあり、Open Declaration オプションを使用している行をクリックすると、Eclipse によって、定義済みのFTTextureFontヘッダー ファイルとFTTextureFont(char const*)定義済みのMakeGlyph関数が表示されます。

詳細を確認したい場合、またはリファレンスとして、GetRandomGame プロジェクト ページで完全なコードを見つけることができます。

コンパイラ版はこちら

Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=c:/mingw/bin/../libexec/gcc/mingw32/4.6.1/lto-wrapper.exe
Target: mingw32
Configured with: ../gcc-4.6.1/configure --enable-languages=c,c++,fortran,objc,ob
j-c++ --disable-sjlj-exceptions --with-dwarf2 --enable-shared --enable-libgomp -
-disable-win32-registry --enable-libstdcxx-debug --enable-version-specific-runti
me-libs --build=mingw32 --prefix=/mingw
Thread model: win32
gcc version 4.6.1 (GCC)

編集

同様の質問: FTGL 未定義の参照はすべてありますか? 、しかし、その質問の答えは私の問題を解決しません.私はまだこれらの2つのエラーを受け取ります.


編集2

最初に FTGL を使用しようとしたとき、MSVC を使用してコンパイルしていましたが、2 つのエラーが発生しました。

最後に code::block を使用して、両方のライブラリで提供される MSVC プロジェクトをインポートしました。2 つのエラーのうちの 1 つが解決されました。しかし、私はまだこれを持っています:

The type 'FTTextureFont' must implement the inherited pure virtual method 'FTFont::MakeGlyph'

編集3

freetype 2.3.4 で FTGL 2.1.2 をコンパイルしようとしましたが、問題は解決しませんでした。freetype 2.3.4でFTGL 2.1.3 rc5を試しましたが、同じです。念のため、freetype 2.3.5 と 2.4.8 も試しました (最初は既に 2.4.8 でした)。

コードをヘッダー ファイルに移動しようとしましたMakeGlyphが、問題は解決しませんでした。

ここに私が見つけた便利なリンクがいくつかありますが、まだ問題を解決していません。


編集4

リンカーフラグを削除するftglと、コンパイラはこれについて不平を言います:

undefined reference to FTPixmapFont::FTPixmapFont(char const*)'
collect2: ld returned 1 exit status
Build error occurred, build is stopped

そして、まだ純粋仮想メソッドMakeGlyphエラーが発生します。

リンカー フラグを使用すると、 「継承された Pure Virtual メソッド MakeGlyph を実装する必要があります」ftglというエラーのみが表示されます。コンパイラはプロジェクトを正常にビルドします (ただし、起動時にクラッシュします)。

-lmingw32 -lSDLmain -lSDL -lSDL_image -lSDL_net -lSDL_ttf -lfreetype -lftgl -lopengl32 -lglu32
Build complete for project GetRandomGame

FTPixmapFont.cppしたがって、純粋仮想メソッドを定義する必要があるため、FTGL lib が正しくコンパイルされていないと考えていMakeGlyphます。私はC ++でこれらすべてのlibのことを初めて知り、libの構築に何か間違ったことをしている可能性があります。


編集5

ファイルが必要な例を読んで見たので、FTGLに付属するconfig.h適切に構成されたファイルを追加しました。config.h

ftgl次に、ディレクトリで提供されている例で次のコードを見つけ、それをFontクラスに追加しました。

class FTHaloFont : public FTFont
{
    public:
        FTHaloFont(char const *fontFilePath) : FTFont(fontFilePath) {}

    protected:
        virtual FTGlyph* MakeGlyph(FT_GlyphSlot slot)
        {
            return new FTHaloGlyph(slot);
        }
};

そこに定義しMakeGlyphても、Eclipse は実装されていない純粋仮想メソッドについて文句を言いFTFont::MakeGlyphます。


編集6

gdb を使用してコマンド ラインからデバッグを試みましたが、freetype6.dll が見つからないことがわかりました。私は今、解決策を見つけようとしています。

4

3 に答える 3

1

編集6

gdbを使用してコマンド ラインからデバッグを試みましたfreetype6.dllが、見つからないことがわかりました。

freetype6.dll実行可能ファイルのほかにdebugフォルダーに配置しましたが、機能しました。

これらは、私を遅らせたり、解決策を探しているときに学んだことです:

  • 私が使用しているのと同じコンパイラでコンパイルする
  • code::block を使用して Visual Studio プロジェクトをインポートする方法を学ぶ
  • 実際に code::block 内のライブラリを警告なしでコンパイルできる
  • エラーの解決と問題の発見に役立つように、リンカー フラグをいじる (1 つ削除して何が起こっているかを確認する)
  • 必要なファイルを見つけるために提供された例を読むことを学ぶ
  • コマンドラインから gdb を使用する

プロジェクトの一部のファイルの名前を変更しているときに別の問題が発生し、Eclipse でプロジェクト全体を再構成する必要がありました (文字通りすべてのファイルを削除し、SVN を再度チェックアウトしました)。その後、純粋な仮想エラーは消えていました! そのため、プロジェクトをデバッグしようとしたところ、次のエラーが発生しました。

gdb: unknown target exception 0xc0000135 at 0x7724f52f

Eclipse はあまり役に立たなかったので、コマンド ライン デバッガーを試してみたところ、freetype6.dll が見つからないことがわかりました。それだけでした!

于 2012-02-27T07:31:35.293 に答える
1

間違ったクラスを使用しています。

使用する正しいクラスは FTGLPixmapFont です。

#include <SDL/SDL.h>
#include <GL/glew.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <common/timer.h>
#include <common/keyboard.h>
#include <FTGL/FTGL.h>
#include <FTGL/FTGLPixmapFont.h>
#include <wchar.h>
#include <math.h>

using Keyboard::keyPressed;

static Timer timer;
static int scrWidth = 640;
static int scrHeight = 480;

int main(int argc, char** argv){
    SDL_Init(SDL_INIT_VIDEO);

    SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
    SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
    SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
    SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, 0);

    Keyboard::init();
    timer.reset();
    timer.setMaxFps(100);
    timer.setMinFps(5);

    if (SDL_SetVideoMode(scrWidth, scrHeight, 32, SDL_OPENGL) == 0){
        fprintf(stderr, "couldn't set mode %dx%d!\n", 640, 480);
        SDL_Quit();
        return -1;
    }
    glewInit();

    FTGLPixmapFont font("DejaVuSans.ttf");
    font.CharMap(ft_encoding_unicode);
    font.FaceSize(10);
    SDL_ShowCursor(SDL_DISABLE);

    glClearColor(0.2, 0.2, 0.2, 0.2);
    glClearDepth(1.0);

    glEnable(GL_DEPTH_TEST);

    bool running = true;
    while (running){
        SDL_Event event;
        if (SDL_PollEvent(&event)){
            switch(event.type){
                case SDL_QUIT:
                    running = false;
                    break;
            };
        }
        timer.update();
        Keyboard::update();

        if (keyPressed(SDLK_ESCAPE))
            running = false;

        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluOrtho2D(-scrWidth/2.0f, scrWidth/2.0f, scrHeight/2.0f, -scrHeight/2.0f);

        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();

        glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

        glDisable(GL_DEPTH_TEST);
        wchar_t buf[256];
        swprintf(buf, 256, L"fps: %0.2f", timer.getFps());
        glRasterPos2i(10-scrWidth/2, 20-scrHeight/2);
        font.Render(buf);

        glFlush();
        SDL_GL_SwapBuffers();       
    }   

    SDL_Quit();
    return 0;
}

また、チュートリアルをお読みください。


私のソースコードから判断すると、私が使用しているバージョンは 2.1.2 です (2.1.3 は「安定版」ではない「リリース候補」である rc5 であるため)。2.1.3 - rc5 を使用しようとしているようです。2.1.2 にダウングレードして、再試行してください。また、次回このような問題が発生した場合は、使用しているライブラリのバージョンを忘れずに伝えてください。

あるいは、FTGL の修正を試みることもできます (これは苦痛であり、プロジェクトは放棄されたようです)。または、独自の freetype2 ベースのフォント レンダラーを作成することもできます (これも苦痛ですが、長期的には報われる可能性があります)。

于 2012-02-21T11:40:27.793 に答える
1

コンパイラは、メソッドが書かれていないことを伝えてFTTextureFont::MakeGlyphいます。

次のいずれかを行う必要があります。

  1. メソッドを継承しFTTextureFontて記述しMakeGlyphます。
  2. FTTextureFontあなたが望むことをする子クラスを見つけてください。

FTGL docs によると、FTFont(FTTextureFont親として持っている) から派生したクラスは を実装する必要がありますMakeGlyph

ネットでコードを探して、私があなただった他の人が何をしたかを確認します。

于 2012-02-21T11:33:30.297 に答える