Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Anonymous

unregistriert

1

12.07.2003, 14:26

Frage zu Kapitel 2 / 03 - Das erste Dreieck

Hallo!
Bin absoluter Newbie was Spieleprogrammierung angeht. Ich habe das Beispiel-Programm mit dem Dreieck jetzt verstanden :) Würde genau dieses Beispiel Programm gerne um das Partikel und Spritesystem der TB-Engine erweitern. Habe versucht die notwendigen Initialisierungen aus dem Galactica Beispiel zu übernehmen. Ich bräuchte mal etwas Hilfe bei der Implementierung. Hier die Schritte die ich bereits durchgeführt habe...

In "dreieck.cpp" habe ich global folgende Variablen gesetzt:
tbParticleSystem* m_pPSystem;
tbSpriteEngine* m_pSprites;
PDIRECT3DTEXTURE9 m_pSpritesTex;
tbEffect* m_pSpritesEffect;

Ich denke die Sind Grundlage für das Spritesystem:

Als nächstes habe ich mir ne kleine Funktion geschrieben:

int InitEffects(){

//TB_ERROR("Sprites wurden initialisiert...", TB_ERROR);


// Partikel-System
m_pPSystem = new tbParticleSystem;
if(m_pPSystem->Init(7500)) TB_ERROR("Fehler beim Erstellen des Partikelsystems!", TB_ERROR);

// Sprites-Textur laden
m_pSpritesTex = tbTextureManager::GetTexture("Data\\Sprites.bmp", TRUE, D3DX_DEFAULT, D3DX_DEFAULT, 1);
if(m_pSpritesTex == NULL) TB_ERROR("Fehler beim Laden der Sprites-Textur!", TB_ERROR);

// Sprite-System
m_pSprites = new tbSpriteEngine;
if(m_pSprites->Init(10000)) TB_ERROR("Fehler beim Erstellen der Sprite-Engine!", TB_ERROR);

// Effekt für die Sprites laden
m_pSpritesEffect = new tbEffect;

if(m_pSpritesEffect->Init("Data\\Sprites.fx")) TB_ERROR("Fehler beim Erstellen des Effekts für die Sprites!", TB_ERROR);
m_pSpritesEffect->GetEffect()->SetTexture("Texture", m_pSpritesTex);

return 0;
}

In dieser Funktion soll das Partikelsystem initialisiert werden. Aufrufen tue ich das ganze am Ende von tbResult InitApplication(). Kompilieren lässt sich das ganze sogar (juhuu). Aber beim starten des Programms treten dann Fehlermeldungen auf. In der Logdatei steht das Direct3D nicht initialisiert werden konnte...

Vielleicht kann mir da jemand helfen. Direct3D wird ja bevor ich Init_Effects aufrufe initialisiert... Sollte also eigentlich gehen... weitergehend müsste ich wissen, wie ich die Sprites lade... Habe die beiden Dateien sprites.bmp und sprites.fx in einen neuen Ordner "Data" innerhalb von "03 - Das erste Dreieck" kopiert.

Die Liste der Sprites die geladen werden sollen, möchte ich vorerst nicht aus einer Textdatei laden (wie in Galactica) sondern irgendwo statisch im Quelltext angeben...

Muss also im Detail wissen, wie ich das System initialisiere, wie ich die Sprites lade und wie ich letztendlich Partikel rendere... wäre super wenn mir da jemand (David?) helfen könnte...

MfG,

S. Hamann

Anonymous

unregistriert

2

15.07.2003, 20:41

...

Hi,

hat da wirklich niemand ne Antwort zu? Eine genaue Auflistung aller Funktionen und Klassen die in der Engine verfügbar sind, würde mir auch schon weiterhelfen. Habe ehrlich gesagt keine Lust stundenlang den Quelltext von Galactica zu durchforsten. Gibt es keine Aufführung, welche Abhängigkeiten und Variablen erfüllt sein müssen, damit ich eine Klasse (z.B. das Partikelsystem) einsetzen kann?

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

16.07.2003, 11:07

Hi,

