Tja mein erstes 3d proggie will nicht



  • Servus,

    ich hab mal versucht des Sample vom DXSDK 9 nachzubauen (CreateDevice) aber des ganze wil irgendwie nicht, des ganze sollte nur mal ein kleiner test sein, wäre super wenn ihrs euch mal ankuckt ich seh nämlich keine fehler.

    bdenkt hier wird nur das device erzeugt und nicht mehr gemacht.

    edit// Es wird bei CreateDevice INVALIDE_CALL zurückgeliefert

    NFMain.h

    // NFMain.h: interface for the NFMain class.
    //
    //////////////////////////////////////////////////////////////////////
    
    #if !defined(AFX_NFMAIN_H__A71229A5_8215_4A69_8B65_2C7064EF4686__INCLUDED_)
    #define AFX_NFMAIN_H__A71229A5_8215_4A69_8B65_2C7064EF4686__INCLUDED_
    
    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    
    #pragma comment(lib, "d3d9.lib")
    
    #include <windows.h>
    #include <string>
    #include <d3d9.h>
    
    using namespace std;
    
    //#define GET_THIS static NFMain *pme=NULL;HWND l_hwnd=0;if(pme==NULL)pme=this;l_hwnd=(HWND)this;__asm{mov eax,pme};__asm{mov this,eax};/*cares to get everything right with the this pointer and the window handle:bigor92*/
    #define ZEROMEM(var){  ZeroMemory( var, sizeof(var) ); }
    
    class NFMain  
    {
    public:
        void Test();
        WPARAM Start(); 
        NFMain(string strClassname,HINSTANCE hInstance);
        ~NFMain();
    
    private:
        HRESULT InitD3D();
        WPARAM Apploop();
        HRESULT CreateWin();
        static LRESULT CALLBACK WndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
    
        HINSTANCE m_hInstance;
        HWND m_hWnd;
        string m_strClassname;
        LPDIRECT3D9 m_pD3D;
        LPDIRECT3DDEVICE9 m_pd3dDevice;
    
    };
    
    #endif // !defined(AFX_NFMAIN_H__A71229A5_8215_4A69_8B65_2C7064EF4686__INCLUDED_)
    

    NFMain.cpp

    // NFMain.cpp: implementation of the NFMain class.
    //
    //////////////////////////////////////////////////////////////////////
    
    #include "NFMain.h"
    
    //////////////////////////////////////////////////////////////////////
    // Construction/Destruction
    //////////////////////////////////////////////////////////////////////
    
    NFMain::NFMain(string strClassname,HINSTANCE hInstance)
    :
    m_hWnd(NULL),
    m_hInstance(hInstance),
    m_strClassname(strClassname),
    m_pD3D(NULL),
    m_pd3dDevice(NULL)
    {
    }
    
    NFMain::~NFMain()
    {
        UnregisterClass(m_strClassname.c_str(),m_hInstance);
    
        if(m_pD3D)
        {
            m_pD3D->Release();
            m_pD3D = NULL;
        }
    
        if(m_pd3dDevice)
        {
            m_pd3dDevice->Release();
            m_pd3dDevice = NULL;
        }
    }
    
    WPARAM NFMain::Start()
    {
    
        if(FAILED(CreateWin()))
            return -1;
    
        if(FAILED(InitD3D()))
             return -1;
    
        ShowWindow( m_hWnd, SW_SHOWDEFAULT );
        UpdateWindow( m_hWnd );
    
        return Apploop();
    }
    
    LRESULT CALLBACK NFMain::WndProc(HWND hwnd,UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
        //GET_THIS;
    
         switch(uMsg)
        {
        case WM_CREATE:
    
            return 0;
    
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
        }
        return DefWindowProc(hwnd,uMsg,wParam,lParam);
    }
    
    WPARAM NFMain::Apploop()
    {
    MSG msg;
    while(GetMessage(&msg,NULL,0,0))
            {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
            }
        return msg.wParam;
    }
    
    void NFMain::Test()
    {
        MessageBeep(-1);
    }
    
    HRESULT NFMain::CreateWin()
    {
        /*
        long (__stdcall *f2)(HWND,UINT,WPARAM,LPARAM);
        long (__stdcall NFMain:: *f1)(UINT,WPARAM,LPARAM);
        this->WndProc(0,0,0);
        f1=WndProc;
        __asm{
        mov eax,f1;
        mov f2,eax
        }*/
    
        WNDCLASS wndclass;
    
        wndclass.lpfnWndProc = NFMain::WndProc;
        wndclass.style = CS_CLASSDC;
        wndclass.cbClsExtra= NULL;
        wndclass.cbWndExtra= NULL;
        wndclass.hInstance= m_hInstance;
        wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
        wndclass.hCursor = LoadCursor(NULL,IDC_ARROW);
        wndclass.lpszMenuName = NULL;
        wndclass.hbrBackground= (HBRUSH) GetStockObject(BLACK_BRUSH);
        wndclass.lpszClassName= m_strClassname.c_str();
        RegisterClass(&wndclass);
    
        m_hWnd = CreateWindow(m_strClassname.c_str(),"Direct3D 9",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,m_hInstance,NULL);
    
        if(m_hWnd==NULL)
            return -1;
    
        return 1;
    }
    
    HRESULT NFMain::InitD3D()
    {
        // Create the D3D object, which is needed to create the D3DDevice.
        if( ( m_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) == NULL )
           return -1;
    
        D3DPRESENT_PARAMETERS d3dpp; 
        ZEROMEM(&d3dpp);
        d3dpp.Windowed = TRUE;
        d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
        d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
    
        if(FAILED( m_pD3D->CreateDevice( D3DADAPTER_DEFAULT,
                                            D3DDEVTYPE_HAL, 
                                            m_hWnd,
                                            D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                            &d3dpp,
                                            &m_pd3dDevice )
                                        ) )
        {
            return -1;
        }
    
        return 0;
    
    }
    

    main.cpp

    #include <windows.h>
    #include "NFMain.h"
    
    NFMain Main;
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
    {
    
        return Main.Start();
    }
    

    Bin jedem echt dankbar wers sichs mal anschaut.

    [ Dieser Beitrag wurde am 13.01.2003 um 14:02 Uhr von Nitromaus editiert. ]



  • Fehlermeldung? Absturtz? Beschreib doch einfach was daran nicht funktioniert!



  • Du hast die D3DPRESENT_PARAMETERS-Struktur ja so gut wie gar nicht ausgefüllt! Schau mal in die Dokumentation, da musst Du noch viel mehr eintragen!



  • @TomasRiker
    Du hast dir wirklich den Code angeschaut? Mach ich nie. Ist mir doch egal. Wenn er nicht einmal sagt was für Meldungen kommen.

    @Nitromaus
    Nichts persönliches.



  • Sorry, stimmt sollt ich vielleicht wirklich dazu sagen. Bei CreateDevice returnt er INVALIDE_CALL, aber nach Sample wurden nicht mehr bei D3DPRESENT_PARAMETERS übergeben.

    Ich hät auch nicht drauf geantwort wenn ich nichtmal die fehlermeldung angegegebn hab sorry habs übersehen 😃

    Hier ist direkt der Code der auch funktioniert aus den Samples:

    //-----------------------------------------------------------------------------
    // Name: InitD3D()
    // Desc: Initializes Direct3D
    //-----------------------------------------------------------------------------
    HRESULT InitD3D( HWND hWnd )
    {
        // Create the D3D object, which is needed to create the D3DDevice.
        if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
            return E_FAIL;
    
        // Set up the structure used to create the D3DDevice. Most parameters are
        // zeroed out. We set Windowed to TRUE, since we want to do D3D in a
        // window, and then set the SwapEffect to "discard", which is the most
        // efficient method of presenting the back buffer to the display.  And 
        // we request a back buffer format that matches the current desktop display 
        // format.
        D3DPRESENT_PARAMETERS d3dpp; 
        ZeroMemory( &d3dpp, sizeof(d3dpp) );
        d3dpp.Windowed = TRUE;
        d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
        d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
    
        // Create the Direct3D device. Here we are using the default adapter (most
        // systems only have one, unless they have multiple graphics hardware cards
        // installed) and requesting the HAL (which is saying we want the hardware
        // device rather than a software one). Software vertex processing is 
        // specified since we know it will work on all cards. On cards that support 
        // hardware vertex processing, though, we would see a big performance gain 
        // by specifying hardware vertex processing.
        if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                                          D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                          &d3dpp, &g_pd3dDevice ) ) )
        {
            return E_FAIL;
        }
    
        // Device state would normally be set here
    
        return S_OK;
    }
    


  • Weiß denn keiner was, ihr löst ja sonst für Probs aber des nicht, oder einfach keine lust?

    Ich weiß nicht warum CreateDevice nenn INVALIDE_CALL liefern sollte.



  • Versuch mal mit dem Debugger ungültige Variablen zu finden, vielleicht ist ja einer deiner Parameter ungültig.

    cya 🙂



  • Eigentlich nicht, hwnd wird schon früher geprüft, und die struktut wurde gerade mit ZeroMemory gecleart und mit neuen richtigen werten beschriebn, des andere sind konstanten.

    Tja werd wohl nicht drum rumkommen des ding einfach neuzcoden.
    Bloß später wenn es komplexer wird ist sowas nichtmehr möglich.


Anmelden zum Antworten