DirectX??? Hat jemand ein beispiel?
-
ok, das faq werde ich mal gründlich lesen.
aber googlen bringt nix, wie gesagt, so gut wie kein beispiel funktioniert
-
der gcc der im mingg(und damit dev-cpp) enthalten ist, verträgt sich nicht mit directX
-
otze schrieb:
der gcc der im mingg(und damit dev-cpp) enthalten ist, verträgt sich nicht mit directX
das ist gelogen.
-
mingw schrieb:
otze schrieb:
der gcc der im mingg(und damit dev-cpp) enthalten ist, verträgt sich nicht mit directX
das ist gelogen.
sicher nicht, mindestens eine lib kann der gcc nicht benutzen/aus einer dll kann mit den enthaltenen programmen keine lib erstellt werden.
-
Der kostenlose MS VisualC++ Toolkit 2003 müsste es aber können. Warum überhaupt noch MinGW?
-
IMHO kann es nicht schaden, Programme für Windows mit dem kostenlosen Compiler von Microsoft zu compilieren, insbesondere, wenn Windows-spezifische Bibliotheken genutzt werden sollen.
*thread moved*

-
Hier ein Beispiel. Das Programm lädt das Bild G:\britney.bmp und man kann es dann mit den Pfeiltasten rumbewegen. Allerdings hab ich es in VC++ gemacht, aber kannst es ja mal in DevC++ probieren.
#include <ddraw.h> #pragma comment(lib, "ddraw.lib") #pragma comment(lib, "dxguid.lib") #define COLOR_DEPTH 32 #define FRAME_RATE 30 #define SCR_WIDTH 800 //fensterbreite #define SCR_HEIGHT 600 //fensterhöhe //britneysprite höhe #define SPRITE_WIDTH 100 //fensterbreite #define SPRITE_HEIGHT 100 //fensterhöhe //anwendungsfenster erzeugen HWND CreateMainWindow(HINSTANCE hInstance); // Farbe berechnen int CalcColor(int r, int g, int b); void DeterminePixelFormat(LPDIRECTDRAWSURFACE7 lpDDSurface); LPDIRECTDRAWSURFACE7 CreateSurfaceFromBitmap(LPSTR File, int dWidth, int dHeight); //globale variable für das fensterhandle HWND hWnd = 0; //directdraw interface LPDIRECTDRAW7 lpDD7 = NULL; //oberflächen LPDIRECTDRAWSURFACE7 lpDDSPrimary; LPDIRECTDRAWSURFACE7 lpDDSurface; //clFipper LPDIRECTDRAWCLIPPER lpDDClipper = NULL; //struktur auf beschreibung von oberfläche DDSURFACEDESC2 ddsd; //sekundäre oberfläche DDSURFACEDESC2 SurfDesc; //farben int ShiftRed = 0; int ShiftGreen = 0; int ShiftBlue = 0; int PosRed = 0; int PosGreen = 0; int PosBlue = 0; //positionen int x = 0; int y = 0; //callback funktion LRESULT CALLBACK MessageHandler( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); //die objekte freigeben void CleanUpDirectDraw(void); //error funktion int Error( char *msg ); //ddrawbeispiel void Render(void); //main funktion int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { //fenster erzeugen und in handle speichern hWnd = CreateMainWindow(hInstance); if( 0 == hWnd ) { MessageBox(0, "Fenster konnte nicht erzeugt werden", "Fehler",MB_OK); return 0; } //directdrawobjekt erzeugen if(FAILED(DirectDrawCreateEx(NULL,(LPVOID*)&lpDD7,IID_IDirectDraw7,NULL))) { Error("ddobjekt konnte nicht angelegt werden"); return -1; } //kooperationsebene festlegen if(FAILED(lpDD7->SetCooperativeLevel(hWnd,DDSCL_NORMAL))) { Error("kooperationsebene konnte nicht festgelegt werden"); return -1; } //struktur initialisieren ZeroMemory(&ddsd,sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_CAPS; //primäre oberfläche anlegen ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE |DDSCAPS_VIDEOMEMORY; if( FAILED (lpDD7->CreateSurface(&ddsd,&lpDDSPrimary,NULL))) { Error("Primäre oberfläche konnte nicht erzeugt werden"); return -1; } //lpDDSurface erstellen und mit bild laden ZeroMemory(&SurfDesc, sizeof(SurfDesc)); SurfDesc.dwSize = sizeof(SurfDesc); SurfDesc.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; SurfDesc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY | DDSCAPS_NONLOCALVIDMEM; SurfDesc.dwWidth = 100; SurfDesc.dwHeight = 100; if(FAILED( lpDD7->CreateSurface(&SurfDesc,&lpDDSurface,NULL) )) { Error("Fehler beim erstellen der Oberfläche"); return -1; } //britney laden lpDDSurface = CreateSurfaceFromBitmap("G:\\britney.bmp",SPRITE_WIDTH,SPRITE_HEIGHT); MSG msg; //Spielschleife LONGLONG Frequenz; LONGLONG Abstand; LONGLONG NaechstesFrame; LONGLONG AktuelleZeit; //wenn der counter vorhanden ist, frequenz speichern if( !QueryPerformanceFrequency( (LARGE_INTEGER*)&Frequenz) ) { Error("Performance Counter nicht vorhanden"); } //abstand zwischen zwei frames berechnen Abstand = Frequenz / FRAME_RATE; //aktuelle zeit speichern QueryPerformanceCounter((LARGE_INTEGER*)&AktuelleZeit) ; //berechnen wann das nächste frame berechnet werden soll NaechstesFrame = AktuelleZeit + Abstand; while( TRUE ) { if( PeekMessage(&msg,NULL,0,0,PM_REMOVE) ) { //wenn WM_QUIT gesendet wird if( msg.message == WM_QUIT ) { break; } TranslateMessage(&msg); DispatchMessage(&msg); } else { //aktuelle zeit speichern QueryPerformanceCounter((LARGE_INTEGER*)&AktuelleZeit) ; //wenn es zeit für das nächste frame ist if( AktuelleZeit > NaechstesFrame ) { Render(); //verarbeite eingaben mit directinput //generiere musik mit directxaudio //bewege die gegner //bewege den spieler //generiere die grafik mit directdraw //berechnen wann das nächste frame berechnet werden soll NaechstesFrame = AktuelleZeit + Abstand; } } } return 0; } LPDIRECTDRAWSURFACE7 CreateSurfaceFromBitmap(LPSTR File, int dWidth, int dHeight) { //device context für das bild und die oberfläche HDC hBmDC, hSurfDC; //handle der zu ladenden bitmap HBITMAP hBM; //oberflächenbeschreibung DDSURFACEDESC2 SurfDesc; //zeiger auf die oberfläche LPDIRECTDRAWSURFACE7 lpDDSurfaceTemp; //bild laden hBM = (HBITMAP)LoadImage(0,File, IMAGE_BITMAP,dWidth,dHeight,LR_LOADFROMFILE); //ist ein fehler aufgetreten? if(NULL == hBM) { Error("Fehler 1"); return NULL; } //oberflächenbeschreibung initialisierne ZeroMemory(&SurfDesc,sizeof(SurfDesc)); SurfDesc.dwSize = sizeof(SurfDesc); //Caps höhe und breite berücksichtigen SurfDesc.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; SurfDesc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; SurfDesc.dwWidth = dWidth; SurfDesc.dwHeight = dHeight; //oberfläche anlegen if(FAILED(lpDD7->CreateSurface(&SurfDesc,&lpDDSurfaceTemp,NULL))) { Error("Fehler 2"); return NULL; } //device context von fläche holen lpDDSurfaceTemp->GetDC(&hSurfDC); //kompatiblen DC für bild anlegen hBmDC = CreateCompatibleDC(hSurfDC); //bild für DC holen SelectObject(hBmDC,hBM); //bild in oberfläche kopieren BitBlt(hSurfDC,0,0,dWidth,dHeight,hBmDC,0,0,SRCCOPY); //Device Context freigeben lpDDSurfaceTemp->ReleaseDC(hSurfDC); //DC und bild löschen DeleteDC(hBmDC); DeleteObject(hBM); //zeiger zurückgeben return lpDDSurfaceTemp; } void Render(void) { //primäre oberfläche löschen DDBLTFX BlitFX; ZeroMemory(&BlitFX,0); BlitFX.dwSize = sizeof(BlitFX); //hintergrundfarbe setzen BlitFX.dwFillColor = 0; lpDDSPrimary->Blt(NULL,NULL,NULL, DDBLT_COLORFILL | DDBLT_WAIT, &BlitFX); //bild in primäre oberfläche kopieren lpDDSPrimary->BltFast(x,y,lpDDSurface,NULL,DDBLTFAST_WAIT); } //callback funktion LRESULT CALLBACK MessageHandler( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { //es wurde eine taste gedrückt case WM_KEYDOWN: //testen ob es sich um eine pfeiltaste oder //ESC handelt switch(wParam) { case VK_ESCAPE: DestroyWindow(hWnd); break; case VK_LEFT: if( x - 10 >= 0 ) { x -= 10; Render(); } break; case VK_RIGHT: //if( x + SPRITE_WIDTH + 10 >= SCR_WIDTH) //{ x += 10; Render(); //} break; case VK_UP: if( y - 10 >= 0) { y -= 10; Render(); } break; case VK_DOWN: if( y + SPRITE_HEIGHT + 10 <= SCR_HEIGHT) { y += 10; Render(); } break; } break; case WM_PAINT: PAINTSTRUCT ps; BeginPaint(hWnd, &ps); Render(); EndPaint(hWnd,&ps); break; case WM_DESTROY: CleanUpDirectDraw(); PostQuitMessage(0); return 0; break; case WM_CREATE: return 0; break; case WM_LBUTTONDBLCLK: //mausposition in lParam return 0; break; case WM_CLOSE: PostQuitMessage(0); return 0; break; } //wenn andere nachricht > standardfunktion aufrufen return DefWindowProc(hWnd,msg,wParam,lParam); } //create main window HWND CreateMainWindow(HINSTANCE hInstance) { WNDCLASSEX wndClass; //WNDCLASSEX Struktur //struktur initialisieren wndClass.cbSize = sizeof(WNDCLASSEX); //grösse angeben wndClass.style = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW; //callback funktion angeben wndClass.lpfnWndProc = MessageHandler; wndClass.cbClsExtra = 0; wndClass.cbWndExtra = 0; wndClass.hInstance = hInstance; //weisser pinsel für hintergrund wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //standard mauscursor verwenden wndClass.hCursor = LoadCursor(NULL,IDC_ARROW); //das fenster soll kein menü haben wndClass.lpszMenuName = NULL; //name der fensterklasse für createwindowex wndClass.lpszClassName = "WindowClass"; //icons für fenster anlegen wndClass.hIcon = LoadIcon(NULL, IDI_WINLOGO); wndClass.hIconSm = LoadIcon ( NULL, IDI_WINLOGO); //fensterklasse registrieren für createwindowex RegisterClassEx(&wndClass); return CreateWindowEx( NULL, "WindowClass", "Ein einfaches Fenster", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 0, 0, 800, 600, NULL, NULL, hInstance, NULL); } //die objekte freigeben void CleanUpDirectDraw(void) { //prüfen ob zeiger gültig sind if( NULL != lpDDSPrimary ) { lpDDSPrimary->Release(); lpDDSPrimary = NULL; } if( NULL != lpDDClipper ) { lpDDClipper->Release(); lpDDClipper = NULL; } if( NULL != lpDD7 ) { lpDD7->Release(); lpDD7 = NULL; } } int Error( char *msg ) { //nachricht ausgeben OutputDebugString(msg); OutputDebugString("\n"); //messagebox ausgeben MessageBox(hWnd,msg,"Fehler",MB_OK); return -1; } // Farbe berechnen void DeterminePixelFormat(LPDIRECTDRAWSURFACE7 lpDDSurface) { //pixelformat bestimmen DDPIXELFORMAT ddpf; ddpf.dwSize = sizeof(ddpf); lpDDSurface->GetPixelFormat(&ddpf); //position der maske für rot bestimmen while( 0 == (ddpf.dwRBitMask & 1) ) { ddpf.dwRBitMask >>= 1; PosRed++; } if( ddpf.dwRBitMask == 31) ShiftRed = 3; else ShiftRed = 2; //position der maske für grün bestimmen while(0 == (ddpf.dwGBitMask & 1 )) { ddpf.dwGBitMask >>= 1; PosGreen++; } if( ddpf.dwGBitMask == 31) ShiftGreen = 3; else ShiftGreen = 2; //make für blau beginnt immer bei 0 PosBlue = 0; if( ddpf.dwBBitMask == 31) ShiftRed = 3; else ShiftRed = 2; } int CalcColor(int r, int g, int b) { switch(COLOR_DEPTH) { case 32: case 24: return ((r<<16) + (g<<8) + b); break; case 16: return ((( (r) >> ShiftRed) << PosRed) + (( (g) >> ShiftGreen) << PosGreen) + (( (b) >> ShiftBlue) << PosBlue)); default: return 0; } }
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Spiele-/Grafikprogrammierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
hi
erstmal danke fürs verschieben

