|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Marius Mini JLI'ler
Anmeldedatum: 15.04.2003 Beiträge: 19 Wohnort: Küssaberg-Rheinheim Medaillen: Keine
|
Verfasst am: 15.04.2003, 12:47 Titel: 2 Probleme |
|
|
Hi!
Ich hab 2 Probleme:
1. Ich hab das DDFenster aus Kapitel 17 ausprobiert. Das kompilieren funktioniert einwandfrei, doch das Fenster kann nicht erzeugt werden.
2. Wenn ich Code eingebe listet C++ die Elemente von DDObjekten nicht auf.
Danke im Vorraus
Marius |
|
Nach oben |
|
|
Hasenfuß Senior JLI'ler
Alter: 37 Anmeldedatum: 20.08.2002 Beiträge: 291
Medaillen: Keine
|
Verfasst am: 15.04.2003, 12:58 Titel: |
|
|
Hi!
1.: Ohne Code wird man dir da schwer helfen können.
2.: Ich nehme an du meinst, dass beim angeben von zB. lpDDPrimary->... nicht die funktionen aufgelistet werden. Das ist aber normal bei DirectX Objekten (jedenfalls isses bei mir auch so ) |
|
Nach oben |
|
|
Kampfhund Super JLI'ler
Alter: 42 Anmeldedatum: 20.07.2002 Beiträge: 408
Medaillen: Keine
|
Verfasst am: 15.04.2003, 13:07 Titel: |
|
|
zu 2.:
du kannst dem projekt die dx header hinzufügen (projekt->dem projekt hinzufügen), dann müsste diese auswahlliste kommen. |
|
Nach oben |
|
|
Marius Mini JLI'ler
Anmeldedatum: 15.04.2003 Beiträge: 19 Wohnort: Küssaberg-Rheinheim Medaillen: Keine
|
Verfasst am: 15.04.2003, 13:08 Titel: |
|
|
Hier ist der Code:
Code: |
#include <ddraw.h>
#include <windows.h>
HWND CreateMainWindow(HINSTANCE hInstance);
LRESULT CALLBACK WindowFunc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
BOOL InitDirectDraw(HWND hWnd);
void CleanUpDirectDraw(void);
void Render(void);
BOOL Error (char* msg);
HWND hWnd;
LPDIRECTDRAW7 lpDD7 = NULL;
LPDIRECTDRAWCLIPPER lpDDClipper = NULL;
LPDIRECTDRAWSURFACE7 lpDDSPrimary = NULL;
BOOL initDDSuccess = FALSE;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpComdLine,
int nShowCmd)
{
hWnd = CreateMainWindow(hInstance);
if (hWnd == 0)
{
//Hier passiert bei mir ein Fehler:
Error("Fehler beim Erzeugen des Fensters");
}
if (!InitDirectDraw(hWnd))
{
return FALSE;
}
MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
HWND CreateMainWindow(HINSTANCE hInstance)
{
WNDCLASSEX wndClass;
wndClass.cbSize = sizeof(WNDCLASSEX);
wndClass.style = CS_DBLCLKS | CS_OWNDC |
CS_HREDRAW | CS_VREDRAW;
wndClass.lpfnWndProc = WindowFunc;
wndClass.cbClsExtra = 0;
wndClass.cbWndExtra = 0;
wndClass.hInstance = hInstance;
wndClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndClass.lpszMenuName = NULL;
wndClass.lpszClassName = "windowClass";
wndClass.hIcon = LoadIcon(NULL, IDI_WINLOGO);
wndClass.hIconSm = LoadIcon(NULL, IDI_WINLOGO);
RegisterClassEx(&wndClass);
return CreateWindowEx(NULL,
"WindowClass",
"DDFenster",
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
0, 0, 400, 300,
NULL,
NULL,
hInstance,
NULL);
}
LRESULT CALLBACK WindowFunc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_KEYDOWN:
switch(wParam)
{
case VK_ESCAPE:
DestroyWindow(hWnd);
break;
}
break;
case WM_PAINT:
PAINTSTRUCT ps;
BeginPaint(hWnd,&ps);
Render();
EndPaint(hWnd,&ps);
break;
case WM_DESTROY:
CleanUpDirectDraw();
PostQuitMessage(0);
break;
}
return (DefWindowProc(hWnd, msg, wParam, lParam));
}
BOOL InitDirectDraw(HWND hwnd)
{
if(FAILED(DirectDrawCreateEx(NULL,(LPVOID*)&lpDD7, IID_IDirectDraw7, NULL)))
{
return (Error("Fehler beim Anlegen des DD-Objekts!"));
}
DDSURFACEDESC2 ddsd;
ZeroMemory(&ddsd, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_VIDEOMEMORY;
if(FAILED(lpDD7->CreateSurface(&ddsd,&lpDDSPrimary,NULL)))
{
// Und hier passiert bei mir ein Fehler
return Error("Fehler beim Anlegen der primären Oberfläche");
}
if(FAILED(lpDD7->CreateClipper(NULL,&lpDDClipper,NULL)))
{
return Error("Fehler beim anlegen des Clipper");
}
if(FAILED(lpDDClipper->SetHWnd(0,hWnd)))
{
return Error("Fehler bei SetHWnd");
}
if(FAILED(lpDDSPrimary->SetClipper(lpDDClipper)))
{
return Error("Fehler beim Verbinden des Clippers");
}
return TRUE;
}
void Render(void)
{
DDBLTFX DDBltFX;
ZeroMemory(&DDBltFX,sizeof(DDBltFX));
DDBltFX.dwSize = sizeof(DDBltFX);
RECT r;
POINT p1, p2;
p1.x = 50; p1.y = 50;
p2.x = 100; p2.y = 100;
ClientToScreen(hWnd,&p1);
ClientToScreen(hWnd,&p2);
r.left = p1.x;
r.top = p1.y;
r.right = p2.x;
r.bottom = p2.y;
for(int i=0;i<256;i++)
{
DDBltFX.dwFillColor = i*i*i;
r.left++; r.top++;
r.right++; r.bottom++;
if(FAILED(lpDDSPrimary->Blt(&r,NULL,NULL,DDBLT_COLORFILL | DDBLT_WAIT,&DDBltFX)))
{
Error("Blt ist fehlgeschlagen");
return;
}
}
}
void CleanUpDirectDraw(void)
{
if(NULL != lpDDSPrimary)
{
lpDDSPrimary->Release();
lpDDSPrimary = NULL;
}
if(NULL != lpDDClipper)
{
lpDDClipper->Release();
lpDDClipper = NULL;
}
if(NULL != lpDD7)
{
lpDD7->Release();
lpDD7 = NULL;
}
}
BOOL Error(char* msg)
{
MessageBox(0,msg,"Error",MB_OK);
OutputDebugString(msg);
OutputDebugString("\n");
return FALSE;
}
|
Falls das noch wichtig ist: Ich arbeite mit Win98 und VC++6 Professional.[/code] |
|
Nach oben |
|
|
Kampfhund Super JLI'ler
Alter: 42 Anmeldedatum: 20.07.2002 Beiträge: 408
Medaillen: Keine
|
Verfasst am: 15.04.2003, 13:15 Titel: |
|
|
hm, vileicht musst du das w bei "windowClass" großschreiben? |
|
Nach oben |
|
|
Marius Mini JLI'ler
Anmeldedatum: 15.04.2003 Beiträge: 19 Wohnort: Küssaberg-Rheinheim Medaillen: Keine
|
Verfasst am: 15.04.2003, 13:36 Titel: |
|
|
Nee, das wars auch nicht |
|
Nach oben |
|
|
Marius Mini JLI'ler
Anmeldedatum: 15.04.2003 Beiträge: 19 Wohnort: Küssaberg-Rheinheim Medaillen: Keine
|
Verfasst am: 15.04.2003, 13:43 Titel: |
|
|
Ich blick's nicht mehr! Ich hab' den Code aus dem Beispielprojekt in meine CPP-Datei kopiert: Und siehe da, es funktioniert! Aber die Lösung ist das auch nicht. |
|
Nach oben |
|
|
Marius Mini JLI'ler
Anmeldedatum: 15.04.2003 Beiträge: 19 Wohnort: Küssaberg-Rheinheim Medaillen: Keine
|
Verfasst am: 15.04.2003, 13:56 Titel: |
|
|
Hi!
Ich hab's hingekriegt. Ich hab Zeile für Zeile verglichen und es sind noch ein paar Fehler in der WinMain und in der InitDirectDraw aufgetaucht.
Danke für die schnellen Antworten
Marius |
|
Nach oben |
|
|
Mr.X Junior JLI'ler
Anmeldedatum: 15.04.2003 Beiträge: 88
Medaillen: Keine
|
Verfasst am: 15.04.2003, 20:20 Titel: ... |
|
|
Hi, falls Dich die Ursachen für Deine Fehler interessieren:
Dein erster Fehler wird durch einen Schreibfehler in Deiner WindowFunc()-Funktion verursacht.
---> Am Ende der Funktion rufst Du für nicht behandelte Nachrichten die Windows-Standardfuntion DefWindowProc() auf und übergibts dieser als ersten Parameter die Variable hWnd !!! Lokal in dieser Funktion für das Fensterhandle ist jedoch die Variable hwnd. Beim Start Deines Programmes ist der Wert Deiner globalen Variable hWnd NULL. Wenn nun Dein Fenster erzeugt werden soll, so wird bereits bei diesem Erzeugen Dein neues Fenster "angesprochen" (in diesem Moment hat Windows bereits ein Handle erzeugt und Deiner Nachrichten-Behandlungsfunktion wird schon dieses richtige Handle durch die Variable hwnd übergeben). Da Du diese Nachricht aber durch Aufruf der Standardfunktion behandelst, welcher Du das immer noch ungültige Handle hWnd (= NULL) übergibst, kommt sozusagen die "Erzeuge Fenster zu diesem Handle"-Nachricht nicht beim richtigen Fensterhandle an!!! Du leitest sozusagen alle Nachrichten um (bzw. ins Leere), die für Dein Fenster(handle) bestimmt sind. Daher schlägt die Funktion CreateWindowEx() fehl, und sie liefert als Rückgabewert 0. Deiner globalen Variable hWnd weist Du erst jetzt am Ende (nachdem das Fenster erzeugt worden wäre) das gültige Fensterhandle zu, welches aber nun weiterhin bei 0 bleibt!!! Dadurch wird deine Error()-Funktion aufgerufen.
Dein zweiter Fehler beruht auf einem fehlendem Funktionsaufruf Deines DirectDraw-Objektes.
--->Nachdem Du es mit DirectDrawCreateEx() angelegt hast, must Du erst dessen Kooperationsebene festlegen, bevor Du eine entsprechende Oberfläche anlegen kannst. In Deinem Fall liefert der Aufruf der Funktion CreateSurface() DDERR_NOCOOPERATIVELEVELSET (HRESULT-Errorcode 212) zurück! In "ddraw.h" steht dazu:
/*
* Create function called without DirectDraw object method SetCooperativeLevel
* being called.
*/
Um diesen Fehler zu beheben musst Du als erstes die Methode SetCooperativeLevel() Deines DirectDraw-Objektes aufrufen. Beispiel:
Code: |
if(FAILED(DirectDrawCreateEx(NULL,(LPVOID*)&lpDD7, IID_IDirectDraw7, NULL)))
{
return (Error("Fehler beim Anlegen des DD-Objekts!"));
}
if(FAILED(lpDD7->SetCooperativeLevel(hWnd,DDSCL_NORMAL)))
{
return Error("Fehler beim Setzen der Kooperationsebene");
}
|
Fazit:
Lange Rede, kurzer Sinn.
mfG |
|
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
|