Spieleprogrammierung mit DirectX und C++ - Probleme



  • Hi,

    habe mir vor kurzem das Buch "Spieleprogrammierung mit DirectX und C++" gekauft, zuvor hatte ich mir bereits 2 verschiedene leseproben des Buches heruntergeladen.

    Also voller Tatendrang beginnt man dann ja mit den ersten Kapiteln etc. und bemerkt dann eben auch dass die Beispiele die dabei sind auf denen man die Spiele dann auch aufbauen soll nichtmal funktionieren.

    hier der code von V01/V12 von Ultris(tetris kopie ^^)

    # include <stdio.h>
    # include <ddraw.h>
    # include <dsound.h>
    # include <windows.h>
    # include "ddutil.h"
    # include "dsutil.h"
    # include "resource.h"

    const int ultris_nettobreite = 360; // Breite des Inneren des Haupfensters
    const int ultris_nettohoehe = 520; // Hoehe des Inneren des Hauptfensters
    int ultris_bruttobreite; // Breite des gesamten Haupfensters (incl. Rahmen)
    int ultris_bruttohoehe; // Hoehe des gesamten Haupfensters (incl. Rahmen)

    HINSTANCE ultris_instance; // Instanz der Ultris Applikation
    HWND ultris_window; // Das Hauptfenster von Ultris
    HMENU ultris_menu; // Das Menu von Ultris

    /*
    ** ultris_windowhandler
    */
    LRESULT CALLBACK ultris_windowhandler( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
    switch(msg)
    {
    case WM_COMMAND:
    switch( LOWORD( wParam))
    {
    case IDM_EXIT:
    PostMessage( hWnd, WM_CLOSE, 0, 0);
    return 0;
    }
    break;
    case WM_GETMINMAXINFO:
    ((MINMAXINFO *)lParam)->ptMinTrackSize.x = ((MINMAXINFO *)lParam)->ptMaxTrackSize.x = ultris_bruttobreite;
    ((MINMAXINFO *)lParam)->ptMinTrackSize.y = ((MINMAXINFO *)lParam)->ptMaxTrackSize.y = ultris_bruttohoehe;
    return 0;
    case WM_DESTROY:
    PostQuitMessage( 0);
    return 0;
    }
    return DefWindowProc(hWnd, msg, wParam, lParam);
    }

    /*
    ** WinMain
    */
    int APIENTRY WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine, int nCmdShow)
    {
    MSG msg;
    HACCEL acc;
    WNDCLASSEX wcx;

    ultris_instance = hInst;

    wcx.cbSize = sizeof( wcx);
    wcx.lpszClassName = TEXT( "Ultris");
    wcx.lpfnWndProc = ultris_windowhandler;
    wcx.style = CS_VREDRAW | CS_HREDRAW;
    wcx.hInstance = hInst;
    wcx.hIcon = LoadIcon( hInst, MAKEINTRESOURCE( IDI_MAIN));
    wcx.hIconSm = LoadIcon( hInst, MAKEINTRESOURCE( IDI_MAIN));
    wcx.hCursor = LoadCursor( NULL, IDC_ARROW);
    wcx.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    wcx.lpszMenuName = MAKEINTRESOURCE( IDR_MENU);
    wcx.cbClsExtra = 0;
    wcx.cbWndExtra = 0;

    if( !RegisterClassEx( &wcx))
    return 0;

    acc = LoadAccelerators( hInst, MAKEINTRESOURCE(IDR_ACCEL));

    ultris_bruttohoehe = ultris_nettohoehe + 2GetSystemMetrics( SM_CYSIZEFRAME)
    + GetSystemMetrics( SM_CYMENU)
    + GetSystemMetrics( SM_CYCAPTION);
    ultris_bruttobreite = ultris_nettobreite + 2
    GetSystemMetrics( SM_CXSIZEFRAME);

    ultris_window = CreateWindowEx( 0, TEXT( "Ultris"), TEXT( "Ultris"), WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX,
    CW_USEDEFAULT, CW_USEDEFAULT,
    ultris_bruttobreite, ultris_bruttohoehe, NULL, NULL, hInst, NULL);
    if( !ultris_window)
    return 0;

    ultris_menu = GetMenu( ultris_window);

    MoveWindow( ultris_window, (GetSystemMetrics(SM_CXSCREEN)-ultris_bruttobreite)/2,
    (GetSystemMetrics(SM_CYSCREEN)-ultris_bruttohoehe)/2,
    ultris_bruttobreite, ultris_bruttohoehe, TRUE);

    ShowWindow( ultris_window, nCmdShow);

    while( TRUE)
    {
    if( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE))
    {
    if( GetMessage( &msg, NULL, 0, 0 ) == 0)
    return 0; // Message ist WM_QUIT

    if( TranslateAccelerator( ultris_window, acc, &msg) == 0)
    {
    TranslateMessage( &msg);
    DispatchMessage( &msg);
    }
    }
    else
    {
    // Hier koennen wir uns um das Spiel kuemmern
    }
    }
    }

    ich habe schon die ein oder andere Änderung vorgenommen,aber immer ohne erfolg, habe außerdem 2 verschiedene Compiler verwendet (Dev-cpp und Visual express 2008)

    PS: mir ist aufgefallen, dass einige dinge die angeblich auf der CD sein sollen da auch garnicht drauf sind -.- vllt ist da ja der ein oder andere von euch schlauer ^^

    mfg



  • Und was ist jetzt deine konkrete Frage? Der Code hat übrigens wenig mit Standard C++ zu tun und gehört eher ins Winapi Forum.



  • ja wie gesagt funktioniert halt nicht und hab dann eben gehofft dass einer von euch vllt weiß warum...
    sorry wenns falsch ist kann dann ja ein mod verschieben oder irgendwie sowas.

    mfg



  • 1. "Funktioniert halt nicht" ist keine genaue Fehlerbeschreibung und auch keine konkrete Frage. Was funktioniert nicht? Gibt es einen Compilerfehler? Stürzt das Programm ab? Gibt es unerwartete Effekte? usw bla.

    2. http://www.catb.org/~esr/faqs/smart-questions.html



  • hab eben gehofft, dass probleme mit diesen buch bekannt sind, aber ok

    # include <stdio.h>
    # include <ddraw.h>
    # include <dsound.h>
    # include <windows.h>
    # include "ddutil.h"
    # include "dsutil.h"
    # include "resource.h"

    const int ultris_nettobreite = 360; // Breite des Inneren des Haupfensters
    const int ultris_nettohoehe = 520; // Hoehe des Inneren des Hauptfensters
    int ultris_bruttobreite; // Breite des gesamten Haupfensters (incl. Rahmen)
    int ultris_bruttohoehe; // Hoehe des gesamten Haupfensters (incl. Rahmen)

    HINSTANCE ultris_instance; // Instanz der Ultris Applikation
    HWND ultris_window; // Das Hauptfenster von Ultris
    HMENU ultris_menu; // Das Menu von Ultris

    /*
    ** ultris_windowhandler
    */
    LRESULT CALLBACK ultris_windowhandler( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
    switch(msg)
    {
    case WM_COMMAND:
    switch( LOWORD( wParam))
    {
    case IDM_EXIT:
    PostMessage( hWnd, WM_CLOSE, 0, 0);
    return 0;
    }
    break;
    case WM_GETMINMAXINFO:
    ((MINMAXINFO *)lParam)->ptMinTrackSize.x = ((MINMAXINFO *)lParam)->ptMaxTrackSize.x = ultris_bruttobreite;
    ((MINMAXINFO *)lParam)->ptMinTrackSize.y = ((MINMAXINFO *)lParam)->ptMaxTrackSize.y = ultris_bruttohoehe;
    return 0;
    case WM_DESTROY:
    PostQuitMessage( 0);
    return 0;
    }
    return DefWindowProc(hWnd, msg, wParam, lParam);
    }

    /*
    ** WinMain
    */
    int APIENTRY WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine, int nCmdShow)
    {
    MSG msg;
    HACCEL acc;
    WNDCLASSEX wcx;

    ultris_instance = hInst;

    wcx.cbSize = sizeof( wcx);
    wcx.lpszClassName = TEXT( "Ultris");
    wcx.lpfnWndProc = ultris_windowhandler;
    wcx.style = CS_VREDRAW | CS_HREDRAW;
    wcx.hInstance = hInst;
    wcx.hIcon = LoadIcon( hInst, MAKEINTRESOURCE( IDI_MAIN));
    wcx.hIconSm = LoadIcon( hInst, MAKEINTRESOURCE( IDI_MAIN));
    wcx.hCursor = LoadCursor( NULL, IDC_ARROW);
    wcx.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    wcx.lpszMenuName = MAKEINTRESOURCE( IDR_MENU);
    wcx.cbClsExtra = 0;
    wcx.cbWndExtra = 0;

    if( !RegisterClassEx( &wcx))
    return 0;

    ***acc = LoadAccelerators( hInst, MAKEINTRESOURCE(IDR_ACCEL));


    ultris_bruttohoehe = ultris_nettohoehe + 2GetSystemMetrics( SM_CYSIZEFRAME)
    + GetSystemMetrics( SM_CYMENU)
    + GetSystemMetrics( SM_CYCAPTION);
    ultris_bruttobreite = ultris_nettobreite + 2
    GetSystemMetrics( SM_CXSIZEFRAME);

    ultris_window = CreateWindowEx( 0, TEXT( "Ultris"), TEXT( "Ultris"), WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX,
    CW_USEDEFAULT, CW_USEDEFAULT,
    ultris_bruttobreite, ultris_bruttohoehe, NULL, NULL, hInst, NULL);
    if( !ultris_window)
    return 0;

    ultris_menu = GetMenu( ultris_window);

    MoveWindow( ultris_window, (GetSystemMetrics(SM_CXSCREEN)-ultris_bruttobreite)/2,
    (GetSystemMetrics(SM_CYSCREEN)-ultris_bruttohoehe)/2,
    ultris_bruttobreite, ultris_bruttohoehe, TRUE);

    ShowWindow( ultris_window, nCmdShow);

    while( TRUE)
    {
    if( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE))
    {
    if( GetMessage( &msg, NULL, 0, 0 ) == 0)
    return 0; // Message ist WM_QUIT

    if( TranslateAccelerator( ultris_window, acc, &msg) == 0)
    {
    TranslateMessage( &msg);
    DispatchMessage( &msg);
    }
    }
    else
    {
    // Hier koennen wir uns um das Spiel kuemmern
    }
    }
    }

    hab alles was mir dev-cpp als fehler ausgespuckt hat kursiv und fett gemacht und ich schaffe es nicht mal das zu compelieren denn beide programme (dev-cpp und visual studio) geben immer fehlermeldungen

    mfg



  • hab das buch auch..
    die fehler entstehen daher, dass die header

    # include "ddutil.h"
    # include "dsutil.h"
    # include "resource.h"

    nicht im compiler eingetragen sind, bzw. nicht in dem verzeichniss sind.

    die anderen fehler, die alle was mit IDM_xxxxx zu tun haben,
    liegen an der fehlenden ressource, also in der

    resource.h

    den namen auch werten zu definen und eine .rc datei erstellen, die die
    ressourcen auch beinhaltet. in dem buch ist auch eine genaue beschreibung
    wie man das macht, wenn dein compiler kein ressourceneditor hat, musst
    du dir einen externen runterladen

    Hier einen runterladen

    MfG helferlein



  • ich bin mir jetzt nicht ganz so sicher ob du das damit meinst, aber die entsprechenden header-dateien und auch diese recourcedatei sind alle in der projektmappe mitdrin und die sind auch alle im selben ordner also müsste es doch dann eig. funktionieren oder nicht? ^^

    edit:

    1>Kompilieren...
    1>dsutil.cpp
    1>c:\dokumente und einstellungen\denisheit\desktop\projekte\ultris\v01\dsutil.cpp(11) : fatal error C1083: Datei (Include) kann nicht geöffnet werden: "windows.h": No such file or directory
    1>ddutil.cpp
    1>c:\dokumente und einstellungen\denisheit\desktop\projekte\ultris\v01\ddutil.cpp(12) : fatal error C1083: Datei (Include) kann nicht geöffnet werden: "windows.h": No such file or directory
    1>Demo.cpp
    1>c:\dokumente und einstellungen\denisheit\desktop\projekte\ultris\v01\demo.cpp(2) : fatal error C1083: Datei (Include) kann nicht geöffnet werden: "windows.h": No such file or directory

    das ist jetzt ne andere fehlermeldung,anscheinend stimmt da was mit windows.h nicht, hat da vllt einer eine lösung?

    mfg



  • du musst das platform-sdk installieren. siehe microsoft-seite oder die FAQ hier



  • Ich hoffe mal du bist kritikfähig und interpretierst nicht alles negative gleich
    als arrogant.

    Aufgrund deiner bisherigen posts nehme ich an du du kompletter Anfänger bist.
    Daher solltest du erstmal lernen wie C++ funktioniert:
    - Was sind Source-files, was/wofür sind Header-files
    - Wozu dient eine Compiler, was macht ein Linker

    Anschliessend könntest du dich mit den Prinzipien der Windows-Programmierung
    (WINAPI) vertraut machen.
    - Was ist ein Fenster
    - Was ist ein Device-Context
    - Wie funktioniert eventgesteuerte Programmierung

    Und wenn du das alles soweit draufhast, könntest du dann mit DirectX bzw.
    Grafik/Spiele-Programmierung beginnen.

    Ansonsten wird das nämlich nix weiter als ein stures abtippen von Buchbeispielen.



  • also, wenn du das directx sdk meinst das hab ich schon installiert, oder meinst du ein anderes, denn wenn man bei google nach plattform sdk sucht findet man ganz viele verschiedene sachen.

    Edit: ne kompletter anfänger nicht, aber stimmt schon das ein oder andere sollte ich vllt vorher nochmal anschauen, aber vorher möchte ich wenigstens das vom buch "startklar" machen

    so hab mir nun so ein supergeiles windows sdk geladen installiert etc. und schon habe ich ne neue fehlermeldung 😃

    1>dsutil.cpp
    1>c:\dokumente und einstellungen\denisheit\desktop\projekte\ultris\v01\dsutil.cpp(13) : fatal error C1083: Datei (Include) kann nicht geöffnet werden: "dxerr8.h": No such file or directory
    1>ddutil.cpp
    1>c:\dokumente und einstellungen\denisheit\desktop\projekte\ultris\v01\ddutil.h(12) : fatal error C1083: Datei (Include) kann nicht geöffnet werden: "d3d.h": No such file or directory
    1>Demo.cpp
    1>c:\dokumente und einstellungen\denisheit\desktop\projekte\ultris\v01\demo.cpp(4) : fatal error C1083: Datei (Include) kann nicht geöffnet werden: "dsound.h": No such file or directory

    hoffe jemand kann mir helfen ^^
    (hab nun das directx sdk und visual studio nochmal neu installiert, hat aber auch nicht geholfen)

    Edit: hab irgendwo was davon gelesen dass man verweise zu den sdk's machen muss wo genau muss man das vornehmen? Oder stimmt das nicht?

    mfg



  • push

    kommt schon ihr wisst es doch, hilfe plssss





  • boah bin ich gut, habs ganz allein geschafft, yeah, nein spaß thx für eure hilfe und da ich hier keinen bedankomat oder sowas ähnliches sehe muss ein normales danke reichen, also nochmal danke ^^

    hab mich wohl zu früh gefreut... hab zum test die endversion v12 getestet, dabei kam folgender fehler zu stande:

    1>.\Demo.rc(100) : error RC2104 : undefined keyword or key name: IDC_STATIC
    

    mfg



  • ma gucken obs ma formatiert nachvollziehen kann............

    # include <stdio.h> 
    # include <ddraw.h> 
    # include <dsound.h> 
    # include <windows.h> 
    # include "ddutil.h" 
    # include "dsutil.h" 
    # include "resource.h" 
    
    const int ultris_nettobreite = 360; // Breite des Inneren des Haupfensters 
    const int ultris_nettohoehe = 520; // Hoehe des Inneren des Hauptfensters 
    int ultris_bruttobreite; // Breite des gesamten Haupfensters (incl. Rahmen) 
    int ultris_bruttohoehe; // Hoehe des gesamten Haupfensters (incl. Rahmen) 
    
    HINSTANCE ultris_instance; // Instanz der Ultris Applikation 
    HWND ultris_window; // Das Hauptfenster von Ultris 
    HMENU ultris_menu; // Das Menu von Ultris 
    
    /* 
    ** ultris_windowhandler 
    */ 
    LRESULT CALLBACK ultris_windowhandler( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) 
    { 
    switch(msg) 
    { 
    case WM_COMMAND: 
    switch( LOWORD( wParam)) 
    { 
    case IDM_EXIT: 
    PostMessage( hWnd, WM_CLOSE, 0, 0); 
    return 0; 
    } 
    break; 
    case WM_GETMINMAXINFO: 
    ((MINMAXINFO *)lParam)->ptMinTrackSize.x = ((MINMAXINFO *)lParam)->ptMaxTrackSize.x = ultris_bruttobreite; 
    ((MINMAXINFO *)lParam)->ptMinTrackSize.y = ((MINMAXINFO *)lParam)->ptMaxTrackSize.y = ultris_bruttohoehe; 
    return 0; 
    case WM_DESTROY: 
    PostQuitMessage( 0); 
    return 0; 
    } 
    return DefWindowProc(hWnd, msg, wParam, lParam); 
    } 
    
    /* 
    ** WinMain 
    */ 
    int APIENTRY WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine, int nCmdShow) 
    { 
    MSG msg; 
    HACCEL acc; 
    WNDCLASSEX wcx; 
    
    ultris_instance = hInst; 
    
    wcx.cbSize = sizeof( wcx); 
    wcx.lpszClassName = TEXT( "Ultris"); 
    wcx.lpfnWndProc = ultris_windowhandler; 
    wcx.style = CS_VREDRAW | CS_HREDRAW; 
    wcx.hInstance = hInst; 
    wcx.hIcon = LoadIcon( hInst, MAKEINTRESOURCE( IDI_MAIN)); 
    wcx.hIconSm = LoadIcon( hInst, MAKEINTRESOURCE( IDI_MAIN)); 
    wcx.hCursor = LoadCursor( NULL, IDC_ARROW); 
    wcx.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); 
    wcx.lpszMenuName = MAKEINTRESOURCE( IDR_MENU); 
    wcx.cbClsExtra = 0; 
    wcx.cbWndExtra = 0; 
    
    if( !RegisterClassEx( &wcx)) 
    return 0; 
    
    acc = LoadAccelerators( hInst, MAKEINTRESOURCE(IDR_ACCEL)); 
    
    ultris_bruttohoehe = ultris_nettohoehe + 2*GetSystemMetrics( SM_CYSIZEFRAME) 
    + GetSystemMetrics( SM_CYMENU) 
    + GetSystemMetrics( SM_CYCAPTION); 
    ultris_bruttobreite = ultris_nettobreite + 2*GetSystemMetrics( SM_CXSIZEFRAME); 
    
    ultris_window = CreateWindowEx( 0, TEXT( "Ultris"), TEXT( "Ultris"), WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX, 
    CW_USEDEFAULT, CW_USEDEFAULT, 
    ultris_bruttobreite, ultris_bruttohoehe, NULL, NULL, hInst, NULL); 
    if( !ultris_window) 
    return 0; 
    
    ultris_menu = GetMenu( ultris_window); 
    
    MoveWindow( ultris_window, (GetSystemMetrics(SM_CXSCREEN)-ultris_bruttobreite)/2, 
    (GetSystemMetrics(SM_CYSCREEN)-ultris_bruttohoehe)/2, 
    ultris_bruttobreite, ultris_bruttohoehe, TRUE); 
    
    ShowWindow( ultris_window, nCmdShow); 
    
    while( TRUE) 
    { 
    if( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE)) 
    { 
    if( GetMessage( &msg, NULL, 0, 0 ) == 0) 
    return 0; // Message ist WM_QUIT 
    
    if( TranslateAccelerator( ultris_window, acc, &msg) == 0) 
    { 
    TranslateMessage( &msg); 
    DispatchMessage( &msg); 
    } 
    } 
    else 
    { 
    // Hier koennen wir uns um das Spiel kuemmern 
    } 
    } 
    }
    


  • Googles erster schrieb:

    #define IDC_STATIC -1
    

    anscheinend ist der wert nicht weiter wichtig also veruschs mal damit.



  • ich hab diesen tollen fehler jetzt so ziemlich "isoliert" und er hat was mit den einbinden einer bmp in diesen Ultris-info dialog zutun... also hab ich das teil weggelassen ^^

    irgendwie hab ich wieder ein problem... und zwar gibt der autor im buch bei einen dialog (in der ressourcenansicht) bei so einer checkbox die id IDC_CHECK1=5000 an ,aber immer wenn ich das versuche verpufft die 5000 einfach wieder ich hab schon versucht irgendwas umzustellen,aber das hat alles nichts gebracht...

    mfg


Anmelden zum Antworten