[DirectX] Sprites werden ungewollt skaliert



  • hm... also ich glaub ich versteh nich genau was den problem is. Der code sieht ganz gut aus.

    Wenn deine Textur 512*512 Pixel groß ist, dann wird die eigentlich auch in der Größe dargestellt. versuch mal dein Fenster auch in der Größe 512*512 zu erstellen. Dann müsste das sprite das Fenster füllen. Wenn nciht, läuft (meiner meinung nach was schief)



  • Ich habe mein Problem mal dokumentiert, habe eine kleine Gif-Datei erstellt.
    Der Frame vom Gif mit der Schrift 'Hallo' und den Figuren (deplatziert? joa..) ist das was mir das Programm zeigt, der andere Frame auf dem nur das Brett zu sehen ist ist die original Textur (mit Bildbearbeitung drübergelegt; also so sollte es aussehen..) Hellblau ist die ClearColor von DX; man sieht also, dass der Sprite tatsächlich gestaucht wird.
    Das Fenster ist so angepasst, dass die 512x512 Textur gerade reinpasst (sogar mit Rändern und Balken angerechnet etc..).

    Hier mal das Gif:
    http://mitglied.lycos.de/krazzomat/schach.gif

    Wahrscheinlich steckt ein winziger Fehler dahinter, aber ich komm beim besten Willen nicht drauf..



  • muss man beim zeichnen nicht ein D3DXSPrite::Begin() und End() machen? fällt mir grad ein.
    welches sdk verwendest du? in der sdk-doku zu dx9c hat Draw auch nur 5 Parameter.

    und versuch mal vor dem malen sowas:

    D3DXMaxtrix id;
    D3DXMatrixIdentity(&id);
    sprite->SetTransform(id);
    
    sprite->Draw()
    


  • Ich benutze DX 9.0 SDK..

    Maxi schrieb:

    muss man beim zeichnen nicht ein D3DXSPrite::Begin() und End() machen? fällt mir grad ein.

    Hmm, ich weiß nicht ob du das meinst, ich benutze:

    //Start/Beenden der Szene 
    void CDirect3D::BeginScene(void)
    {
        m_lpD3DDevice->Clear(0,0,D3DCLEAR_TARGET,m_ClearColor,0,0);
    
        m_lpD3DDevice->BeginScene();
    }
    
    void CDirect3D::EndScene(void)
    {
        m_lpD3DDevice->EndScene();
    
        m_lpD3DDevice->Present(0,0,0,0);
    }
    

    Deinen Code, konnte ich leider nicht wirklich einbauen. D3DXMatrix nimmt er irgendwie nicht an.



  • du musst die header für d3dx einbinden.

    also #include <d3dx9.h>

    ich meine sowas:

    sprite->Begin();
    sprite->Draw(...)
    sprite->End()

    Leider kenn ich mich aber auch nich sehr gut mit id3dxsprite aus



  • Der Typ heißt D3DXMATRIX, nicht D3DXMatrix.



  • Danke für eure Hilfe..

    Also das mit der Matrix funktioniert nicht ganz, nämlich wird der Befehl SetTransform nicht erkannt.

    'SetTransform' : Ist kein Element von 'ID3DXSprite'
    c:\dxsdk\include\d3dx9core.h(213) : Siehe Deklaration von 'ID3DXSprite'



  • du hastn anderes sdk als das in der msdn-online-doku. sorry, kann ich dir dann auch ncih helfen 😞



  • Schade..

    Nunja also ich habe mal ein Beispielprogramm von der CD meines Lernbuches ausprobiert.. Das Programm lief im Fullscreen und als ich es in ein Fenster umgewandelt habe (so wie ich das mache, vielleicht mache ich dabei ja etwas falsch oder vergesse, dass man dazu noch etwas umstellen muss..) trat das gleiche Problem auf: Das Sprite war verschwommen und nicht in originaler Größe.

    Nun, was habe ich zum Einstellen von Vollbild -> Fenster gemacht:

    // Direct3D initialisieren
        if(!Direct3D.Init(hWnd,TRUE))        // TRUE = bWindowed: Fenster
        {                                    // Davor stand hier FALSE für Vollbild
            return -1;
        }
    

    Direct3D ist eine Instanz von CDirect3D.. Init siehe hier:

    // Direct3D initialisieren
    BOOL CDirect3D::Init(HWND hWnd, BOOL bWindowed)
    {
        // Direct3D-Objekt erzeugen
        m_lpD3D = Direct3DCreate9(D3D_SDK_VERSION);
    
        if(NULL == m_lpD3D)
        { 
            // Fehler, D3D-Objekt wurde nicht erzeugt
            return FALSE;
        }
    
        // Parameter für den Modus festlegen
        D3DPRESENT_PARAMETERS PParams;
        ZeroMemory(&PParams,sizeof(PParams));
    
        PParams.SwapEffect       = D3DSWAPEFFECT_DISCARD;
        PParams.hDeviceWindow    = hWnd;
        PParams.Windowed         = bWindowed;     //Also steht hier TRUE für mein Fenster
    
        PParams.BackBufferWidth  = SCR_WIDTH;
        PParams.BackBufferHeight = SCR_HEIGHT;
        PParams.BackBufferFormat = D3DFMT_A8R8G8B8;
    
        HRESULT hr;
    
        // Direct3D-Gerät anlegen
        if(FAILED(hr = m_lpD3D->CreateDevice(
                                     D3DADAPTER_DEFAULT,
                                     D3DDEVTYPE_HAL,
                                     hWnd,
                                     D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                     &PParams,
                                     &m_lpD3DDevice)))
        {
            // Fehler, Gerät kann nicht angelegt werden
            const char* Err = DXGetErrorDescription9(hr);
    
            DXTRACE_MSG(Err);
    
            return FALSE;
        }
    ..
    
    }
    

    Dies wollte ich noch los werden, wohl als letzte Chance mein Problem zu lösen.. Vielleicht kann ja jemand was damit anfangen und mir helfen.
    Danke nochmal für eure Mühe!



  • Also irgendwie seh ich kein Problem. f'`8k

    Gruß, TGGC (\-/ has leading)


Anmelden zum Antworten