GUI Oberfläche



  • Hallo,

    ich habe mir mit Hilfe von Sprites eine GUI in DirectX gebaut.
    Allerdings habe ich Probleme beim zeichnen der Sprites wenn sie nicht quatratisch sind (glaube zumindest das es daran liegt).

    Wenn ich einen Button Zeichnen besteht dieser aus 3 Teilen:
    Der linke Teil des Buttons: http://www.der-knob.de/_temp/normal_left.png
    Der rechte Teil des Buttons: http://www.der-knob.de/_temp/normal_right.png
    Die mittlere Teil des Buttons (wird so oft wiederhold, wie der Button breit ist): http://www.der-knob.de/_temp/normal.png
    Dann kommt noch ein Icon und / oder Text hinzu.

    So sieht das Ergebniss aus: http://www.der-knob.de/_temp/gui.jpg
    Is natürlich nicht so toll. Ich weiß nicht genau warum auf der rechten Seite z.B. eine vertikale Linie gezeichnet wird oder warum Lücken zwischen den einzelnen Bereichen sind. Ich denk mal das liegt am skalieren... wenn ja, wie kann ich das vermeiden?
    Den änlichen Code verwende ich auch in der WinAPI Version des Programmes und hier ist alles ok...

    Alle Bilder sind PNG's - aber mit JPG hab ich das selbe Problem...

    Hier sind die zwei wichtigen Funktion zum laden und zeichnen:

    void CPicture::Load(const std::string fileName)
    {
    	CleanUp();
    
    	D3DXIMAGE_INFO info;
    	m_FileName = fileName;
    	if(D3DXCreateTextureFromFileEx(k3Engine::Core::CGame::GetDevice(), fileName.c_str(), D3DX_DEFAULT,
    		D3DX_DEFAULT, D3DX_DEFAULT, 0, D3DFMT_UNKNOWN, D3DPOOL_DEFAULT, D3DX_FILTER_LINEAR,
    		D3DX_FILTER_NONE, 0, &info, 0, &m_Image) != D3D_OK)
    	{
    		m_Image = NULL;
    	}
    	D3DSURFACE_DESC desc;
    	m_Image->GetLevelDesc(0,&desc);
    
    	m_iWidth = info.Width;
    	m_iHeight = info.Height;
    
    	m_vScaling.x = (float) ((float) info.Width / (float)desc.Width);
    	m_vScaling.y = (float) ((float) info.Height / (float)desc.Height);
    	return;
    }
    
    void CPicture::Draw(int x, int y)
    {
    	D3DXMATRIX matScale;
    
    	float posX, posY;
    	posX = x / m_vScaling.x;
    	posY = y / m_vScaling.y;
    
    	D3DXVECTOR3 position(posX, posY, 0.0f);
    
    	D3DXMatrixScaling(&matScale,m_vScaling.x,m_vScaling.y,1.0f);
    
    	LPD3DXSPRITE spriteInterface = k3Engine::Core::CGame::GetSpriteInterface();
    
    	spriteInterface->SetTransform(&matScale); 
    	spriteInterface->Draw(m_Image, NULL, NULL, &position, D3DCOLOR_XRGB(255, 255, 255));  // draw it!
    }
    

    Hatte jemand eine Idee woran es liegt und wie ich das beheben kann?





  • genau was ich suche 😉
    werde es ausprobieren... Danke!



  • Sorry, aber ich krieg es nicht hin 😞

    Ich habe versucht bei:
    spriteInterface->Draw(m_Image, NULL, NULL, &position, D3DCOLOR_XRGB(255, 255, 255));
    den zweiten parameter entsprechend zu setzten... klappt aber nicht, bin auch nicht sicher ob das richtig ist.
    So weit ich das verstehe verwenden die in dem gelinkten Beitrag keine Sprites sondern nehmen die Bilder als Texturen.

    Kann mir noch mal jemand helfen 🙄



  • dir helfen die texture addressing modes.
    aber sprites sind beim thema gui (elemente mit praezisen ausmassen) einfach fehl am platz.



  • hellihjb schrieb:

    aber sprites sind beim thema gui (elemente mit praezisen ausmassen) einfach fehl am platz.

    Ich bitte um Belege fuer diese Aussage. Ich sehe keinen Widerspruch zwischen Elementen mit "praezisen Ausmaßen" und Sprites.
    Wie wuerdest du die Elemente einer GUI denn darstellen (moeglichst nicht D3D spezifisch)?



  • "Sprites" (im Rahmen von Direct3D) bedeutet, dass ich ein (zunaechst) quadratisches Element anhand von Mittelpunkt und Kantenlaenge (gegeben durch die Groesse der Textur) definiere und dann durch eine geeignete Skalierungsmatrix (oder durch Kacheln vieler Einzelteile) auf die Groesse bringe die ich eigentlich will.
    Natuerlich fuehrt das auch zum Ziel, ist in meinen Augen aber umstaendlich, unflexibel und problematisch.
    Zugegeben denke ich beim Stichwort "GUI" aber auch an Anforderungen die hier vermutlich nicht erforderlich sind...



  • hellihjb schrieb:

    Zugegeben denke ich beim Stichwort "GUI" aber auch an Anforderungen die hier vermutlich nicht erforderlich sind...

    und das wäre? Wenn es eine andere Methode gibt die besser ist, dann probier ich die gerne aus...
    Habe genauso wie DeSoVoDaMu keine Ahnung wie ich sonst eine GUI darstellen sollte (also ohne 3D Objecte)

    Werde mir mal texture addressing modes anschauen. Danke schon mal!



  • Hallo!

    Ich verwende für die Darstellung meiner GUI untransformierte Vertices. Da sind die jeweiligen x und y Koordinaten dann ja schon identisch mit dem Bildschirmkoordinaten und somit sind Lücken ect. ausgeschlossen.

    Wie es im Kern umgesetzt werden kann ist hier sehr ausführlich beschrieben:

    http://www.chadvernon.com/blog/tutorials/managed-directx-2/

    Gruß
    Markus


Log in to reply