JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=04ff2e167f9ad58d294c93413e8b893dMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Mit ID3DXSprite Bilder darstellen.

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
VerruecktesHuhn
Super JLI'ler



Anmeldedatum: 30.07.2002
Beiträge: 492
Wohnort: Stuttgart
Medaillen: Keine

BeitragVerfasst am: 27.07.2004, 16:32    Titel: Mit ID3DXSprite Bilder darstellen. Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beni5
Super JLI'ler


Alter: 36
Anmeldedatum: 12.11.2003
Beiträge: 310
Wohnort: Switzerland
Medaillen: Keine

BeitragVerfasst am: 27.07.2004, 17:43    Titel: Antworten mit Zitat

Vielleicht ist dein BackBuffer grösser als das Fenster. (Beachte das ein Fenster auch Ränder hat.)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
VerruecktesHuhn
Super JLI'ler



Anmeldedatum: 30.07.2002
Beiträge: 492
Wohnort: Stuttgart
Medaillen: Keine

BeitragVerfasst am: 27.07.2004, 20:23    Titel: Antworten mit Zitat

Hab vergessen zu erwähnen, dass das alles im Fullscreenmodus abläuft. Der Backbuffer ist genauso groß wie der Bildschirm.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 27.07.2004, 20:35    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
KI
JLI Master


Alter: 39
Anmeldedatum: 04.07.2003
Beiträge: 965
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 27.07.2004, 20:52    Titel: Antworten mit Zitat

Ich mag ID3DXSprite nicht sonderlich!
Deine Probleme kommen mir irgendwie bekannt vor? Rolling Eyes

@VerruecktesHuhn
Schau mal hier->
Dissecting Sprites in Direct3D
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
VerruecktesHuhn
Super JLI'ler



Anmeldedatum: 30.07.2002
Beiträge: 492
Wohnort: Stuttgart
Medaillen: Keine

BeitragVerfasst am: 28.07.2004, 11:05    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
VerruecktesHuhn
Super JLI'ler



Anmeldedatum: 30.07.2002
Beiträge: 492
Wohnort: Stuttgart
Medaillen: Keine

BeitragVerfasst am: 29.07.2004, 12:00    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
VerruecktesHuhn
Super JLI'ler



Anmeldedatum: 30.07.2002
Beiträge: 492
Wohnort: Stuttgart
Medaillen: Keine

BeitragVerfasst am: 07.08.2004, 15:07    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
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

Impressum