|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
VerruecktesHuhn Super JLI'ler
Anmeldedatum: 30.07.2002 Beiträge: 492 Wohnort: Stuttgart Medaillen: Keine
|
Verfasst am: 27.07.2004, 16:32 Titel: Mit ID3DXSprite Bilder darstellen. |
|
|
Hi!
Ich hab mit dem Thema ein Problem:
Wenn ich ein Bild mit der selben Größe wie der Auflösung meines Bildschirms darstelle und dafür die Position (0,0) und den Skalierungsvektor (1,1) verwende, dann erscheint das bild zu groß und manche Teile sind nicht zu sehen.
Auch andere Bilder sind denke ich zu groß dargestellt.
Weiß jemand was man machen muss um die Bilder in korrekter größe zu sehen? |
|
Nach oben |
|
|
Beni5 Super JLI'ler
Alter: 36 Anmeldedatum: 12.11.2003 Beiträge: 310 Wohnort: Switzerland Medaillen: Keine
|
Verfasst am: 27.07.2004, 17:43 Titel: |
|
|
Vielleicht ist dein BackBuffer grösser als das Fenster. (Beachte das ein Fenster auch Ränder hat.) |
|
Nach oben |
|
|
VerruecktesHuhn Super JLI'ler
Anmeldedatum: 30.07.2002 Beiträge: 492 Wohnort: Stuttgart Medaillen: Keine
|
Verfasst am: 27.07.2004, 20:23 Titel: |
|
|
Hab vergessen zu erwähnen, dass das alles im Fullscreenmodus abläuft. Der Backbuffer ist genauso groß wie der Bildschirm. |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 27.07.2004, 20:35 Titel: |
|
|
Wie hast du die Textur geladen? mit oder ohne "Ex"? Bei ohne wird die TExtur angepasst, z. B. auf 128x128 oder 256x256. Dabei kann die leicht größer werden. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
KI JLI Master
Alter: 39 Anmeldedatum: 04.07.2003 Beiträge: 965 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 27.07.2004, 20:52 Titel: |
|
|
Ich mag ID3DXSprite nicht sonderlich!
Deine Probleme kommen mir irgendwie bekannt vor?
@VerruecktesHuhn
Schau mal hier->
Dissecting Sprites in Direct3D |
|
Nach oben |
|
|
VerruecktesHuhn Super JLI'ler
Anmeldedatum: 30.07.2002 Beiträge: 492 Wohnort: Stuttgart Medaillen: Keine
|
Verfasst am: 28.07.2004, 11:05 Titel: |
|
|
Ich hab jetzt auf "D3DXCreateTextureFromFileEx()" gewechselt und es klappt. Danke!
Ich hab allerdings ein weiteres Problem, welches im Zusammenhang mit meiner GUI Implementierung auftrat:
Mein Fenster wird nicht richtig angezeigt, d.h. Teile meines Fensters sind Weis (die Farbe mit der ich den Backbuffer immer überschreibe).
Ich erklär mal wie ich mein Fenster darstelle und vieleicht fällt jemandem von euch was ein.
Ich verwende zum darstellen meines Fensters eine Bitmap. In ihr ist das Aussehen des Rahmens und des Hintergrundes festgelegt.
Meine Anwendung teilt nun diese Bitmap in 9 Sprites auf: 8 für den Rahmen (4 Ecken und 4 Kanten) und 1 für den Hintergrund.
Um das Fenster auf die gewünschte Größe zu bringen skaliere ich nur die Kanten und die auch nur in ihre jeweilige Richtung. Die obere und untere Kante skalier ich also auf der X-Achse (da horizontal) um den Faktor BreiteDesFensters/BreiteDerBitmap. Die Vertikalen um den Faktor HöheDesFensters/HöheDerBitmap. Die Positionen werden ebenfalls noch angepasst. Die Source Rects bleiben immer gleich.
Nun das Problem:
Wenn ich das Fenster so darstelle, dann sehe ich 2 weiße Balken über meinem Fenster: Ein Vertikaler der nicht weit enfernt vom rechten Fensterrand auftaucht und ein Horizontaler, der nicht weit entfernt vom unteren Fensterrand auftaucht. Auch werden die linke und rechte untere Ecke und die untere Kante nicht angezeigt.
Wer sich das selber angucken will meldet sich einfach bei mir und bekommt die Datei (625 Kb) mit dem Programm, den nötigen DLLs (außer FMod, bekommt ihr aber auch auf anfrage) und einer Vorgefertigten Windowframe Bitmap zugeschickt. |
|
Nach oben |
|
|
VerruecktesHuhn Super JLI'ler
Anmeldedatum: 30.07.2002 Beiträge: 492 Wohnort: Stuttgart Medaillen: Keine
|
Verfasst am: 29.07.2004, 12:00 Titel: |
|
|
Hi!
Also ich hab das Problem nun ENDLICH gelößt. Es lag an der Skalierung der einzelnen teile, dadurch das zwar die Positionen der Rechtecke stimmten, aber die Skalierung der Nachbarrechtecke zu klein war, kam es zu lücken, also den weisen Balken. Ich hab nun folgenden Faktor verwendet:
für die horizontalen Kanten:
BreiteDesClientBereichsInPixeln / BreiteDesSourceRectsDieserKanteInPixeln.
für die vertikalen dann die Höhen.
Mir ist aber noch ein anderes Problem aufgefallen: Für die untere Kante und die unteren Ecken werden nicht die gewünschten Bildteile verwendet sondern welche darüber, sodass es aussieht als würden der Background und die vertikalen Kanten verlängert. Die Koordinaten der Source-Rects und ihre Größe stimmen aber... |
|
Nach oben |
|
|
VerruecktesHuhn Super JLI'ler
Anmeldedatum: 30.07.2002 Beiträge: 492 Wohnort: Stuttgart Medaillen: Keine
|
Verfasst am: 07.08.2004, 15:07 Titel: |
|
|
Hi!
Ich muss meinem oberen Post etwas korigieren, es sollen eigentlich die richtigen Teile genommen werden, aber das Problem liegt daran, das irgendwie nicht das gesamte Bild geladen (angezeigt?) wird, sondern das fast ein drittel von unten einfach weggelassen wird und der Rest nach unten verzerrt wird, sodass die gewünschte Größe angezeigt wird.
Hier der Code zum Laden der Texture:
Code: |
// load a texture resource:
static WORD Load_Tex( std::string Path )
{
// local variables:
GFXD3D_TEXTURE l_Tex;
// load texture:
if( FAILED( D3DXCreateTextureFromFile( g_Device,
Path.c_str(),
&l_Tex.m_Texture ) ) )
{
return WORD_ERROR;
}
g_Texs.push_back( l_Tex );
return (g_Texs.size()-1);
}
|
Wobei "l_Tex.m_Texture" vom Typ "LPDIRECT3DTEXTURE9" íst.
Es bringt auch keinen Unterschied wenn ich das per "D3DXCreateTextureFromFileEx" lade und "D3DX_DEFAULT" Werte verwende.
Angezeigt wird die Textur über:
Code: |
SIM_API void GFXD3D_DrawImage( WORD TextureID,
MATH2D_POINT Position,
MATH2D_POINT Scalation,
MATH2D_POINT RotCentre,
float Rotation,
float src_x,
float src_y,
float src_w,
float src_h,
GFX_COLOUR Colour )
{
// local variables:
HRESULT l_Result;
WORD l_Tex = SYSMEM_GetResource( TextureID, g_TexResFieldID );
RECT l_Src;
D3DXVECTOR2 l_Scaling = D3DXVECTOR2( Scalation.x, Scalation.y ),
l_RotCentre = D3DXVECTOR2( RotCentre.x, RotCentre.y ),
l_Translation = D3DXVECTOR2( Position.x, Position.y );
if( (l_Tex == WORD_ERROR) || (l_Tex > g_Texs.size()) )
{
return;
}
// the whole image:
if( (src_w == -1.0f) && (src_h == -1.0f) )
{
// draw it:
l_Result = g_Sprite->Draw( g_Texs[l_Tex].m_Texture,
NULL,
&l_Scaling,
&l_RotCentre,
Rotation,
&l_Translation,
D3DCOLOR_ARGB( Colour.a, Colour.r, Colour.g, Colour.b ) );
return;
}
l_Src.left = src_x;
l_Src.right = src_x + src_w;
l_Src.top = src_y;
l_Src.bottom = src_y + src_h;
// draw it:
l_Result = g_Sprite->Draw( g_Texs[l_Tex].m_Texture,
&l_Src,
&l_Scaling,
&l_RotCentre,
Rotation,
&l_Translation,
D3DCOLOR_ARGB( Colour.a, Colour.r, Colour.g, Colour.b ) );
}
|
Die Variable "l_Tex" beinhaltet den Index der gewünschten Textur in den globalen Vektor. "g_Texs[l_Tex].m_Texture" ist daher das Objekt der gewünschten Textur.
An der Skalierung kann es nicht liegen, denn wenn ich das Bild (aus dem ich den Fensterrahmen lese) als einfachen Sprite anzeige und die Skalierung (1.0f, 1.0f) verwende (und ein Source Rect mit den Werten -1.0f) dann kommt das selbe Problem.
Hoffentlich fällt jemandem von euch auf, was ich falsch mache. Alle Objekte sind korrekt erzeugt worden.
Übrigens: Der Rückgabewert von "g_Sprite->Draw" ist S_OK. |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|