Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

23.06.2009, 20:23

Problem mit tbFont

Hey Spieleprogrammierer

Ich habe vor kurzem mal angefangen mich etwas mehr mit der Schrift in der TriBase Eingine zu beschäftigen. Ich bin auf folgendes Problem gestoßen:
wenn ich dass Compiliere

C-/C++-Quelltext

1
2
3
4
g_pFont1->Begin();
    g_pFont1->Init("Data\\Courier New_9_18.tga", "Data\\Courier New_9_18.tbf");
    g_pFont1->DrawTextW(tbVector2(10.0f,10.0f),"Hallo Welt",0,-1,tbColor(1.0f,1.0f,1.0f),tbColor(1.0f,1.0f,1.0f),tbVector2(10.0f,10.0f),2,0,-5,25,0);
    g_pFont1->End();

kommt der Fehler:
[list]Tutorials.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""__declspec(dllimport) public: enum tbResult __thiscall tbFont::DrawTextW(class tbVector2,char const *,unsigned long,int,class tbColor const &,class tbColor &,class tbVector2,float,float,float,float,float)" (__imp_?DrawTextW@tbFont@@QAE?AW4tbResult@@VtbVector2@@PBDKHABVtbColor@@AAV4@0MMMMM@Z)" in Funktion ""enum tbResult __cdecl Render(float)" (?Render@@YA?AW4tbResult@@M@Z)".
F:\Programme\Microsoft Visual Studio C++ 2008\Projekte\TutorialsWin32\Debug\TutorialsWin32.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise.[/list]Die Lib hab ich alle gelinkt:
tribased.lib d3d9.lib d3dx9d.lib dxerr9.lib kernel32.lib user32.lib gdi32.lib winspool.lib comctl32.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib

Könnt ihr mir da Weiterhelfen?

mfg

Fabian
Metal ist keine Musik sondern eine Religion.

2

23.06.2009, 21:18

schnelle Lösung: schreib #undef DrawText an den Anfang von tbFont.h (nach den includes, vor der klasse), und, wenns dann ncoh ärger gibt, nochmal vor deiner verwendung von tbFont::DrawText.

lange Erklärung: Windows verwendet Makros (die sämtliche scopes ignorieren) damit ein programmierer, abhängig von der definition von UNICODE, mit demseblen Funktionsnamen der win32API (z.B. DrawText) einmal die Unicode Version (DrawTextW) und einmal die ANSI Version (DrawTextA) aufrufen können. sprich, in irgendnem Windows-header steht sowas:

C-/C++-Quelltext

1
2
3
4
5
#ifdef UNICODE
#define DrawText DrawTextW
#else
#define DrawText DrawTextA
#endif

und da Makros bekanntlich scopes ignorieren, macht das auch aus tbFont::DrawText tbFont::DrawTextW, in der triBase.dll heißt die Funktion dann natürlich aber entweder DrawText (wenn David das irgendwie durch include reihenfolge bzw. undef beim Engine Build umgangen hat) oder DrawTextA (kompolierung mit Windows-Makros, aber ohne UNICODE), aber eben nciht DrawTextW, sodass der Linker die Funktion nciht findet.

3

23.06.2009, 21:27

Ich hab jetzt an beiden Stellen

C-/C++-Quelltext

1
#undef DrawText

angegeben und jetzt kommt der Fehler:
[list]f:\programme\microsoft visual studio c++ 2008\projekte\tutorialswin32\tutorialswin32\tutorials.cpp(44) : error C2039: 'DrawTextW': Ist kein Element von 'tbFont'
f:\programme\tribase engine\include\tbfont.h(67): Siehe Deklaration von 'tbFont'[/list]
Metal ist keine Musik sondern eine Religion.

4

23.06.2009, 21:54

Schon mal mit DrawText ohne "W" probiert?
In der Tribase gibt es meines Wissens nur diese Variante.
fka tm

5

24.06.2009, 13:49

Jâ schon. aber wenn ich es ohne W schreibe muss ich die gleichen Parameter eingeben. Und wenn ich zu beispiel

C-/C++-Quelltext

1
g_pFont->
schreibe kommt ja dieses auswahlmenü und in diesem Auswahlmenü gibt es nur die Variante

C-/C++-Quelltext

1
g_pFont->DarwTextW(...)
Metal ist keine Musik sondern eine Religion.

6

24.06.2009, 14:45

Diese Infos holt IntelliSense aus der winuser.h mit gleichnamigen Funktionen.
Anders bei DrawTransformedText. Da erkennt IntelliSense wiederum, dass die Funktion aus der Tribase stammt.

Warum nimmst du nicht einfach das Texte-Beispiel aus'm Buch?
Ist z.B. wohl nicht im Sinne des Erfinders, die Init-Methode zwischen Font->Begin und Font->End aufzurufen...
fka tm

7

24.06.2009, 20:23

wenn ich jetzt den Beispielcode aus dem Buch kompiliere(ohne etwas verändert zu haben) funktioniert es. Aber wenn ich etwas lösche und dann wieder Rückgängig mache kommt wieder der Fehler:

Tutorials.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""__declspec(dllimport) public: enum tbResult __thiscall tbFont::DrawText(class tbVector2,char const *,unsigned long,int,class tbColor const &,class tbColor &,class tbVector2,float,float,float,float,float)" (__imp_?DrawTextW@tbFont@@QAE?AW4tbResult@@VtbVector2@@PBDKHABVtbColor@@AAV4@0MMMMM@Z)" in Funktion ""enum tbResult __cdecl Render(float)" (?Render@@YA?AW4tbResult@@M@Z)".
F:\Programme\Microsoft Visual Studio C++ 2008\Projekte\TutorialsWin32\Debug\TutorialsWin32.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise.
Metal ist keine Musik sondern eine Religion.

8

21.11.2009, 20:48

Hey ich grab mal den alten Thread hier wieder aus. Wenn ich jetzt schreibe:

C-/C++-Quelltext

1
2
3
4
5
6
Font = new tbFont;
Font->Init("Data\\Intro.tga","Data\\Intro.tbf");
...
Font->Begin();
Font->DrawText(tbVector2(10.0f,0.0f),"S = Showdown");
Font->End();


kommt der Fehler:

Quellcode

1
2
Showdown.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""__declspec(dllimport) public: enum tbResult __thiscall tbFont::DrawText(class tbVector2,char const *,unsigned long,int,class tbColor const &,class tbColor &,class tbVector2,float,float,float,float,float)" (__imp_?DrawText@tbFont@@QAE?AW4tbResult@@VtbVector2@@PBDKHABVtbColor@@AAV4@0MMMMM@Z)".
F:\Programme\Microsoft Visual Studio C++ 2008\Projekte\shoot\Release\Test.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise.

kann mir da jemand weiterhelfen?

mfg
Metal ist keine Musik sondern eine Religion.

Werbeanzeige