diese Klassen, die Du da verwendest, arbeiten mit der TriBase-Engine. Daher erwarten sie auch, dass Du Direct3D mit Hilfe der Engine initialisiert hast. Das ist bei den Beispielprogrammen aus Kapitel 2 noch nicht der Fall.
Da musst Du schon tbDirect3D verwenden, sonst können die anderen Klassen nicht erkennen, dass Direct3D schon initialisiert wurde.

Anonymous

unregistriert

4

16.07.2003, 14:52

thx

Hi,

habe Direct-3D usw. jetzt initialisiert... habe noch 2-3 Fragen...

Wie greife ich auf die Auflösung zurück, die der Nutzer gewählt habe? Brauche das unter anderem für:

// Das Bildseitenverhältnis berechnen
fAspect = (float)(800)
/ (float)(600);

Habe da jetzt statische Werte eingebaut. Die Auflösung ist jedenfalls kein Member von tbDirect3D::GetDevice()

Ich habe jetzt versucht mit folgendem Code einige Partikel zu erzeugen... leider tut sich da nichts...

m_pPSystem->AddParticle(tbFloatRandom(0.0f, 4.0f),
0.0f, 0.0f,
tbVector3(0.0f, 0.0f, 2500.0f),
tbVector3Random() * tbFloatRandom(0.5f, 2.0f),
1.0f,
50.0f, 1500.0f,
tbColor(1.0f, 0.25f, 0.25f, 0.25f),
tbColor(0.25f, 1.0f, 0.25f, 0.0f),
tbFloatRandom(0.0f, 2.0f), tbFloatRandom(0.0f, 2.0f));
m_pPSystem->Move(1);
m_pSprites->End();



m_pSpritesEffect->Begin();


m_pSpritesEffect->Pass(0);
m_pSprites->Render();
m_pSpritesEffect->End();


Kannst du mal drüberschauen und mir evtl. nen Tipp geben? Texturen usw. habe ich geladen, lässt sich auch alles kompilieren... Will einfach ein paar Test-Partikel ausgeben... irgendwas, wo ich dann weiter mit arbeiten kann...

Gruß,

Stefan

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

5

16.07.2003, 15:13

m_pPSystem->Move(1)
das gefällt mir nicht. Du bewegst das Partikelsystem damit ja direkt eine ganze Sekunde weiter, und die Partikel könnten dann schon wieder verschwunden sein.
Die Auflösung ist in tbConfig gespeichert (tbConfig::Direct3D::iBackBufferWidth/Height glaube ich).

Anonymous

unregistriert

6

16.07.2003, 17:22

Ahhhh... da tut sich immer noch nichts... habe die Zeit jetzt einmal auf 0.1f gesetzt...
Habe da 2 Theorien
1.) Der Partikel wird nicht gerendert, habe die Parameter einfach aus Galactica übernommen... kannst du mir ein AddParticle Beispiel, für einen einfachen weißen Partikel geben mit ner Livetime von bsw. 5 Sekunden...
2.) Der Partikel wird außerhalb des sichtbaren Bereichs gerendert..

Die Weltmatrix für das Dreieck errechnet sich so:
// Rotations- und Translationsmatrix des Dreiecks erzeugen
mRotation = tbMatrixRotationY(TB_DEG_TO_RAD(g_fTime * 90.0f));
mTranslation = tbMatrixTranslation(tbVector3(0.0f, 0.0f, 2.0f));

// Beide Matrizen kombinieren und als Weltmatrix einsetzen
mWorld = mRotation * mTranslation;
tbDirect3D::GetDevice()->SetTransform(D3DTS_WORLD, (D3DMATRIX*)(&mWorld));

Jetzt weiß ich nicht wo die Partikel überhaupt hingerendert werden... wahrscheinlich aber außerhalb des Viewports... wie ändere, überprüfe ich das?

Danke!

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

7

16.07.2003, 17:49

Oh, ich sehe gerade, dass Du als Position für den Partikel (0, 0, 2500) genommen hast. Das ist natürlich vieeeel zu weit weg. Probier mal (0, 0, 10) oder so. 2500 ist wahrscheinlich schon hinter der fernen Clipping-Ebene.

Anonymous

unregistriert

8

16.07.2003, 19:02

Ne du... da tut sich nix... hier mal meine gesamte Render-Routine:

Ich weiß ich nerve etwas... aber ich bin echt Newbie was das hier angeht. Wäre echt nett, wenn du mir da weiterhelfen würdest...

