Was kann ich gegen dieses Problem machen? (DirectX & C++)



  • Es geht mir ja darum, das Viereck von links nach rechts zu bewegen, also müssen doch jedes Mal die X Koords z.B. + 0.05 sein.
    doch wie und wo kann ich das machen?
    Also sie aktualisieren?

    Darum gehts mir



  • Da gibts mehrere Möglichkeiten. Schau z.B. IDirect3DDevice9::SetTransform an.

    Bye, TGGC \-/



  • Ich würd saber der Einfachheit erstmal nur mit aktualisieren der Koords machen.
    Das klappt ja auch!
    Nur sicherlich ist meine funktion da an der falschen Stelle

    Aber wo liegt eigentlich der Fehler, das das Programm ständig mehr Arbeitsspeicher verbrauchen lässt? 😞



  • Hi,
    du hast doch deine MessageSchleife. Und dann machst du dir einfach noch zwei Funktionen, eine die rendern kann und die andere bewegt das Objekt. In jedem Durchgang erhöst du dann die globalen Vertices Koordinaten um einen bestimmten Wert und des rendern müsste klar sein.
    mfg juli



  • @ jube
    Und was reicht zum Bewegen des Objektes?
    Also ich aktualisiere die Variable TVertex, was muss dann noch sein?
    Muss auch die Textur laden funktion wieder in die Schleife?

    sorry, aber wie gesagt fange erst gerade damit an.

    Weil so wie ich es habe, die komplette Funktion SetNewGeometry, lässt wohl den Arbeitsspeicher voll werden, da stimmt was nicht.



  • DaMiNaToR schrieb:

    Ich würd saber der Einfachheit erstmal nur mit aktualisieren der Koords machen.

    Ich würd saber der Einfachheit erstmal nur ohne aktualisieren der Koords machen.

    Bye, TGGC \-/



  • öhm, ich hoffe das hat jetzt noch keiner gesagt:
    dir ist doch aber schon klar, dass du in setnewgeometry immer einen neuen vertex und index buffer erstellst...? ohne die alten zu releasen...? oder hab ich das jetzt falsch gesehen? sorry, wenn ja, dürft ihr mich schlagen. 😉
    nee, mal im ernst, was an deiner funktion nicht stimmt ist meiner meinung nach genau das, du erstellst bei jedem rendern einen neuen vertex- und indexbuffer, ohne die alten zu löschen. nimm aus setnewgeometry einfach die CreateVertex/IndexBuffer methoden raus.

    "Was muss dann noch sein?"
    der rest der funktion kann so bleiben glaub ich, vertex und index buffer locken und aktualisierte daten reinschreiben.

    "Muss auch die Textur laden funktion wieder in die Schleife? "
    um gottes willen nein., sonst würde das gleiche passieren, immer mehr ram würde verschwendet.

    hoffe, ich hab jetzt nichts sinnloses oder so geschrieben... 😉
    cya



  • Juhu danke, es klappt jetzt 🤡
    Danke Babo das wars! super!

    Jetzt habe ich es so->

    VOID SetNewGeometry()
    {
    
    	static TVertex v[4];	
    
    	static float x1=-0.5f,x2=0.5f;
    	static float x3=-0.5f,x4=0.5f;
    
    	x1=x1+0.0005f;x2=x2+0.0005f;
    
    	x3=x3+0.0005f;x4=x4+0.0005f;
    
    	v[0].position = D3DXVECTOR3(x1,0.5f, 0.0f);
    	v[0].color	  = D3DCOLOR_XRGB(255,255,0);
    	v[0].tu		  = 0.0f;
    	v[0].tv		  = 0.0f;
    	v[1].position = D3DXVECTOR3( x2, 0.5f,0.0f);
    	v[1].color	  = D3DCOLOR_XRGB(0,255,0);
    	v[1].tu		  = 1.0f;
    	v[1].tv		  = 0.0f;
    	v[2].position = D3DXVECTOR3( x3,-0.5f, 0.0f);
    	v[2].color	  = D3DCOLOR_XRGB(255,255,255);
    	v[2].tu		  = 0.0f;
    	v[2].tv		  = 1.0f;
    	v[3].position = D3DXVECTOR3( x4,-0.5f, 0.0f);
    	v[3].color	  = D3DCOLOR_XRGB(255,0,0);
    	v[3].tu		  = 1.0f;
    	v[3].tv		  = 1.0f;
    
    	WORD wIndices[6] =	{ 
    							0,1,2, // Dreieck 1
    							1,2,3  // Dreieck 2
    						};
    	VOID *pInd;	// Pointer auf die IndexDaten
    
    	D3D_IndexBuffer->Lock(0,sizeof(wIndices),(BYTE**)&pInd,0);
    
    	memcpy(pInd,&wIndices[0],sizeof(wIndices));
    
    	D3D_IndexBuffer->Unlock();
    
    	VOID* pVertex;	// Pointer auf die Vertices
    
    	D3D_VertexBuffer->Lock( 0, sizeof(v), (BYTE**)&pVertex, 0 );
    
    	memcpy( pVertex, v, sizeof(v) );
    	D3D_VertexBuffer->Unlock();
    
    }
    

    Der Elefant wird verschoben, so habe ichs mir vorgestellt.

    Jetzt noch 2 kleine fragen am Rande:

    1. Gibt es da noch etwas, das überflüssig ist?

    2. Wie schnell sich das Viereck bewegt, hängt ja auch von der FPS Rate ab, die ist überall wohl anders. Benutzen die Programmierer da Formeln für, damit das überall gleichschnell läuft?

    DaMiNaToR™



  • nein.
    man stoppt die zeit die zwischen dem letzten und dem aktuellen frame vergangen ist und bewegt die objekte dann immer um die entspr. zeitdifferenz weiter.



  • Dieses Problem kann der Poster IMHO selbst lösen. Unter Umständen ist dazu eines der folgenden Hilfsmittel zu nutzen:
    - Dokumentation zur benutzen API
    - google
    - FAQ/Suche dieses Boards
    - Debugger
    - geringe Mengen Gehirnschmalz

    Dieses Posting wurde nicht automatisch generiert sondern per Hand eingefügt. Beschwerden werden trotzdem ignoriert.

    Disclaimer: dies ist kein direkter persönlicher Angriff.

    Bye, TGGC (Reden wie die Großen)



  • DaMiNaToR schrieb:

    2. Wie schnell sich das Viereck bewegt, hängt ja auch von der FPS Rate ab, die ist überall wohl anders. Benutzen die Programmierer da Formeln für, damit das überall gleichschnell läuft?

    Was dot schon sagte. Am Anfang mit timeGetTime. Später kannst'e dann auf High Performance Counter (google) umsteigen. 👍


Anmelden zum Antworten