beiliegend ist mein Code. Was ich noch vergessen habe einzubauen ist, dass das Programm die Engine3D.dll findet (Oder funktioniert es? Probiert es mal aus).
Wie schon mit Kommentaren angemerkt, muss man bei mir einfach den Teil der Terrainerstellung rausmachen, dann funktioniert es einwandfrei.
Code: Alles auswählen
EnableExplicit
Structure bound2D
minX.d
maxX.d
minZ.d
maxZ.d
EndStructure
Structure Vektor3
x.d
y.d
z.d
EndStructure
Structure meshEnt
entNr.i
meshID.i
EndStructure
Structure meshEntZu Extends meshEnt
typ.i
zugehoer.i
EndStructure
Structure life
max.i
akt.i
EndStructure
Structure stufenLife Extends life
stufe.i
EndStructure
Structure obVer Extends meshEntZu
koord.Vektor3
winkel.Vektor3
leben.life
EndStructure
Structure baumGadget
lebenZeit.stufenLife
lebenPunkte.life
EndStructure
Structure treeVer Extends baumGadget
typ.i ;Baumtyp (Siehe ObjekteIndex.pb -> BaumIndex)
aeste.meshEnt[12] ;Array der Entitynummern und MeshIDs der Äste(0 = Ast nicht da, sonstiges schon.) / Hier anders, 12 Äste, keine 13!
wurzel.i ;Entitynummer der Wurzel.
stamm.i ;Entitynummer des Stamms.
blaetter.i
EndStructure
Structure terVer
terrainNr.i
baumStatic.i ;Nummer der statischen Geometry, welche für die Bäume dieses Terrains gilt.
inVer.i
List Objekte.obVer()
List Baeume.treeVer()
EndStructure
Global Dim Meshes.i(100000) ;Array für die Meshes, 100001 Objekte sind als Standart drin. (Geteilt)
Global Dim terrain.terVer(0, 0) ;-Standartwert für das Terrainarray, eine Liste aus 1x1.
Global.i breite = 1920, hoehe = 1080, weltGroesse, sichtDistanz
Define.i Event
Global.s speicherPfad
#G_Welt = 512
#G_Heightmap = 513
;Kameras
Enumeration
#kam_0
EndEnumeration
;Fenster
Enumeration
#Window_Screen
EndEnumeration
;Menüs
Enumeration
#Menu_0
EndEnumeration
;Menüitems
Enumeration
#Item_0 ;Neu
EndEnumeration
;Lichter
Enumeration
#Licht_0
EndEnumeration
Procedure.i TerrainTile(weltXZ.f, weltGroesse.i, groesseWE.i) ;Berechnet in welchem Terrain das Event stattfindet.
If weltXZ < 0
ProcedureReturn 0
ElseIf weltXZ > weltGroesse * groesseWE
ProcedureReturn weltGroesse -1
Else
ProcedureReturn Int(weltXZ / groesseWE)
EndIf
EndProcedure
Procedure CreateTerrainEnt(terrainX.i, terrainY.i) ;Erstellt alle Entities, die zum angegebenen Terrain gehören.
Protected.i groesse
With terrain(terrainX, terrainY)
Debug 1
If IsStaticGeometry(terrain(terrainX, terrainY)\baumStatic)
FreeStaticGeometry(terrain(terrainX, terrainY)\baumStatic)
EndIf
Debug "" + terrainX + "X" + terrainY
groesse = #G_Welt * weltGroesse
terrain(terrainX, terrainY)\baumStatic = CreateStaticGeometry(#PB_Any, groesse, 10000, groesse, #True)
Debug 2
BuildStaticGeometry(\baumStatic)
EndWith
EndProcedure
Procedure ErneuerTerrain() ;Erneuert das Terrain (Dessen Kacheln) auf die derzeitige Kameraposition. (Geteilt)
Protected.bound2D terrains
Protected.i terrainX, terrainZ
terrains\maxX = TerrainTile(CameraX(#kam_0) + sichtDistanz, weltGroesse, #G_Welt)
terrains\minX = TerrainTile(CameraX(#kam_0) - sichtDistanz, weltGroesse, #G_Welt)
terrains\maxZ = TerrainTile(CameraZ(#kam_0) + sichtDistanz, weltGroesse, #G_Welt)
terrains\minZ = TerrainTile(CameraZ(#kam_0) - sichtDistanz, weltGroesse, #G_Welt)
For terrainX = terrains\minX To terrains\maxX
For terrainZ = terrains\minZ To terrains\maxZ
If terrain(terrainX, terrainZ)\inVer = 0
terrain(terrainX, terrainZ)\terrainNr = CreateTerrain(#PB_Any, #G_Heightmap, #G_Welt, 1, 0, speicherPfad + "\terrain" + terrainX + "X" + terrainZ, "Dat") ;-OOOOO Hier Kommentar Anfang
TerrainLocate(terrain(terrainX, terrainZ)\terrainNr, #G_Welt / 2 + #G_Welt * terrainX, 0, #G_Welt / 2 + #G_Welt * terrainZ) ;Gesamtes Terrain wird so positioniert, dass die linke untere Ecke auf 0/0 liegt.
DefineTerrainTile(terrain(terrainX, terrainZ)\terrainNr, 0, 0, "heightmap.png", #False, #False)
TerrainPhysicBody(terrain(terrainX, terrainZ)\terrainNr, 0.01, 0.3)
BuildTerrain(terrain(terrainX, terrainZ)\terrainNr) ;-OOOOO Hier Kommentar Ende
CreateTerrainEnt(terrainX, terrainZ)
EndIf
terrain(terrainX, terrainZ)\inVer = 2 ;2 bedeutet, dass dieser Terrainabschnitt aktuell ist.
Next terrainZ
Next terrainX
For terrainX = 0 To weltGroesse -1
For terrainZ = 0 To weltGroesse -1
If terrain(terrainX, terrainZ)\inVer = 1
terrain(terrainX, terrainZ)\inVer = 0
ElseIf terrain(terrainX, terrainZ)\inVer = 2
terrain(terrainX, terrainZ)\inVer = 1
EndIf
Next terrainZ
Next terrainX
EndProcedure
Procedure Open_Window_Screen()
Protected.i lz
OpenWindow(#Window_Screen, 0, 0, breite, hoehe, "Test_000", #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget)
CreateMenu(#Menu_0, WindowID(#Window_Screen))
MenuTitle("Datei")
MenuItem(#Item_0, "Neu")
OpenWindowedScreen(WindowID(#Window_Screen), 10, 10, breite, hoehe, #True, 200, 10, #PB_Screen_SmartSynchronization)
Parse3DScripts() ;Vergleicht in den 3DArchiven gegebene Materialien mit Meshes,...
CreateLight(#Licht_0 ,RGB(255*0.4, 255*0.4,255*0.4), 500, 500, 500, #PB_Light_Directional) ;-Wird geändert, wenn es die Sonne gibt.
EndProcedure
Procedure Neu() ;Erstellt eine neue Welt.
Protected.i Quit, fileData, terrainX, terrainY, neuTerrain
weltGroesse = 2
speicherPfad = PathRequester("Bitte wählen Sie einen Speicherort für die zu erstellende Welt aus (Vorhandene Welten werden zum Teil geladen!).", "")
Add3DArchive(speicherPfad, #PB_3DArchive_FileSystem)
Dim terrain(weltGroesse -1, weltGroesse -1) ;Redimensioniert die Größe des Terrainarray auf die aktuelle Weltgröße. -1, weil 0 als erste Stelle zählt.
CreateCamera(#kam_0, 0, 0, 100, 100)
CameraRange(#kam_0, 0, sichtDistanz)
ErneuerTerrain()
EndProcedure
If Not InitEngine3D(#PB_Engine3D_DebugLog)
MessageRequester("Info", "Keine Engine")
End
EndIf
InitSprite()
InitKeyboard()
;-Variablen Vordefinierung Anfang
sichtDistanz = 11 * 256
;-Variablen Vordefinierung Ende
Open_Window_Screen()
Repeat
Event = WindowEvent()
Select Event
Case #PB_Event_Menu
Select EventMenu()
Case #Item_0 ;Neu wurde gedrückt
Neu()
EndSelect
EndSelect
ForEver
Liegt das wieder an meinem PC oder gibt es den Fehler (endlich) mal auch bei jemand Anderem?