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

1

16.10.2009, 14:49

Fehler Meldung im Log der TriBase Engine

Hallo mal wieder.

Ich programmiere zur Zeit einen Netzwerk Modus für mein aktuelles Projekt (ein rundenbasiertes Strategiespiel). Hierbei ist ein Spieler der Host, und ein (oder mehrere) Spieler der Client. Der Host kann nun ein Spiel starten, in das sich die Clienten einloggen können. An dieser Stelle sind Clienten und Host im "Vor-Spiel" Menü (einfach eine Auflistung aller Spieler, die ausgewählte Karte wird angezeigt, so wie bei fast jedem Strategiespiel). Der Host kann das Spiel nun starten, dazu wird auf dem Host Computer einfach

C-/C++-Quelltext

1
g_pDXTest->m_GameState == GS_GAME


aufgerufen.

Das klappt soweit auch. Außerdem sendet der Host via WinSock die Meldung, dass das Spiel gestartet wird an die Clienten.
Die Verarbeitung dieser Nachricht sieht wie folgt aus:

C-/C++-Quelltext

1
2
if(strncmp(buf,"start",5)==0)
    g_pDXTest->SetGameState(GS_GAME); //Spiel starten


An dieser Stelle stürzt das Spiel allerdings auf der Client-Seite immer ab. Auf der Host-Seite startet das Spiel so wie es soll.

Im Log der Tribase Engine steht:

[...]
INFO: Nachrichtenschleife wird betreten... (TriBase.cpp, Zeile 179, Funktion tbDoMessageLoop)
FEHLER: Das Modell hat keine Extradaten! (tbUtils.cpp, Zeile 1073, Funktion tbLineHitsModel)
WARNUNG: tbExit wurde nicht aufgerufen! Wird automatisch erledigt... (TriBase.cpp, Zeile 48, Funktion DllMain)
INFO: TriBase-Engine wird heruntergefahren... (TriBase.cpp, Zeile 113, Funktion tbExit)
WARNUNG: Direct3D wurde nicht heruntergefahren! Wird automatisch erledigt... (TriBase.cpp, Zeile 121, Funktion tbExit)
INFO: Die Direct3D-Komponente wurde heruntergefahren. (tbDirect3D.cpp, Zeile 313, Funktion tbDirect3D::Exit)
WARNUNG: DirectInput wurde nicht heruntergefahren! Wird automatisch erledigt... (TriBase.cpp, Zeile 128, Funktion tbExit)
INFO: Die DirectInput-Komponente wurde heruntergefahren. (tbDirectInput.cpp, Zeile 784, Funktion tbDirectInput::Exit)
WARNUNG: DirectSound wurde nicht heruntergefahren! Wird automatisch erledigt... (TriBase.cpp, Zeile 135, Funktion tbExit)
INFO: Die DirectSound-Komponente wurde heruntergefahren. (tbDirectSound.cpp, Zeile 128, Funktion tbDirectSound::Exit)
WARNUNG: Texturen werden automatisch gelöscht! Bitte die Exit-Methode von tbTextureManager aufrufen! (TriBase.cpp, Zeile 142, Funktion tbExit)
INFO: Der Texturmanager wurde heruntergefahren. (tbTextureManager.cpp, Zeile 59, Funktion tbTextureManager::Exit)
INFO: Alle Speicherbereiche freigegeben! (tbMemory.cpp, Zeile 116, Funktion tbMemExit)
INFO: Herunterfahren abgeschlossen!

Vielleicht sollte ich noch erwähnen, dass es 2 Threads gibt, die zum Empfang von Netzwerk Nachrichten verwendet werden. Einen für den Host, einen für den Clienten. Je nachdem ob man Host oder Client ist läuft aber nur einer dieser Threads. Die können sich also nicht in die Quere kommen.

Meine Frage also erstmal (bevor ich meinen gesamten Code poste^^): Kann mir jemand was zu der Fehlermeldung sagen?

Danke schonmal.

EDIT: Mir fiel grad noch ne andere Frage ein, muss ja nich extra nen neuen thread erstellen. Gibt es in der TriBase engine sowas wie eine onmouseover funktion? Ich würde nämlich gerne, dass eine Art Tooltip (Also einfach ein kleines Fenster mit Text und eventuell Bild, ohne Buttons) erscheint wenn man mit dem Cursor über einen Button oder ein beliebiges Element der TriBase GUI fährt.

