JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

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

Ich dreh langsam am Rad!!!!

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



Anmeldedatum: 20.07.2002
Beiträge: 173
Wohnort: Münster / NRW
Medaillen: Keine

BeitragVerfasst am: 01.08.2002, 10:42    Titel: Ich dreh langsam am Rad!!!! Antworten mit Zitat

Ich wollte auch mal probieren, so eine Farbvertauschfunktion zu schreiben aber ich scheitere am Surfacelock! So unglaublich es klingt. Wenn ich der DDSURFACEDESC2 die ich ja zum locken brauche, den Parameter dwSize auf die richtige Größe setze, geht gar nix mehr! Codeausschnitt:

Code:

void ChangeColor(LPDIRECTDRAWSURFACE7 lpS, int ZuErsetzen, int ErsatzFarbe)
{
DDSURFACEDESC2 SurfaceDesc;
int Ft = 32; // Farbtiefe
int iPitch = Ft / 8; // Pitch = Bytes / Pixel

ZeroMemory(&SurfaceDesc, sizeof(SurfaceDesc)); // Hier ist irgendwo
SurfaceDesc.dwSize = sizeof(DDSURFACEDESC2);   // ein Fehler drin!!!!
lpS->Lock(NULL, &SurfaceDesc, DDLOCK_WAIT, NULL); // Geht nicht mehr, wenn dwSize gesetzt wird!

if(Ft == 16)
{
WORD* wlpSurface = (WORD*)SurfaceDesc.lpSurface;
for(unsigned x = 0; x < SurfaceDesc.dwWidth; x++)
{
for(unsigned y = 0; y < SurfaceDesc.dwHeight; ++)
{
if(wlpSurface[y * iPitch + x] == ZuErsetzen) wlpSurface[y * iPitch + x] = ErsatzFarbe;
}
}
}
else if(Ft == 24 || Ft == 32)
{
DWORD* dwlpSurface = (DWORD*)SurfaceDesc.lpSurface;
for(unsigned x = 0; x < SurfaceDesc.dwWidth; x++)
{
for(unsigned y = 0; y < SurfaceDesc.dwHeight; ++)
{
if(dwlpSurface[y * iPitch + x] == ZuErsetzen) dwlpSurface[y * iPitch + x] = ErsatzFarbe;
}
}
}

lpS->Unlock(r);
}


Wenn ich die Zeile mit dwSize rausnehme geht es zwar, aber die beiden Parameter dwWidth und dwHeight sind 0!! Die Surface ist richtig eingerichtet, das habe ich überprüft. Kann mir einer helfen? Ich dreh langsam durch!
_________________
Es geht auch ohne Wink
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Kampfhund0
Gast








BeitragVerfasst am: 01.08.2002, 11:36    Titel: Antworten mit Zitat

ich weiß nicht genau, aber du musst glaube ich die SurfaceDesc mit lpSurface->GetSurfaceDesc(&desc); erst holen und sie dann der Lock funktion übergeben.

Ansonsten ist ja nur dwSize initialisiert. Der rest also dwWidth usw nicht.

Kampfhund
Nach oben
Michael
JLI'ler



Anmeldedatum: 20.07.2002
Beiträge: 173
Wohnort: Münster / NRW
Medaillen: Keine

BeitragVerfasst am: 01.08.2002, 12:07    Titel: Antworten mit Zitat

Ich habe den Fehler gemeinsam mit Hazel ausgebügelt. Irgendwie habe ich in der Lock-Methoden neben DDLOCK_WAIT noch DDLOCK_SURFACEMEMORYPTR mitverknüpft, das hat dann funktioniert Question
Kann mir irgendjemand noch sagen, warum die Farbe weiß bei einer gelockten Surface manchmal den Wert 16777215 und manchmal den Wert -1 (???) hat bei 32Bit? Oder warum schwarz mal 0 und mal -16777216 ist auch in 32Bit? Hab ich nicht wirklich verstanden
_________________
Es geht auch ohne Wink
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Christian Rousselle
Site Admin


Alter: 47
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 01.08.2002, 12:10    Titel: Antworten mit Zitat

Hau,

also negative Wert sollten da nicht drinstehen, wenn die Farbe mit einem DWORD* ausliest, nimmst du vielleicht manchmal int?

Christian
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
AFE-GmdG
JLI MVP
JLI MVP


Alter: 44
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 01.08.2002, 12:10    Titel: Antworten mit Zitat

Ich weiß nicht genau, aber kann es nicht sein, daß da der Integerüberlauf eine Rolle spielt, im Zusammenhang mit signed/unsigned long?
Bei unsigned long ist Weiß halt 16777215, bei signed -1 oder so. Was anderes würde mir sonst nicht einfallen.
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
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