und 2.
danke fürs beispiel, aber es eght leider nicht ganz.
ich bekomme einen fehler in zeile 390 [oder eher ne warnung][warning] passing NULL used for non-pointer converting 1 of HWND_*CreateWindowEx(und dann einen haufen blabblabla, über die argumente
)woran kann das liegen?
-
Vermutlich uan dem Quellcode in der Nähe von Zeile 390.
Bye, TGGC
-
schon klar, dass das nicht unbedingt auf der zeile ist.

aber dennoch finde ich den fehler nicht
-
Green Snake schrieb:
[warning] passing NULL used for non-pointer converting 1 of HWND_*CreateWindowEx(und dann einen haufen blabblabla, über die argumente
)woran kann das liegen?
Wenn ich das richtig interpretiere, dann steht da irgendwo NULL, wo 0 stehen müsste.
Mal so ne Frage: Muss es denn unbedingt DirectX sein? Schau dir doch mal völlig unbefangen die SDL an. Das ist nicht ganz so LowLevel, wie DirectX, aber immer noch genug. Und es ist Plattformunabhängig! Also vielleicht nen Blick wert.
-
ProgChild schrieb:
Wenn ich das richtig interpretiere, dann steht da irgendwo NULL, wo 0 stehen müsste.
Ist egal 0 == NULL.
-
jop, das mit dem 0 statt NULL habe ich schon lange mal progiert, aber wie gesagt, 0==NULL

bei SDL, dan würden wir ja wieder auf die frage von mir zurück kommen.
hat jemand ein beispiel dazu?
das problem ist einfach, ich habe schon duzende beispiele zu allem gefunden, aber das meiste ist halt für visual c++, was wiederum nicht auf dev c++ funktionieren muss
-
Green Snake schrieb:
bei SDL, dan würden wir ja wieder auf die frage von mir zurück kommen.
hat jemand ein beispiel dazu?
das problem ist einfach, ich habe schon duzende beispiele zu allem gefunden, aber das meiste ist halt für visual c++, was wiederum nicht auf dev c++ funktionieren muss
Auf http://www.libsdl.org gibt es Windows Downloads für den MinGW. Das sollte auf jeden Fall klappen. Auf der Tutorial Seite findest du genug Beispiele. Schau dir das mal an.
P.S.: Ich weiß nicht, was ihr immer habt. Ich konnte ohne Probleme mit dem MinGW Libraries, die mit den Visual C++ erzeugt wurden linken...