Achso.
Ist prinzipiell nicht anderes als ein Spiel mit vorgeschaltetem Launcher.
Könntest daher trotzdem auf zwei ausführbare Dateien (einmal "Launcher" mit der ganzen Mathematik usw und einmal die 3D-Ausgabe) aufteilen, um das Problem zu umschiffen.
Kannst diese zwei natürlich wieder vereinen.
Dann wird die Engine als zweiter Prozess gestartet.
Wie du die Ausgabedaten rüberbekommst... suche dir was aus:
- Daten als Parameter mitgeben, wenn es nicht zu viele sind
- Temporäre Datei und Pfad zu dieser als Übergabeparameter (diese Variante habe ich für das nachfolgende Beispiel genommen)
- Direkte Kommunikation über stdin/stdout (Ich weiß nicht 100%ig, ob Windows da mitspielt, da dieses AFAIK zwischen Konsolen- und Nicht-Konsolen-Anwendung unterscheidet)
- Network-Library (Echtzeitkommunikation, bei der Server und Client auf demselben Host laufen, also nicht wirklich Netzwerk). Musst dir halt eine Schnittstelle bauen. Mit PB relativ einfach.
Beispiel (primitiv, ohne Fehlerhandling):
Code: Alles auswählen
Procedure Run3DView()
;In echt kommt hier das Ogre-Gedöns rein
tmpFile$ = ProgramParameter()
If tmpFile$
file = ReadFile(#PB_Any,tmpfile$)
If file
text$ = ReadString(file)
CloseFile(file)
If text$ ;obacht! Die Daten vor Verwendung auf Korrektheit prüfen. Sonst evtl. Sicherheitslücke!
MessageRequester("Bla","Die Texteingabe ist: "+text$,0)
EndIf
EndIf
EndIf
EndProcedure
Procedure runLauncher()
mainWin = OpenWindow(#PB_Any,#PB_Ignore,#PB_Ignore,512,384,"Launcher",#PB_Window_ScreenCentered)
textbox = StringGadget(#PB_Any,8,8,256,20,"")
button = ButtonGadget(#PB_Any,256+8,8,20,20,"Fire!")
Repeat
event = WaitWindowEvent()
If event = #PB_Event_Gadget
If EventGadget() = button
text$ = GetGadgetText(textbox)
If text$
tmpPath$ = GetTemporaryDirectory()
If tmpPath$
tmpFile$ = tmpPath$ + "purebasic_ogre_bla.dat" ;Vorsicht! Nicht mit den Tempdateien anderer Programmen kollidieren! In Echt einen eigenen Unterordner verwenden und noch einen Hashwert mit rein (damit mehrere Instanzen möglich sind)!
file = OpenFile(#PB_Any,tmpFile$)
WriteString(file,text$)
CloseFile(file)
;Datei wieder löschen nicht vergessen! (mache ich jetzt nicht^^. Der zweite Prozess muss irgendwie an den ersten zurückmelden, dass er die Datei ausgelesen hat und dann weg damit. Oder dem zweiten Prozess die Löschung überlassen)
If file
RunProgram(ProgramFilename(), "-view " + tmpFile$,GetCurrentDirectory()) ;Die 3D-Ausgabe starten
EndIf
EndIf
EndIf
EndIf
EndIf
Until event = #PB_Event_CloseWindow
EndProcedure
If ProgramParameter() = "-view"
Run3DView()
Else
RunLauncher()
EndIf
End