CreateEntity() Problem

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Schobaer
Beiträge: 21
Registriert: 25.07.2009 10:41
Wohnort: Berge

CreateEntity() Problem

Beitrag von Schobaer »

Moin,

kann mir jemand sagen, warum bei einigen Mesh das hier klappt
CreateEntity(#EntityTest4,MeshID(LoadMesh(#PB_Any,"AKM.mesh")),MaterialID(#MaterialImageGold))

und bei anderen Mesh ich das so machen muss?
LoadMesh(1,"Cylinder.mesh")
CreateEntity(#EntityTest4,MeshID(1),MaterialID(#MaterialImageGold))

So klappt es ebenfalls nicht. Die beiden Befehle müssen getrennt sein und LoadMesh() darf nicht nicht mit #PB_Any aufgerufen werden.
CreateEntity(#EntityTest4,MeshID(LoadMesh(1,"Cylinder.mesh")),MaterialID(#MaterialImageGold))

Das merkwürdige ist es, dass das nicht bei allen Mesh so ist. In den PB-Beispielen gibt es das AKM.mesch. Damit klappt die verschachtelte Variante. Mit dem Barrel.mesh klappt es wieder nicht. LoadMesh(#PB_Any,"Barrel.mesh") gibt eine gültige Nummer zurück. MeshID(ZurückGegebeneNummer) gibt dann "Das angegebene 'Mesh in nicht initialisiert" zurück. Warum? Das Mesh wurde doch richtig geladen!

Bin auf die Erklärung schon mal gespannt

PS: Für die Erstellung der Mesh benutze ich Blender mit dem Blender2Ogre Exporter (erstellt eine XML die dann mit den Ogre-Tools in ein .Mesh umgewandelt wird).
Gruß, Schobaer
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: CreateEntity() Problem

Beitrag von STARGÅTE »

Wenn du bei LoadMesh() #PB_Any verwendest, dann wird eine Mesh-Nummer zurückgegeben.
Verwendest du eine Konstante oder Zahl, wird sofort die Mesh-ID zurückgegeben.

Das heißt, um an eine MeshID zu kommen, wie sie CreateEntity() verlangt kannst du diese Varianten verwenden.
  • LoadMesh(#Konstante)
  • LoadMesh(123)
  • MeshID(LoadMesh(#PB_Any))
Alle anderen sind falsch.

In allen Fällen, solltest du mit IsMesh() prüfen, ob die Mesh-Nummer gültig ist, also das Mesh geladen wurde!
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Re: CreateEntity() Problem

Beitrag von PMV »

STARGÅTE hat geschrieben:In allen Fällen, solltest du mit IsMesh() prüfen, ob die Mesh-Nummer gültig ist, also das Mesh geladen wurde!
Meine Erinnerung besagt ... finger weg von den "IsXXX()" Befehlen,
Freak oder Fred hat mal geschrieben, das diese nur für Debug-Zwecke
vorhanden sind und nicht für Produktivzwecke. Grund ist auch recht
einfach ... was auch immer die IsXXX() machen, wer ordentlich
programmiert braucht sie nicht, da jede Funktion, die ein PB-Objekt
erstellt, auch direkt zurück gibt, ob das geklappt hat oder nicht.

Zur Laufzeit ist es dann ein leichts zu wissen, ab wann ein Objekt
bewusst zerstört wurde. Wenn Objekte dagegen plötzlich nicht
mehr vorhaden sein können, nennt man so was Bug. :wink:

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: CreateEntity() Problem

Beitrag von STARGÅTE »

Zur Laufzeit ist es dann ein leichts zu wissen, ab wann ein Objekt
bewusst zerstört wurde. Wenn Objekte dagegen plötzlich nicht
mehr vorhaden sein können, nennt man so was Bug.
Das ist richtig. Allerdings wird es hin und wieder schwierig wenn Vererbung mit hinzu kommt.
Wenn ich schreibe:
MeinObjekt = CreateObject()
dann kann ich mit If MeinObjekt prüfen ob es erfolgreich erstellt wurde.
Wenn ich dann FreeObject() aufrufe, setze ich MeinObjekt = 0 und die Sache ist geregelt.
Nun kann es aber sein, dass ich MeinObjekt an unbestimmte viele andere Objekte übergeben habe.
Nun müsste ich also bei einem FreeObject() alle möglichen Partner finden und dort auch die Nummer löschen.
Um das nicht zu müssen, überprüft jeder andere halt mit IsObject(), ob die Nummer noch gültig ist.

Allerdings muss ich hier betonen, dass IsXXX() sehr langsam wird, wenn es viele Elemente gibt, da hier ja eine Stück-für-Stück-Prüfung stattfindet.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Re: CreateEntity() Problem

Beitrag von PMV »

Wem das zu kompliziert ist sollte sich vielleicht überlegen, ob
er nicht besser bei den einfachen Sachen bleiben sollte. :twisted:
:bounce:
kleiner Spaß :wink:

Ich hab auch die wildesten Konstelationen und trotzdem noch
nie IsXXX() benutzen müssen. Mit Threads ist das so wie so
nicht möglich, da es damit nicht Threadsicher umsetzbar ist.
Mir wäre die Funktion aber auch so oder so zu langsam.

Verbieten wollt ich dir die Nutzung nicht ... nur Anfängern
solltest du die Vorgehensweise nicht Nahelegen. :D

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Schobaer
Beiträge: 21
Registriert: 25.07.2009 10:41
Wohnort: Berge

Re: CreateEntity() Problem

Beitrag von Schobaer »

Danke Stargate. Jetzt wird es mir klarer, warum es so ist.
Hat sich hier schon mal jemand mit Blender beschäftigt und die dort erstellten und textuierten Mesh erfolgreich in PB mit den Texturen eingebunden? Bei mir werden die Mesh angezeigt etc. Nur die Texturen werden nicht dargestellt. Farben aus den Scripten schon, nur die Images eben nicht. Kann dem Entity auch kein Material zuweisen.

Das hier funktioniert nicht. Das Mesh wird richtig angezigt, aber ohne Material. Ist ein Mesh aus Blender.

Code: Alles auswählen

CreateMaterial(1, LoadTexture(1, "Steinwand.jpg"))
LoadMesh(1,"Cube.001.mesh")
CreateEntity(#EntityTest4,MeshID(1),MaterialID(1))
ScaleEntity(#EntityTest4,1,1,1)
MoveEntity(#EntityTest4,0,15,0)
Das hier ist ein normaler Cube mit PB erstellt und mit Material. Das klappt. Hier kann ich auch das Material "Steinwand" aus dem Materialscript zuweisen oder irgend ein anderes Material.

Code: Alles auswählen

CreateEntity(#EntityTest3,MeshID(CreateCube(#PB_Any, 0.5)),MaterialID(#MaterialScriptSteinwand))
ScaleEntity(#EntityTest3,10,10,10)
MoveEntity(#EntityTest3,25,0,0)
Was muss ich machen, damit die Mesh mit Blender erstellten Mesh hier richtig laufen bzw. die Texturen angezeigt werden?

Ich glaube, ich bin zu blöd für 3D :(
Gruß, Schobaer
Antworten