Help with types please.
Blitz3D Forums/Blitz3D Beginners Area/Help with types please.
| ||
Hello, I have a problem that has me stuck, pass the following code and try to explain it the best way possible..Ini Graphics3D 800,600,32,2 SetBuffer BackBuffer() SeedRnd MilliSecs () Global n#,k=0,w=1.1 ,free,in_mesh,enable=1 Global ocu.Px_Cube Delete ocu.Px_Cube pxCreateWorld(1, "key") pxSetGravity(0, -10, 0) camera=CreateCamera() light=CreateLight() PositionEntity camera,20,25,-20 RotateEntity camera,30,30,0 plane=CreatePlane( ) EntityColor plane,0,100,200 ;--------------Create Trimesh---------------- Text 10,10,"please wait while precomputing pmap..." Flip free= LoadMesh("..\media\spring.b3d") ScaleMesh free,0.2,0.2,0.2 PositionEntity free,0,5,0 in_mesh=BodyCreateMesh%(free) pxBodySetPosition(in_mesh,0,5,0) surf = GetSurface(free,1) nft = CountTriangles(surf) nvv = CountVertices(surf) While Not KeyDown( 1 ) If KeyHit (200) Exit If KeyHit(57) Create_Px_Sphere() k =k+1 EndIf If KeyHit( 17 )=True Then enable=1-enable ; Enable/disable wireframe rendering WireFrame enable time=MilliSecs () pxRenderPhysic(30,0) Update_Px_Cube() New_time=MilliSecs ()-time If KeyDown (17) i=i+4 UpdateWorld () RenderWorld frames=frames+1 If MilliSecs()-render_time=>1000 fps1=frames : frames=0 : render_time=MilliSecs() Text 10,10,"FPS: "+fps1+" dll time: "+New_time Text 10,20,"w - Enable/disable wireframe rendering " Text 10,30,"space - add sphere " Flip Wend ClearWorld pxDestroyWorld() Goto Ini Type Px_Cube Field cube_body% Field cube_mesh% End Type Function Create_Px_Sphere() ocu.Px_Cube = New Px_Cube ocu\cube_mesh=CreateSphere () ScaleEntity ocu\cube_mesh,0.5,0.5,0.5 ocu\cube_body=pxBodyCreateSphere(0.5, 1) pxBodySetPosition(ocu\cube_body,3,30,0) End Function Function Update_Px_Cube() For ocu.Px_Cube = Each Px_Cube pxBodySetEntity(ocu\cube_mesh, ocu\cube_body) Next End Function Function BodyCreateMesh(mesh%) nsurf = CountSurfaces(mesh) nvert = 0 nface=0 For ns = 1 To nsurf Local surf = GetSurface(mesh,ns) nface = nface+CountTriangles(surf) nvert = nvert +CountVertices(surf) Next fbank = CreateBank(nface*4*3) nf = 0 vbank = CreateBank(nvert*4*3) nv = 0 For ns = 1 To nsurf surf = GetSurface(mesh,ns) nfv = CountTriangles(surf) For nfc = 0 To nfv -1 PokeInt fbank,nf*12+0,TriangleVertex(surf,nfc,0) PokeInt fbank,nf*12+4,TriangleVertex(surf,nfc,1) PokeInt fbank,nf*12+8,TriangleVertex(surf,nfc,2) nf=nf+1 Next nvv = CountVertices(surf) For nvc = 0 To nvv - 1 PokeFloat vbank,nv*12+0,VertexX(surf,nvc) PokeFloat vbank,nv*12+4,VertexY(surf,nvc) PokeFloat vbank,nv*12+8,VertexZ(surf,nvc) nv = nv+1 Next Next bbb%=pxCreateTriMesh(vbank, fbank, nvert, nface,0) FreeBank vbank FreeBank fbank Return bbb% End Function What happens is that when I use the goto after exiting the loop to start again throw me this error code site. Function Update_Px_Cube() For ocu.Px_Cube = Each Px_Cube pxBodySetEntity(ocu\cube_mesh, ocu\cube_body); ERROR HERE Next End Function Help Please. |
| ||
That's because you're not deleting your list of Px_Cube objects after exiting the loop. All of the original Px_Cubes are still there, but- because you used ClearWorld and pxDestroyWorld, the two handles they contain are both invalid and don't point to any new meshes or PX entities. At the absolute minimum, you should be doing: Delete Each Px_Cube ...as part of your cleanup code. Or better, write a proper cleanup function for each Px_Cube object, and loop over the whole list before running ClearWorld and pxDestroyWorld. As a general guideline, you should never have to use functions like ClearWorld or pxDestroyWorld: if you're cleaning up your assets properly, there should be nothing left for them to catch. ClearWorld especially is of really questionable usefulness because as this example demonstrates, it only kills 3D engine objects and leaves logical objects alone, regardless of internal references, which will usually leave your game system in a mess. You also don't normally need to destroy the whole physics environment, since the physics engine is separate from the graphics system and will happily survive a graphics mode switch untouched. |
| ||
Ho! thank you very much.Function ClearBodies() For R.Ragdoll=Each Ragdoll For x = 0 To 100 pxDeleteBody R\Bodies[X] Next Delete R.Ragdoll Next End Function |