JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

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

LPDIRECT3DSURFACE9 ...why?

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



Anmeldedatum: 21.07.2002
Beiträge: 1427
Wohnort: World
Medaillen: Keine

BeitragVerfasst am: 02.10.2004, 13:28    Titel: LPDIRECT3DSURFACE9 ...why? Antworten mit Zitat

Hi!

Ich habe diese Funktion hier, die mir einfach ne Grafik in eine Surface lädt..

Code:
void Graphics::LoadImageFileInSurface(LPDIRECT3DSURFACE9 _surface, D3DXIMAGE_INFO* _info,
                              LPCSTR _imagefile_name)
   {
      ETS.error_msg() << "Start of LoadImageFileInSurface\n";
      // Infos über die Grafik holen
      D3DXGetImageInfoFromFile(_imagefile_name,_info);
      ETS.error_msg() << "imagefile_name: " << _imagefile_name << "   " \
                  << _info->Width << " * " << _info->Height << "\n";
      ETS.error_msg() << _surface << "\n";
      // Surface für die Grafik anlegen
      lpD3DDevice->CreateOffscreenPlainSurface(
                                        _info->Width,      // Breite
                                        _info->Height,      // Höhe
                                        D3DFMT_A8R8G8B8,   // Farbformat
                                        D3DPOOL_DEFAULT,   // Pool
                                        &_surface,         // Surface
                                        0);               // noch nicht von DX verwendeter Paramter

      ETS.error_msg() << _surface << "\n";

      // In die erstellte Surface die Grafik laden
      D3DXLoadSurfaceFromFile(_surface,      // Surface
                            NULL,            // Palette, wenn man <256 Farben verwendet [PALETTEENTRY]
                            NULL,            // Rechteck auf die Surface
                            _imagefile_name,   // filename der Grafik
                            NULL,            // Rechteck in der Grafik
                            D3DX_FILTER_NONE,   // Filter
                            0,               // Colorkey, ersetzt die Pixelfarbe durch Schwarz
                            NULL);            // [D3DXIMAGE_INFO], haben wir schon abgefragt..
      ETS.error_msg() << _surface << "\n";

      ETS.error_msg() << "End of LoadImageFileInSurface\n";
   }


Warum geht das nur so:
Code:
void Graphics::LoadImageFileInSurface(LPDIRECT3DSURFACE9 *_surface, D3DXIMAGE_INFO* _info,
                              LPCSTR _imagefile_name)
   {
      ETS.error_msg() << "Start of LoadImageFileInSurface\n";
      // Infos über die Grafik holen
      D3DXGetImageInfoFromFile(_imagefile_name,_info);
      ETS.error_msg() << "imagefile_name: " << _imagefile_name << "   " \
                  << _info->Width << " * " << _info->Height << "\n";
      ETS.error_msg() << *_surface << "\n";
      // Surface für die Grafik anlegen
      lpD3DDevice->CreateOffscreenPlainSurface(
                                        _info->Width,      // Breite
                                        _info->Height,      // Höhe
                                        D3DFMT_A8R8G8B8,   // Farbformat
                                        D3DPOOL_DEFAULT,   // Pool
                                        _surface,         // Surface
                                        0);               // noch nicht von DX verwendeter Paramter

      ETS.error_msg() << *_surface << "\n";

      // In die erstellte Surface die Grafik laden
      D3DXLoadSurfaceFromFile(*_surface,      // Surface
                            NULL,            // Palette, wenn man <256 Farben verwendet [PALETTEENTRY]
                            NULL,            // Rechteck auf die Surface
                            _imagefile_name,   // filename der Grafik
                            NULL,            // Rechteck in der Grafik
                            D3DX_FILTER_NONE,   // Filter
                            0,               // Colorkey, ersetzt die Pixelfarbe durch Schwarz
                            NULL);            // [D3DXIMAGE_INFO], haben wir schon abgefragt..
      ETS.error_msg() << *_surface << "\n";

      ETS.error_msg() << "End of LoadImageFileInSurface\n";
   }


Wenn ich die erste Variante benutze und die Funktion geendet hat, ist die übergebene Surface Variable wieder NULL bei der zweiten Variante nicht...warum?
_________________
The source of all power is in its destiny...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 02.10.2004, 13:40    Titel: Antworten mit Zitat

Weil du das Surface normal übergibst:
Code:
void Graphics::LoadImageFileInSurface(LPDIRECT3DSURFACE9 _surface, D3DXIMAGE_INFO* _info, LPCSTR _imagefile_name)


So wird beim Übergeben eine Kopie erstellt und nach der Funktion wieder verworfen(wie bei einer lokalen Variablen). Wenn du einen Zeiger übergibst, wird das an der Adresse bereits bestehende Surface modifiziert. Du übergibst ja nur die Adresse.

Aber was ist denn das Problem bei der zweiten Variante? Alternativ kannst du natürlich auch eine Referenz verwenden. Da ändert sich AFAIK zum normalen von der Verwendung/Syntax sonst kaum etwas Wink
_________________
www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console


Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
TheMillenium
Dark JLI'ler



Anmeldedatum: 21.07.2002
Beiträge: 1427
Wohnort: World
Medaillen: Keine

BeitragVerfasst am: 02.10.2004, 14:16    Titel: Antworten mit Zitat

Ich dachte weil ich ja LPDIRECT3DSURFACE9 nehme und nicht IDirect3DSurface9....LP ist doch diese windows ungarische Notation die eigentlich sagt, dass das schon ein Zeiger ist...?
_________________
The source of all power is in its destiny...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 02.10.2004, 20:26    Titel: Antworten mit Zitat

Ach so...

Hmm...so wie du das beschreibst, könnte es ja sein, dass das keine wirklichen Zeiger sind. Vielleicht wird da auch nicht nur der Zeiger, sondern auch die Daten im RAM kopiert
_________________
www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console


Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht 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