|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
5(0rP Mini JLI'ler
Anmeldedatum: 30.03.2004 Beiträge: 12
Medaillen: Keine
|
Verfasst am: 20.04.2004, 22:25 Titel: Auf Surface zeichnen |
|
|
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 |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 21.04.2004, 10:56 Titel: |
|
|
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 _________________ 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 |
|
|
5(0rP Mini JLI'ler
Anmeldedatum: 30.03.2004 Beiträge: 12
Medaillen: Keine
|
Verfasst am: 21.04.2004, 16:13 Titel: |
|
|
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 |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 21.04.2004, 20:02 Titel: |
|
|
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 |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 21.04.2004, 20:07 Titel: |
|
|
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 |
|
|
5(0rP Mini JLI'ler
Anmeldedatum: 30.03.2004 Beiträge: 12
Medaillen: Keine
|
Verfasst am: 21.04.2004, 20:11 Titel: Lösung |
|
|
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 |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
|
Nach oben |
|
|
5(0rP Mini JLI'ler
Anmeldedatum: 30.03.2004 Beiträge: 12
Medaillen: Keine
|
Verfasst am: 21.04.2004, 20:56 Titel: ? |
|
|
Ich habe eigentlich keine Ahnung, woran es jetzt genau gelegen hat und bin einfach erst einmal froh, dass es jetzt läuft...
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 |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 21.04.2004, 21:04 Titel: Re: ? |
|
|
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 _________________ 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 |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 21.04.2004, 21:16 Titel: |
|
|
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 |
|
|
5(0rP Mini JLI'ler
Anmeldedatum: 30.03.2004 Beiträge: 12
Medaillen: Keine
|
Verfasst am: 21.04.2004, 21:23 Titel: |
|
|
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 |
|
|
5(0rP Mini JLI'ler
Anmeldedatum: 30.03.2004 Beiträge: 12
Medaillen: Keine
|
Verfasst am: 22.04.2004, 12:03 Titel: |
|
|
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 |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 22.04.2004, 12:30 Titel: |
|
|
Hallo,
das geht mit LockRect().
C. |
|
Nach oben |
|
|
5(0rP Mini JLI'ler
Anmeldedatum: 30.03.2004 Beiträge: 12
Medaillen: Keine
|
Verfasst am: 22.04.2004, 17:47 Titel: |
|
|
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 ) |
|
Nach oben |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 22.04.2004, 22:19 Titel: |
|
|
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 |
|
|
|
|
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
|