|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
CorDharel Junior JLI'ler
Anmeldedatum: 15.10.2002 Beiträge: 73 Wohnort: Winterthur, Zürich, CH Medaillen: Keine
|
Verfasst am: 01.11.2004, 11:07 Titel: Codes funktionieren nicht mehr? |
|
|
Hallo zusammen!
Ich habe ein Problem: Ich wollte ein Windowsfenster mit DirectX unterstützung machen, wie im ersten Buch beschrieben (Kapitel 17).
Ich habe mit das DirectX 9 SDK runtergeladen. Kann es nun sein dass sich alles geändert hat? Irgendwie funktioniert nichts mehr wie es sollte
Zum Beispiel heisst es im Buch "LPDIRECTDRAW7" aber keinen Fehler gibt es nur mit "LPDIRECTDRAW" ohne die Zahl. Das ist noch öfters der Fall. Oder die Funktion "DirectDrawCreateEx" findet er gar nicht.
Ich hoffe es kann mir jemand weiterhelfen!
Hier ist mein Code. Weiter bin ich nicht mehr gekommen, da er es nicht schafft die primäre Oberfläche zu generieren.
Grüsse CorDharel
Code: |
#include <windows.h>
#include <ddraw.h>
//Funktionen
void Render(void);
void CleanupDirectDraw(void);
int Error(char* msg);
//anwendungsfenster erzeugen
HWND CreateMainWindow(HINSTANCE hInstance);
//callback funktion zur nachrichtenbehandlung
LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg,
WPARAM wParam,
LPARAM lParam);
//globale variable für das fensterhandle
HWND hWnd = 0;
//zeiger auf das directdraw object
LPDIRECTDRAW lpDD7 = NULL;
//zeiger auf die primäre oberfläche
LPDIRECTDRAWSURFACE lpDDSPrimary = NULL;
//struktur zur beschreibung einer oberfläche
DDSURFACEDESC ddsd;
//zeiger auf den clipper
LPDIRECTDRAWCLIPPER lpDDClipper = NULL;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
//fenster erzeugen und handle speichern
hWnd = CreateMainWindow(hInstance);
//Directdraw objekt anlegen
if( FAILED( DirectDrawCreate(NULL,&lpDD7,NULL) ) )
{
MessageBox(0,"DirectDraw Objekt konnte nicht erzeugt werden",
"Fehler",MB_OK);
return 0;
}
//kooperationsebene festlegen
if(FAILED(lpDD7->SetCooperativeLevel(hWnd,DDSCL_NORMAL)))
{
MessageBox(0,"Kooperationsebene konnte nicht festgelegt werden.",
"Fehler",MB_OK);
return 0;
}
//primäre oberfläche initialisieren
ZeroMemory(&ddsd,sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_VIDEOMEMORY;
//oberfläche anlegen
if(FAILED(lpDD7->CreateSurface(&ddsd,&lpDDSPrimary,NULL)));
{
MessageBox(0,"Oberfläche konnte nicht angelegt werden.",
"Fehler",MB_OK);
return 0;
}
if(FAILED(lpDD7->CreateClipper(NULL,&lpDDClipper,NULL)))
{
MessageBox(0,"Clipper konnte nicht erzeugt werden.",
"Fehler",MB_OK);
return 0;
}
if( 0 == hWnd )
{
MessageBox(0,"Fenster konnte nicht erzeugt werden",
"Fehler",MB_OK);
return 0;
}
MSG msg;
while( GetMessage(&msg,NULL,0,0) )
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
Render();
return 0;
}
HWND CreateMainWindow(HINSTANCE hInstance)
{
WNDCLASSEX wndClass;
wndClass.cbSize = sizeof(WNDCLASSEX);
wndClass.style = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
wndClass.lpfnWndProc = MessageHandler;
wndClass.cbClsExtra = 0;
wndClass.cbWndExtra = 0;
wndClass.hInstance = hInstance;
wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_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",
"DirectDraw",
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
0, 0,
400, 300,
NULL,
NULL,
hInstance,
NULL);
}
LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg,
WPARAM wParam,
LPARAM lParam)
{
switch(msg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
break;
}
return ( DefWindowProc(hwnd,msg,wParam,lParam) );
}
//alle objekte freigeben
void CleanupDirectDraw(void)
{
//prüfen ob die zeiger gültig sind
if(NULL != lpDDSPrimary)
{
lpDDSPrimary->Release();
lpDDSPrimary = NULL;
}
/* if(NULL != lpDDSClipper)
{
lpDDSClipper->Release();
lpDDSClipper = NULL;
}
*/ if(NULL != lpDD7)
{
lpDD7->Release();
lpDD7 = NULL;
}
}
void Render(void)
{
//eine struktur für bliteffekte anlegen
DDBLTFX DDBltFX;
//initialisieren und grösse festlegen
ZeroMemory(&DDBltFX,sizeof(DDBltFX));
DDBltFX.dwSize = sizeof(DDBltFX);
RECT r;
POINT p1, p2;
//punkte für das spätere rechteck festlegen
p1.x = 50; p1.y = 50;
p2.x = 100; p2.y = 100;
//koordinaten aus dem fenster in bildschirmkoordinaten umrechnen
ClientToScreen(hWnd,&p1);
ClientToScreen(hWnd,&p2);
//aus den punkten ein rechteck aufbauen
r.left = p1.x; r.right = p2.x;
r.top = p1.y; r.bottom = p2.y;
for( int i=0;i<256;i++ )
{
//farbe setzen
DDBltFX.dwFillColor = i*i*i;
//rechteck nach rechts unten verschieben
r.left++; r.top++;
r.right++; r.bottom++;
//rechteck auf dem bildschirm ausgeben
if(FAILED(lpDDSPrimary->Blt(&r,NULL,NULL,DDBLT_COLORFILL |DDBLT_WAIT,&DDBltFX)))
{
Error("Blt ist fehlgeschlagen");
return;
}
}
}
int Error(char* msg)
{
//nachricht ausgeben
OutputDebugString(msg);
OutputDebugString("\n");
//messagebox ausgeben
MessageBox(hWnd,msg,"Fehler",MB_OK);
return -1;
}
|
_________________ Greetz CorDharel |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 01.11.2004, 21:35 Titel: |
|
|
Hast du die DX-Version denn auch richtig installiert?
Schau doch mal nach, welche du aktuell installiert hast.
Ich glaube bei den Beispielprogrammen müsste ein "DxDialog.exe" dabei sein, dass dir Infos über deine DX-Version gibt _________________ 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 |
|
|
|
|
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
|