JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

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

Auf Surface zeichnen
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
5(0rP
Mini JLI'ler



Anmeldedatum: 30.03.2004
Beiträge: 12

Medaillen: Keine

BeitragVerfasst am: 20.04.2004, 22:25    Titel: Auf Surface zeichnen Antworten mit Zitat

Kann man auf ein Surface zeichnen, nachdem man schon eine Grafik auf das Surface kopiert hat? Ich bekomme immer nur ein weißes Bild oder das Programm stürzt sofort ab ;( .
Wäre auch nett, wenn jemand eine Lösung hat, falls es möglich ist.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 21.04.2004, 10:56    Titel: Antworten mit Zitat

Ja, warum nicht?
Wenn du allerdings pixelweisen Zugriff haben willst, musst du das Surface vorher locken(und hinterher wieder unlocken).

Aber zeig am Besten mal den relevanten Code 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
5(0rP
Mini JLI'ler



Anmeldedatum: 30.03.2004
Beiträge: 12

Medaillen: Keine

BeitragVerfasst am: 21.04.2004, 16:13    Titel: Antworten mit Zitat

Ich habe folgende Funktion zu der D3D Klasse hinzugefügt:
Code:

void CDirect3D::DrawSurf()
{
    D3DLOCKED_RECT LockedRect;
   
    // Oberfläche für direkten Zugriff sperren
    m_lpSurface->LockRect(&LockedRect,NULL,0);

    int nPitch = LockedRect.Pitch / 4;

    // wenn Lock erfolgreich war, ist lpSurface
    // ein gültiger Zeiger auf die Oberfläche
    D3DCOLOR* Pixels = (D3DCOLOR*)LockedRect.pBits;

for(int i=0;i<100;i++)
{
    for(int j=0;j<120;i++)
    {       
        Pixels[i * nPitch + j] = D3DCOLOR_ARGB(0xFF,j,0,0);
    }
}
    // Wichtig! Oberfläche wieder freigeben
    m_lpSurface->UnlockRect();
}


Diese soll zum Test etwas auf mein Surface malen, welches ich mit der fertigen LoadSurface Funktion erstellt habe.

Ich bekomme dann leider nur einen schwarzen Bildschirm und kurz danach schmiert das Programm ohne Fehlermeldung ab.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 21.04.2004, 20:02    Titel: Antworten mit Zitat

Ich würde auf jeden Fall eine Prüfung auf die Oberfläche einbauen:

Code:
if(m_lpSurface)
{
}


PS: Was hast du denn für eine Farbtiefe?
_________________
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
Jonathan_Klein
Living Legend


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

BeitragVerfasst am: 21.04.2004, 20:07    Titel: Antworten mit Zitat

Das das Programm ohne Fehlermeldung abschmiert ist immer Mist. Kleiner Tipp: Schreibt dir ne Funktion, die einen String in eine Datei schreibt und ruf diese alle paar Zeilen auf. Z. B. so
Code:

Direct3D.Init()
Write("Direct 3D initialisier)
LoadSurface()
Wirtet("Surface geladen")
DrawonSurface();
Write("gemalt");
ShowSurface();
Write("Surface anzeigen");


evtl. solltest du noch vorher Variablen in den String schreiben, damit du noch merh über den Programmstatus erfährsdt.

Die Write Funktion sollte eine TextDatei öffenen, den String anhängen und die Datei wieder schließen. So kannst du hinterher genau sehen, wo das Programm abgestürtzt ist.

Ist viel praktischer als Fhelermeldungen z. B: in ner Messagebox auszugeben.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
5(0rP
Mini JLI'ler



Anmeldedatum: 30.03.2004
Beiträge: 12

Medaillen: Keine

BeitragVerfasst am: 21.04.2004, 20:11    Titel: Lösung Antworten mit Zitat

Very Happy Very Happy Very Happy
Nach langem rumgebastel habe ich es endlich hinbekommen und schreib einfach mal auf wie ich es gelöst habe, falls ein anderer Anfänger mal das selbe Problem hat (ja, ich weiß...für euch Profis ist das vielleicht lächerlich, aber ich habe lange dran gesessen):

Pixel auf ein Surface schreiben:
Code:

bool CDirect3D::DrawOnSurface(int x,int y)
{
D3DLOCKED_RECT rect;
   int nPitch;
   m_lpSurface->LockRect(&rect, 0,0);
   nPitch = rect.Pitch / 4;

   D3DCOLOR *Pixels = (D3DCOLOR*)rect.pBits;

      Pixels[y * nPitch + x] = RGB(0,0,0);

   m_lpSurface->UnlockRect();
   return false;
}


Dabei sollte man beachte, dass dies nur ein Ansatzpunkt ist, weil es unökonomisch wäre bei jedem lock nur einen Pixel zu schreiben.

Pixel auf einem Surface prüfen:
Code:

bool CDirect3D::CheckColor(int x,int y)
{
D3DLOCKED_RECT rect;
   int nPitch;
   m_lpSurface2->LockRect(&rect, 0,0);
   nPitch = rect.Pitch / 4;

   D3DCOLOR *Pixels = (D3DCOLOR*)rect.pBits;

      if(Pixels[y * nPitch + x]== RGB(0,0,0))
      {
         
         m_lpSurface2->UnlockRect();
         return true;
      }

   m_lpSurface2->UnlockRect();
   return false;
}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 21.04.2004, 20:16    Titel: Antworten mit Zitat

Äh...und weißt du, was du jetzt anders gemacht hast?
_________________
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
5(0rP
Mini JLI'ler



Anmeldedatum: 30.03.2004
Beiträge: 12

Medaillen: Keine

BeitragVerfasst am: 21.04.2004, 20:56    Titel: ? Antworten mit Zitat

Ich habe eigentlich keine Ahnung, woran es jetzt genau gelegen hat und bin einfach erst einmal froh, dass es jetzt läuft... Laughing
Auf jeden Fall bedanke ich mich aber bei euch für die Antworten!

Nun stehe ich aber vor dem nächsten Problem:
Im Buch steht, dass es in früheren DX Versionen die Möglichkeit gab eine bestimmte Farbe beim Kopieren von Surfaces mit dem ColorKey transparent zu machen. Ist das noch möglich, oder muss ich extra irgendwie mit dem Alphakanal arbeiten???


(@Lord of Programming: Ich hab grad dein Artilleriespiel getestet. An der Grafik könnte man zwar noch was tun, aber ansonsten ist das Spiel echt cool geworden.)[/u]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 21.04.2004, 21:04    Titel: Re: ? Antworten mit Zitat

Das müsste eigentlich schon gehen. Aber leider kenne ich mich in DX9 noch nicht so gut aus.
Aber ich sehe auch keinen Grund, dieses Feature herauszunehmen.

5(0rP hat Folgendes geschrieben:
(@Lord of Programming: Ich hab grad dein Artilleriespiel getestet. An der Grafik könnte man zwar noch was tun, aber ansonsten ist das Spiel echt cool geworden.)[/u]

Artillerie? Ach so, meinst du MatrixProtector?
Danke jedenfalls Very Happy
_________________
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
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 21.04.2004, 21:16    Titel: Antworten mit Zitat

Um nen Colorkey bei einer Textur zu erreichen musst du beim erstellen in etwa so vorgehen:

Code:
        D3DXCreateTextureFromFileEx(m_lpD3DDevice,
                                    lpFileName,
                                    ImageInfo.Width,
                                    ImageInfo.Height,
                                    1,0,
                                    D3DFMT_UNKNOWN,
                                    D3DPOOL_MANAGED,
                                    D3DX_FILTER_NONE,
                                    D3DX_FILTER_NONE,
                                    D3DCOLOR_XRGB(0,0,0),0,0,
                                    &lpTexture);


Das D3DCOLOR_XRGB(0,0,0) gibt dabei die Farbe an die als Colorkey gewertet wird.
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
5(0rP
Mini JLI'ler



Anmeldedatum: 30.03.2004
Beiträge: 12

Medaillen: Keine

BeitragVerfasst am: 21.04.2004, 21:23    Titel: Antworten mit Zitat

Leider steht überall, dass es nur noch mit Alphablending möglich ist, transparenz zu erzeugen. Und dies funktioniert ja nicht mit der StretchRect Funktion, dass ich bis jetzt zum darstellen benutze.

Also, weiß jemand wie ich sonst mein Surface ohne die schwarzen Pixel in den Buffer kopieren kann???

Mit der D3DXCreateTextureFromFileEx kann ich doch nur Texturen laden... Wie verwende ich die Funktion für mein Surface?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
5(0rP
Mini JLI'ler



Anmeldedatum: 30.03.2004
Beiträge: 12

Medaillen: Keine

BeitragVerfasst am: 22.04.2004, 12:03    Titel: Antworten mit Zitat

Dann muss ich das Problem wohl anders lösen:

Wie greife ich mit Lese- und Schreibzugriff auf die Textur zu, wenn ich eine erstellt habe??
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 22.04.2004, 12:30    Titel: Antworten mit Zitat

Hallo,

das geht mit LockRect().

C.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
5(0rP
Mini JLI'ler



Anmeldedatum: 30.03.2004
Beiträge: 12

Medaillen: Keine

BeitragVerfasst am: 22.04.2004, 17:47    Titel: Antworten mit Zitat

Ja, aber ich weiß leider nur, wie man das bei Surfaces anwendet. Wie funktioniert das ganze bei Texturen? Woher bekomme ich den Zeiger auf die Stelle wo die Textur liegt? Wenn ich einfach den Zeiger direkt auf die Textur für das LockRect benutze gehts net!

(@Christian Rousselle: Das Buch ist einfach nur genial. Stimmt es, dass es schon ein zweites, weiterführendes gibt? Auf jeden Fall würde ich es sofort bestellen Exclamation )
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 22.04.2004, 22:19    Titel: Antworten mit Zitat

Code:

HRESULT LockRect(          UINT Level,
    D3DLOCKED_RECT *pLockedRect,
    CONST RECT *pRect,
    DWORD Flags
);



Code:

D3DLOCKED_RECT LockRect;

lpTexture->LockRec(0,&LockRect,NULL,0);

LockRect->Pitch; // Pitch
LockRect->pBits; // Zeiger auf die Pixel;




Es gibt bisher zwei Bücher. Wenn du das über DirectX 9 hast, dann hast du das aktuelle.

Christian
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
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