tbResult Render(float fNumSecsPassed)
{
HRESULT hResult;
tbMatrix mRotation; // Rotationsmatrix
tbMatrix mTranslation; // Translationsmatrix
tbMatrix mWorld; // Vereinende Weltmatrix


// Rotations- und Translationsmatrix des Dreiecks erzeugen
mRotation = tbMatrixRotationY(TB_DEG_TO_RAD(g_fTime * 45.0f));
mTranslation = tbMatrixTranslation(tbVector3(0.0f, 0.0f, 2.0f));

// Beide Matrizen kombinieren und als Weltmatrix einsetzen
mWorld = mRotation * mTranslation;
tbDirect3D::GetDevice()->SetTransform(D3DTS_WORLD, (D3DMATRIX*)(&mWorld));

// -------------------------------------------------------------

// Den Bildpuffer und den Z-Buffer leeren
if(FAILED(hResult = tbDirect3D::GetDevice()->Clear(0,
NULL,
D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
D3DCOLOR_XRGB(0, 0, 63),
1.0f,
0)))
{
// Fehler beim Leeren!
MessageBox(g_hWindow, "Fehler beim Leeren der Puffer!",
"Fehler", MB_OK | MB_ICONEXCLAMATION);
TB_ERROR_DIRECTX("tbDirect3D::GetDevice()->Clear", hResult, TB_STOP);
}

// Szene beginnen
tbDirect3D::GetDevice()->BeginScene();

// Nun das Dreieck zeichnen
if(FAILED(hResult = tbDirect3D::GetDevice()->DrawPrimitiveUP(D3DPT_TRIANGLELIST, // Dreiecksliste
2, // 1 Dreieck
g_aTriangleVertex, // Vertexdaten
sizeof(SVertex)))) // Vertexgröße
{
// Fehler beim Zeichnen!
MessageBox(g_hWindow, "Fehler beim Zeichnen des Dreiecks!",
"Fehler", MB_OK | MB_ICONEXCLAMATION);
TB_ERROR_DIRECTX("g_pD3DDevice->DrawPrimitiveUP", hResult, TB_STOP);
}
// Partikel und Sprites rendern


// m_pSprites->Begin();

m_pPSystem->AddParticle(tbFloatRandom(0.0f, 4.0f),
0.0f, 0.0f,
tbVector3(0.0f, 0.0f, 10.0f),
tbVector3Random() * tbFloatRandom(0.5f, 2.0f),
1.0f,
50.0f, 1500.0f,
tbColor(1.0f, 0.25f, 0.25f, 0.25f),
tbColor(0.25f, 1.0f, 0.25f, 0.0f),
tbFloatRandom(0.0f, 2.0f), tbFloatRandom(0.0f, 2.0f));

m_pPSystem->Move(fNumSecsPassed);
m_pPSystem->AddToSpriteEngine(m_pSprites);
m_pSprites->End();



m_pSpritesEffect->Begin();


m_pSpritesEffect->Pass(0);
// tbDirect3D::SetTransform(D3DTS_WORLD, (D3DMATRIX*)(&mWorld));
m_pSprites->Render();
m_pSpritesEffect->End();


// Szene beenden
tbDirect3D::GetDevice()->EndScene();

// Der große Moment: den Bildpuffer sichtbar machen
tbDirect3D::GetDevice()->Present(NULL, NULL, NULL, NULL);

return TB_OK;


}

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

9

16.07.2003, 19:50

Warum ist folgende Zeile auskommentiert?
m_pSprites->Begin();

Und steht etwas in der Logbuchdatei?

Anonymous

unregistriert

10

16.07.2003, 20:39

Da hat er einen Parameter erwartet, den ich nicht kannte... Außerdem wurde das m_pSprites->Begin(); auch in Galactica nicht verwendet... habe das einfach mal auf "Gut Glück" da eingesetzt...

In der Logbuchdatei steht nur, dass das Direct3D Modul nicht ordnungsgemäß beendet wurde... habe das noch nicht implementiert... aber daran kann es nicht liegen...

Irgendwo ist da gewaltig der Wurm drin, aber ich komm einfach nicht drauf...

Werbeanzeige