DirectX??? Hat jemand ein beispiel?



  • ok, da bin ich registriert 😉
    hmmm...aber verschieben kann ich das thema ja eh nich....und es ist wohl sinnlos, jetzt noch mal den gleichen post im spiele forum zu schreiben.

    könnte ein mod oder admin das thema verschieben?



  • mein tip an dich: les erstmal die faq des spieleforums, dann google fleißig und erst dann stelle konkrete fragen.
    so wirst du es schwer haben 😉



  • 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...


Anmelden zum Antworten