2

18.10.2009, 18:53

Hat keiner 'ne Idee zu dieser Fehlermeldung?

Die betreffende Stelle in der tbUtils.cpp ist folgende:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// ******************************************************************

// Berechnung der Kollision zwischen Linie und Modell

TRIBASE_API BOOL tbLineHitsModel(const tbVector3& vLineA,
                                 const tbVector3& vLineB,
                                 const tbModel* pModel,
                                 const tbMatrix& mMatrix,
                                 const tbMatrix& mInvMatrix,
                                 const float fTolerance,    // = 0.0f

                                 tbVector3* pvOutPos,       // = NULL

                                 tbVector3* pvOutNormal,    // = NULL

                                 int* piOutTriangle)        // = NULL

{
    // Parameter prüfen

    if(!pModel)                 TB_ERROR_NULL_POINTER("pModel", TB_ERROR);
    if(!pModel->m_bExtraData)   TB_ERROR("Das Modell hat keine Extradaten!", TB_ERROR);

//[...]


Irgendwas ist also mit dem Modell nicht in Ordnung. Das Modell mit dem die Kollision überprüft wird ist mein Modell für die Karte auf der gespielt wird, also eine .tbm Datei. Es handelt sich aber natürlich um die gleiche Datei, die auch vom Host verwendet wird und da gibt es wie gesagt keine Probleme.

3

18.10.2009, 19:26

Bist du dir Sicher, dass du Die Elemente:


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
    tbVector3               m_vBoundingBoxMin;          // Minimumpunkt des umgebenden Quaders

    tbVector3               m_vBoundingBoxMax;          // Maximumpunkt des umgebenden Quaders


    BOOL                    m_bExtraData;               // Extradaten generiert?

    BOOL                    m_bExtraDataOnly;           // Nur Extradaten?

    tbModelOctreeNode*      m_pRootNode;                // Wurzelknoten des Octrees

    tbVector3*              m_pvVectors;                // Positionsvektoren der Vertizes

    DWORD*                  m_pdwIndices;               // Alle Indizes

    tbPlane*                m_pTrianglePlanes;          // Ebenen der Dreiecke (4 pro Dreieck)


auch überträgst ?

Vor allem m_bExtraData, denn dass muss ja false sein.


EDIT: Und sicher, dass du Bei DeinModel->Init () auch TRUE beim Parameter GenerateExtraData angibst ?

4

18.10.2009, 19:29

Die verwendeten Models funktionieren ja wenn man Host ist. Nur wenn man sich ins Spiel einklinkt stürzt das Programm beim Clienten ab. Das Model wird für den Clienten ja genauso geladen wie beim Host. Ich übergebe dem Clienten vom Host aus nur ne ID die ihm sagt welche Karte geladen werden soll.

Ob es hilft wenn ich BOOL m_bExtraData einfach mal explizit auf true setze?

5

18.10.2009, 20:17

Zitat


Ob es hilft wenn ich BOOL m_bExtraData einfach mal explizit auf true setze?


Probieren geht über Studieren. Mal ausprobieren, was schlimmeres als nen NULL-Zeiger kanns ja nicht geben.

Und zeig mal, wie du die Modelle lädst bei Client und Host.

6

18.10.2009, 22:00

C-/C++-Quelltext

1
2
3
    strcpy(Map.name,"testmap");
    sprintf(path,"Data\\Maps\\%s.tbm",Map.name);
    if(Map.m_pLevelModel->Init(path, "Data\\")) TB_ERROR("Error while loading Map", TB_ERROR);


Um das nochmal zu erklären, es gibt keine verschiedenen Programme für client und host. Die Funktion zum Laden der Modelle ist bei Client und Host die Selbe.

Im Grunde ist das ein Fehler der ganz leicht zu beheben wäre wenn das debuggen funktionieren würde. Aber wenn ich den debug modus starten will meldet mir die TriBase Engine, dass das Spiel nicht initialisiert werden konnte.

7

20.10.2009, 22:17

Niemand mehr ne Idee? Es sind die gleichen Modelle die mit der gleichen Funktion geladen werden. Trotzdem stürzt das Programm beim Clienten ab.

Werbeanzeige