Erster Versuch mit 3D

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Empire
Beiträge: 272
Registriert: Mo Jan 26, 2009 5:36 pm

Erster Versuch mit 3D

Beitrag von Empire » Do Mai 13, 2010 9:13 pm

Ein Jahr nach dem ich mit C angefangen hab kam (endlich) der Erste Versuch mit der 3. Dimension.
Der sieht so aus:

Code: Alles auswählen

#include <windows.h>
#include <D3D9.h>

HWND hWnd;

LRESULT CALLBACK WindowProc (HWND hWnd, UINT message,
                             WPARAM wParam, LPARAM lParam);

int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpcmdline, int ncmdshow)
{
    int Adapter, Mode;
    //4. D3D_HARDWARE_VERTEXPROESSING
    HRESULT               hResult;
    D3DPRESENT_PARAMETERS PresentParams;
    WNDCLASSEX windowclass;
    MSG        message;
    const char szClassName[] = "Wecker";
    
    windowclass.cbSize = sizeof (WNDCLASSEX);
    windowclass.style = CS_HREDRAW | CS_VREDRAW;
    windowclass.lpfnWndProc = WindowProc;
    windowclass.cbClsExtra = 0;
    windowclass.cbWndExtra = 0;
    windowclass.hInstance = hInst;
    windowclass.hIcon =LoadIcon (NULL, IDI_APPLICATION);
    windowclass.hIconSm =LoadIcon (NULL, IDI_APPLICATION);
    windowclass.hCursor =LoadCursor (NULL, IDC_ARROW);
    windowclass.hbrBackground = (HBRUSH)COLOR_BACKGROUND+1;
    windowclass.lpszMenuName = NULL;
    windowclass.lpszClassName = szClassName;
    
    int Laenge = GetSystemMetrics(SM_CXSCREEN);//Größe des Bildschirms nach links(in Pixel)
    int Breite = GetSystemMetrics(SM_CYSCREEN);//Größe des Bildschirms nach unten(in Pixel)
    
    hWnd = CreateWindowEx(NULL,
                          szClassName,
                          "Rechner",
                          WS_OVERLAPPEDWINDOW | WS_VISIBLE,
                          0, 0,
                          Breite, Laenge,
                          NULL,
                          NULL,
                          hInst,
                          NULL);
    
    if(!RegisterClassEx (&windowclass))
       return (0);
       
    if(hWnd == NULL)
       return (0);
    
    PDIRECT3D9 pD3D = Direct3DCreate9(D3D_SDK_VERSION);
    if(!pD3D)
    {
        MessageBox(0,"Neu version INSTALLIEREN", "Fehler", MB_OK | MB_ICONEXCLAMATION);
    }
    int iNumAdapters = pD3D->GetAdapterCount();
    
    D3DADAPTER_IDENTIFIER9*pAdapters=new D3DADAPTER_IDENTIFIER9[iNumAdapters];
    for (int iAdapter=0;iAdapter<iNumAdapters; iAdapter++)
    {
        int iNumModes= pD3D->GetAdapterModeCount(iAdapter,D3DFMT_R5G6B5);
        if(iNumModes>0)
        {
            D3DDISPLAYMODE* pModes = new D3DDISPLAYMODE[iNumModes];
            char acModes[16384] = "";
            for(int iMode=0;iMode<iNumModes; iMode++)
            {
                pD3D->EnumAdapterModes(iAdapter,D3DFMT_R5G6B5,iMode,&pModes[iMode]);
                if(pModes[iMode].Width==Breite)
                {
                    if(pModes[iMode].Height==Laenge)
                    {
                        Adapter=iAdapter;
                        Mode=iMode;
                        break;
                    }
                }
            }
        }
    }
    
    ZeroMemory(&PresentParams,sizeof(D3DPRESENT_PARAMETERS));
    PresentParams.BackBufferWidth                   =Breite;
    PresentParams.BackBufferHeight                  =Laenge;
    PresentParams.BackBufferFormat                  =D3DFMT_X8R8G8B8;
    PresentParams.BackBufferCount                   =1;
    PresentParams.MultiSampleType                   =D3DMULTISAMPLE_NONE;
    //PresentParams.MultiSampleQuality
    PresentParams.SwapEffect                        =D3DSWAPEFFECT_DISCARD;
    PresentParams.hDeviceWindow                     =NULL;
    PresentParams.Windowed                          =TRUE;
    PresentParams.EnableAutoDepthStencil            =TRUE;
    PresentParams.AutoDepthStencilFormat            =D3DFMT_D24S8;
    PresentParams.Flags                             =D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;
    PresentParams.FullScreen_RefreshRateInHz        =D3DPRESENT_RATE_DEFAULT;
    PresentParams.PresentationInterval              =D3DPRESENT_INTERVAL_DEFAULT;
    
    IDirect3D9::CreateDevice(Adapter, D3DDEVTYPE_HAL, hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, PresentParams, pD3D);  // Das ist Zeile 100
    
    while (GetMessage (&message, NULL, 0, 0))
    {
          TranslateMessage (&message);
          DispatchMessage (&message);
    }
    
    return (int)(message.wParam);
}

LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch(message)
    {
         case WM_DESTROY:
              {
                         PostQuitMessage(0);
                         return (0);
              }
         case WM_KEYDOWN:
              {
                         switch(wParam)
                         {
                                case VK_ESCAPE:
                                     {
                                               PostQuitMessage (0);
                                               return (0);
                                     }
                         }
              }
              break;
         case WM_COMMAND:
              {
                         switch(wParam)
                         {
                         }
                         return (0);
              }
    }
    return (DefWindowProc (hWnd, message, wParam, lParam));
}
Der Spielverderber sagt aber:
99 C:\Users\Janek\Desktop\Neuer Ordner\main.cpp no matching function for call to `IDirect3D9::CreateDevice(int&, _D3DDEVTYPE, HWND__*&, int, D3DPRESENT_PARAMETERS&, IDirect3D9*&)'
note C:\Dev-Cpp\include\D3D9.h:139 candidates are: virtual HRESULT IDirect3D9::CreateDevice(UINT, D3DDEVTYPE, HWND__*, DWORD, D3DPRESENT_PARAMETERS*, IDirect3DDevice9**)

was ist das Problem und wie komm ich ihm bei?
Hab schon gegoogelt aber keine Erklärung gefunden die nach meinem Lösungsversuch nicht noch mehr ERRORS ausgelöst hat.

mfg
Empire

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Erster Versuch mit 3D

Beitrag von cloidnerux » Do Mai 13, 2010 9:34 pm

So wie ich das sehe, hast du die CreateDevice Methode aus der Refernz genommen, aber daran hält sich Dv-Cpp nicht. Es erwartetetwas andere Parameter, z.B: UINT statt einem int-Pointer, und so weiter.
Ein Teil davon solltest du problemlos Casten können, ansonsten solltest du dir sowieso eine andere IDE holen und dann auch die DirectX und Windows SDK.
Zudem solltst du dir überlegen, ob du nicht lieber mit OpenGL beschäftigst, weil du dann auch ohne große änderung auf Linux und Mac portieren kannst.
Ansonsten, hast du mal nach Dev-Cpp + DirectX gegoogelt und welches Tutorial verwendest du?
Redundanz macht wiederholen unnötig.
quod erat expectandum

Empire
Beiträge: 272
Registriert: Mo Jan 26, 2009 5:36 pm

Re: Erster Versuch mit 3D

Beitrag von Empire » Fr Mai 14, 2010 12:14 pm

Ein Buch.
Warum hält sich Dev-Cpp nicht daran?
Kannst du mir auch ein Grund nenen warum ich den IDE wechseln soll?
Nein ich wechsel jetzt mal nicht zu OpenGL.

mfg
Empire

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Erster Versuch mit 3D

Beitrag von Xin » Fr Mai 14, 2010 12:22 pm

Empire hat geschrieben:Ein Buch.
Warum hält sich Dev-Cpp nicht daran?
Der Dev-Cpp war immer fehlerhaft und seit Jahren wird daran nicht weiter entwickelt.
Empire hat geschrieben:Kannst du mir auch ein Grund nenen warum ich den IDE wechseln soll?
Der Dev-Cpp war immer fehlerhaft und seit Jahren wird daran nicht weiter entwickelt.
Empire hat geschrieben:Nein ich wechsel jetzt mal nicht zu OpenGL.
Da ich beruflich voraussichtlich in Richtung OpenGL gehen werde, wird von meiner Seite her das Wiki eher mit OpenGL als mit DirectX gefüttert.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Erster Versuch mit 3D

Beitrag von cloidnerux » Fr Mai 14, 2010 12:41 pm

Kannst du mir auch ein Grund nenen warum ich den IDE wechseln soll?
Ich kenn soagr mehrere:
Dev-C++ ist alt, enthält keinen neuen GCC und es gibt keine Updates.
Es gibt sogut wie keine Project-File unterstützung, das heißt tools wie CMake kannst du vergessen.
Nützliche Extras wie Code-vervollständigung gibt es nicht.
Alles in allem, ist Dev-C++ nur noch was für absolute Anfänger, die das Programm bei der google suche ganz oben gefunden haben.
Ein Buch.
Welches?
Warum hält sich Dev-Cpp nicht daran?
Weil Dev-C++ alt ist und eine eigene Implementation/alte Version von der windows.h und den DirectX-Headern hat.
Nein ich wechsel jetzt mal nicht zu OpenGL.
Musst du nicht, du musst dich aber auch nicht nur mit DirectX beschäftigen.
OpenGL hat aber aus meiner sicht mehr Potenzial, da du nicht nur auf Windows beschränkt bist und auch nicht die bescheidenen Windows-Implementationen nutzen musst.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Empire
Beiträge: 272
Registriert: Mo Jan 26, 2009 5:36 pm

Re: Erster Versuch mit 3D

Beitrag von Empire » Fr Mai 14, 2010 12:56 pm

Ok ich such mir ein Neuen.
Ok wenn ich das mit DirectX gerafft hab mach ich mich an OpenGL.
Das Buch heist 3D-Spiele-Programmierung mit DirectX9 und C++.
Und eine Frage noch, welchen Compiler empfehlt ihrt?

mfg
Empire

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Erster Versuch mit 3D

Beitrag von Xin » Fr Mai 14, 2010 1:29 pm

Empire hat geschrieben:Und eine Frage noch, welchen Compiler empfehlen ihrt?
Für DirectX VisualStudio C++.

Grundsätzlich Code::Blocks oder CodeLite mit einem aktuellen MinGW.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten