Spielprogrammierung in C - Buchempfehlung



  • Hallo Freunde der Codierung,

    ich wollte mich gerne bisschen mit Grafik/Spiel-Programmierung beschaeftigen.

    Ich suche ein gutes Buch zum DirectX aber (jetzt kommt der Hacken) ausschliesslich in der Programmierersprache "C"

    Ich habe mir viele Bücher angeguckt aber alle waren C/C++ oder nur C++.

    Bitte keine Antworten dass ich C++ brauche um DirectX zu programmieren...
    ich suche halt ein Buch das diese Materie ohen C++ erklärt.

    Noch etwas zu meinem Wissenstand: C - gut, WinApi - gut

    Wenn Ihr ein Link zu 'nem gutem Tutorial dazu habt, her damit....

    thx im Vorraus



  • Gibt's da 'nen Grund für? 😮

    Das ist so, als wolltest Du ein Fahrrad ohne Lenker steuern... (Geiler Vergleich, gell?! 😃 )

    Such nach COM Programmierung mit C.

    Viel Spaß... 😮 :p



  • oder schau dir den Quellcode zu Quake 3 an^^



  • lad dir doch die SDL runter da is ene doku dabei mit anleitung für das lernen und SDL is C
    ausserdem hat sie den voteril das sie plattformunabhangig ist und im forum benutzten sie recht viele..
    aber an deiner stelle würd uich sowieaso c++ da viels nur noch damit geht odr dein compoiler mit gröster warsch ein c++ compiler ist und kein reiner c vompiler..



  • Ich kann da das Buch von Andre Lamothe empfehlen: "Tricks of the Windows Game Programming Gurus". Oder wenn dus ein bisschen ruhiger angehen willst: "Game Programming fuer Dummies" auch von ihm.

    Beides sehr gute Buecher, ohne dem C++ Zeugs. Kann ich nur empfehlen.

    mfg LastManStanding



  • Pellaeon schrieb:

    oder schau dir den Quellcode zu Quake 3 an^^

    Nein, besser nicht. 😮
    Das geht echt so viel leichter.

    /*
    ============================================================
    
    DIRECT INPUT MOUSE CONTROL
    
    ============================================================
    */
    
    #undef DEFINE_GUID
    
    #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
            EXTERN_C const GUID name \
                    = { l, w1, w2, { b1, b2,  b3,  b4,  b5,  b6,  b7,  b8 } }
    
    DEFINE_GUID(GUID_SysMouse,   0x6F1D2B60,0xD5A0,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
    DEFINE_GUID(GUID_XAxis,   0xA36D02E0,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
    DEFINE_GUID(GUID_YAxis,   0xA36D02E1,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
    DEFINE_GUID(GUID_ZAxis,   0xA36D02E2,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
    
    #define DINPUT_BUFFERSIZE           16
    #define iDirectInputCreate(a,b,c,d)	pDirectInputCreate(a,b,c,d)
    
    HRESULT (WINAPI *pDirectInputCreate)(HINSTANCE hinst, DWORD dwVersion,
    	LPDIRECTINPUT * lplpDirectInput, LPUNKNOWN punkOuter);
    
    static HINSTANCE hInstDI;
    
    typedef struct MYDATA {
    	LONG  lX;                   // X axis goes here
    	LONG  lY;                   // Y axis goes here
    	LONG  lZ;                   // Z axis goes here
    	BYTE  bButtonA;             // One button goes here
    	BYTE  bButtonB;             // Another button goes here
    	BYTE  bButtonC;             // Another button goes here
    	BYTE  bButtonD;             // Another button goes here
    } MYDATA;
    
    static DIOBJECTDATAFORMAT rgodf[] = {
      { &GUID_XAxis,    FIELD_OFFSET(MYDATA, lX),       DIDFT_AXIS | DIDFT_ANYINSTANCE,   0,},
      { &GUID_YAxis,    FIELD_OFFSET(MYDATA, lY),       DIDFT_AXIS | DIDFT_ANYINSTANCE,   0,},
      { &GUID_ZAxis,    FIELD_OFFSET(MYDATA, lZ),       0x80000000 | DIDFT_AXIS | DIDFT_ANYINSTANCE,   0,},
      { 0,              FIELD_OFFSET(MYDATA, bButtonA), DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0,},
      { 0,              FIELD_OFFSET(MYDATA, bButtonB), DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0,},
      { 0,              FIELD_OFFSET(MYDATA, bButtonC), 0x80000000 | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0,},
      { 0,              FIELD_OFFSET(MYDATA, bButtonD), 0x80000000 | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0,},
    };
    
    #define NUM_OBJECTS (sizeof(rgodf) / sizeof(rgodf[0]))
    
    // NOTE TTimo: would be easier using c_dfDIMouse or c_dfDIMouse2 
    static DIDATAFORMAT	df = {
    	sizeof(DIDATAFORMAT),       // this structure
    	sizeof(DIOBJECTDATAFORMAT), // size of object data format
    	DIDF_RELAXIS,               // absolute axis coordinates
    	sizeof(MYDATA),             // device data size
    	NUM_OBJECTS,                // number of objects
    	rgodf,                      // and here they are
    };
    
    static LPDIRECTINPUT		g_pdi;
    static LPDIRECTINPUTDEVICE	g_pMouse;
    
    void IN_DIMouse( int *mx, int *my );
    
    /*
    ========================
    IN_InitDIMouse
    ========================
    */
    qboolean IN_InitDIMouse( void ) {
        HRESULT		hr;
    	int			x, y;
    	DIPROPDWORD	dipdw = {
    		{
    			sizeof(DIPROPDWORD),        // diph.dwSize
    			sizeof(DIPROPHEADER),       // diph.dwHeaderSize
    			0,                          // diph.dwObj
    			DIPH_DEVICE,                // diph.dwHow
    		},
    		DINPUT_BUFFERSIZE,              // dwData
    	};
    
    	Com_Printf( "Initializing DirectInput...\n");
    
    	if (!hInstDI) {
    		hInstDI = LoadLibrary("dinput.dll");
    
    		if (hInstDI == NULL) {
    			Com_Printf ("Couldn't load dinput.dll\n");
    			return qfalse;
    		}
    	}
    
    	if (!pDirectInputCreate) {
    		pDirectInputCreate = (long (__stdcall *)(void *,unsigned long ,struct IDirectInputA ** ,struct IUnknown *))
    			GetProcAddress(hInstDI,"DirectInputCreateA");
    
    		if (!pDirectInputCreate) {
    			Com_Printf ("Couldn't get DI proc addr\n");
    			return qfalse;
    		}
    	}
    
    	// register with DirectInput and get an IDirectInput to play with.
    	hr = iDirectInputCreate( g_wv.hInstance, DIRECTINPUT_VERSION, &g_pdi, NULL);
    
    	if (FAILED(hr)) {
    		Com_Printf ("iDirectInputCreate failed\n");
    		return qfalse;
    	}
    
    	// obtain an interface to the system mouse device.
    	hr = IDirectInput_CreateDevice(g_pdi, &GUID_SysMouse, &g_pMouse, NULL);
    
    	if (FAILED(hr)) {
    		Com_Printf ("Couldn't open DI mouse device\n");
    		return qfalse;
    	}
    
    	// set the data format to "mouse format".
    	hr = IDirectInputDevice_SetDataFormat(g_pMouse, &df);
    
    	if (FAILED(hr)) 	{
    		Com_Printf ("Couldn't set DI mouse format\n");
    		return qfalse;
    	}
    
    	// set the cooperativity level.
    	hr = IDirectInputDevice_SetCooperativeLevel(g_pMouse, g_wv.hWnd,
    			DISCL_EXCLUSIVE | DISCL_FOREGROUND);
    
    	// https://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=50
    	if (FAILED(hr)) {
    		Com_Printf ("Couldn't set DI coop level\n");
    		return qfalse;
    	}
    
    	// set the buffer size to DINPUT_BUFFERSIZE elements.
    	// the buffer size is a DWORD property associated with the device
    	hr = IDirectInputDevice_SetProperty(g_pMouse, DIPROP_BUFFERSIZE, &dipdw.diph);
    
    	if (FAILED(hr)) {
    		Com_Printf ("Couldn't set DI buffersize\n");
    		return qfalse;
    	}
    
    	// clear any pending samples
    	IN_DIMouse( &x, &y );
    	IN_DIMouse( &x, &y );
    
    	Com_Printf( "DirectInput initialized.\n");
    	return qtrue;
    }
    

    EDIT: Lustigerweise hat der Q3-Render-Code nicht halb so viele Kommentare... 😃

    Schau Dir die Samples an und guck was Du davon gebrauchen kannst.
    Das gilt besonders, wenn Du Dich nur vor C++ drücken willst.

    LastManStanding schrieb:

    Ich kann da das Buch von Andre Lamothe empfehlen: "Tricks of the Windows Game Programming Gurus". Oder wenn dus ein bisschen ruhiger angehen willst: "Game Programming fuer Dummies" auch von ihm.

    Beides sehr gute Buecher, ohne dem C++ Zeugs. Kann ich nur empfehlen.

    Naja, AFAIK nutzt er ja schon C++.
    Allerdings nur grundlegendes. Keine Templates und diese kranken Sachen die man machen kann, von denen aber nur 10 Leute auf der Welt wissen... 😃



  • Sgt. Nukem schrieb:

    Pellaeon schrieb:

    oder schau dir den Quellcode zu Quake 3 an^^

    Nein, besser nicht. 😮
    Das geht echt so viel leichter.

    War ja auch ein Gag, daher "^^° 😃



  • Pellaeon schrieb:

    Sgt. Nukem schrieb:

    Pellaeon schrieb:

    oder schau dir den Quellcode zu Quake 3 an^^

    Nein, besser nicht. 😮
    Das geht echt so viel leichter.

    War ja auch ein Gag, daher "^^° 😃

    Achso... 😕

    Wie in NadrW letztens erst diskutiert wurde, scheint "^^" nicht standardisiert zu sein. Ein ":D" oder "🤡" wäre besser gewesen... 😉 👍



  • @Sgt. Nukem:
    LaMothe nimmt halt von c++ ein paar sachen her, die das ganze vereinfachen. bleibt aber wirklich am boden.

    mfg LastMan



  • LastManStanding schrieb:

    @Sgt. Nukem:
    LaMothe nimmt halt von c++ ein paar sachen her, die das ganze vereinfachen. bleibt aber wirklich am boden.

    Yo.

    And I don't want to see any of you guys messing with multiple inheritance!!

    😃 👍


Log in to reply