VC++ 2008 Express
Debug funktioniert auf meinem PC. Auf einem anderen hingegen werden nicht alle Buchstaben ausgegeben (Bitmapfont).
Release lässt sich nicht kompiliieren, die folgende Fehlermeldung (gleich mehrfach) tritt auf:
'const char [11]' kann nicht in 'LPCWSTR' konvertiert werden
Ich habe zugegebenermaßen noch nicht probiert zu casten. Aber selbst wenn das gehen wird, wüsste ich gerne, warum sich etwas im Debug kompiliieren lässt und im Release nicht.
Debug geht, Release nicht.
Re: Debug geht, Release nicht.
Du musst in deinen Projekteinstellungen Dich fuer entweder das "Unicode Character Set" oder "Multibyte Character Set" entscheiden und das entsprechende in deinem Code benutzen. Vergleiche notfalls einfach mal die "Character Set"-Einstellung von deiner Debug- und Release-Version.
Re: Debug geht, Release nicht.
ok danke, das wars. Hätte nicht gedacht, dass es für debug und release unterschiedliche einstellungen gibt...
Das Problem mit der nur teilweise richtig angezeigten Bitmapfont besteht aber weiterhin...
Während auf meinem eigenen Rechner alles korrekt angezeigt wird, steht auf dem anderen z.B. statt "Auflösung" "A-f-----g
Das Problem mit der nur teilweise richtig angezeigten Bitmapfont besteht aber weiterhin...
Während auf meinem eigenen Rechner alles korrekt angezeigt wird, steht auf dem anderen z.B. statt "Auflösung" "A-f-----g
Re: Debug geht, Release nicht.
Wie und wann genau erstellst Du den Bitmap-Font? Wie genau benutzt Du ihn? Was sind die Unterschiede zwischen den beiden Rechnern?
Re: Debug geht, Release nicht.
Ich erstelle den Bitmap-Font aus einem TGA File(länglich, 4932 x 42) während der Initialisierung des Programms. Gerendert werden dann halt ensprechend des chars verschiedene Teile der Textur.
Der PC auf dem das Programmiert wurde und es funktioniert hat einen AMD Sempron Prozessero 3400+ und eine NVIDIA GEFORCE 6200, der auf dem es nicht funktioniert hat einen Intel Pentium 4 Prozessor mit 3 GHz und eine ATI 9000
Wenn ein Schreibaufruf getätigt wird, werden die enstprechenden Daten in einem statischen Array gespeichert um dann am Ende der Zeichenvorgänge zusammen gezeichnet zu werden.(Um Grafikfehler zu vermeiden)
Der Zeichencode selbst sieht so aus:
Der PC auf dem das Programmiert wurde und es funktioniert hat einen AMD Sempron Prozessero 3400+ und eine NVIDIA GEFORCE 6200, der auf dem es nicht funktioniert hat einen Intel Pentium 4 Prozessor mit 3 GHz und eine ATI 9000
Wenn ein Schreibaufruf getätigt wird, werden die enstprechenden Daten in einem statischen Array gespeichert um dann am Ende der Zeichenvorgänge zusammen gezeichnet zu werden.(Um Grafikfehler zu vermeiden)
Der Zeichencode selbst sieht so aus:
Code: Alles auswählen
P12RPTO_DrawInfo* pTemDrawInfo=NULL; //Variablen hier definieren, um sie nicht in der Schleife dauernd neu zu definieren..
D3DXMATRIX mat;
D3DXVECTOR2 pos;
RECT rect;
rect.bottom=info.Height; //gilt für die gesamte klasse... die bitmapfont ist recht länglich :D
rect.top=0;
unsigned int character;
D3DXVECTOR3 xyZpos(0,0,0);
D3DMATERIAL9 material = {0};
char *buffer=NULL; //Dies, sowie das spätere "CharToOemA" ist nötig, weil meine Bitmapfont nicht ANSI code sondern eben OEM code ist..
pSprite->Begin(D3DXSPRITE_SORT_DEPTH_FRONTTOBACK|D3DXSPRITE_ALPHABLEND); //GO on! :P
for(int i=drawInfo.size();i>0;i--) //Sooft, wie es Schreibbefehle gibt...,
{ //erstmal lokale variablen schaffen, um die orginale nicht verändern zu müssen, etc...
pTemDrawInfo=&drawInfo.back();
pos.x=pTemDrawInfo->pos.x;
pos.y=pTemDrawInfo->pos.y;
xyZpos.z=pTemDrawInfo->pos.z;
buffer=new char[pTemDrawInfo->text.size()]; //Jaja, ein Puffer, der zur Konvertierung von Ansi zu OEM leider nötig war, ich wollte ihn ja ganz brav mit delete[] aufräumen, aber dann ist das Programm abgestürzt... >_>
CharToOemA(pTemDrawInfo->text.c_str(),strcpy(buffer,pTemDrawInfo->text.c_str())); //Die erwähnte Konvertierung..
for(unsigned int j=0;j<pTemDrawInfo->text.size();j++) //Sooft, wie die Anzahl der Zeichen im String
{
character=(unsigned int)unsigned char(buffer[j]); //Man will ja nicht jedesmal konvertieren müssen, also macht mans hier einmal...(von char in int)
if(buffer[j]=='\n') //Der Zeilenumbruch muss natürlich auch definiert sein...
{
pos.y+=pTemDrawInfo->sizeMod.y*info.Height;
pos.x=pTemDrawInfo->pos.x;
continue;
}
rect.left=long((float)character*((float)info.Width/256.0f)); //Verschiedene Buchstaben, also verschiedene Ausschnitte der Bitmapfont.... (Jedesmal alle Zeichen zu schreiben, wäre keine echte Lösung)
rect.right=long((float)(character+1)*((float)info.Width/256.0f));
D3DXMatrixTransformation2D(&mat,NULL,0,&pTemDrawInfo->sizeMod,NULL,0,&pos); //Skalierung
pSprite->SetTransform(&mat);
pSprite->Draw(pTexture,&rect,NULL,&xyZpos,pTemDrawInfo->color); //Der Zeichenvorgang selbst
pos.x+=pTemDrawInfo->sizeMod.x*info.Width/256.0f; //Und nun gehen wir einen Platz, weiter um den nächsten Buchstaben nicht über den letzten zu zeichnen oO
}
drawInfo.pop_back(); //Die Informationen wurden jetzt übergebn und können entfernt werden...
}
pSprite->End(); //Ja, endlich fertig...
Re: Debug geht, Release nicht.
Na wie kommst du denn auf ne Bildgröße von 4932 x 42? Zum einen mögen viele Grafikkarten nur Texturgrößen kleiner als der Bildschirm, zum anderen hast du durch ne längliche Textur ne Menge Cachmisses.
Textur also schön quadratisch machen ;)
Ciao
Textur also schön quadratisch machen ;)
Ciao
Re: Debug geht, Release nicht.
Hmm... nagut, werd ich wohl ändern müssen...
Fand ne längliche Textur am einfachsten..
Fand ne längliche Textur am einfachsten..