Problem mit Collision
Übersicht

Pro SoftBetreff: Problem mit Collision |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hi
Ich habe ein Problem mit der Collision der Camera. Ich benutze ein paar Funktionen von anderen Programmierern doch nun weiß wir nicht wieso die Camera nicht mit den Objecten collidiert. Code: [AUSKLAPPEN] SeedRnd MilliSecs() Include "oceanlib.bb" ; i put all the watercode into oceanlib.bb, so you should be able to easily include it ; into ya programms. Graphics3D 1024,768,32,1 SetBuffer BackBuffer() Global cam_x#,cam_z#,cam_pitch#,cam_yaw# ; Current Global dest_cam_x#,dest_cam_z#,dest_cam_pitch#,dest_cam_yaw# ; Destination ;sound meer = LoadSound("meer.mp3") PlaySound meer ; hmm, some camera thingies... boooring ;Global main_pivot = CreatePivot() Global cam = CreateCamera();main_pivot) MoveEntity cam,0,10,-100 TurnEntity cam,20,0,0 wat_gamecam = cam CameraRange cam,1,50000 CameraFogMode cam,1 CameraFogRange cam,1000,1000 CameraFogColor cam,211,219,236 ;PositionEntity cam, 2340, 0, 2390 ; 1394, 0, 4660 ;1298, 0, 4653 ; 3750, 45, 1370 ;WireFrame 1 ; loadin skybox sky_mesh = LoadSkyBox() ; light AmbientLight 255,255,255 main_light = CreateLight() RotateEntity main_light,40,20,0 ter = LoadMesh("ohne titel 2.b3d") PositionEntity ter,0,16,0 ScaleMesh ter,.05,.05,.05 ;EntityPickMode ter,2,1 water.wat = Wat_CreateWater(16,16) Wat_CreateSurface(water,40) startms = MilliSecs() EntityType cam,1 EntityType ter,2 Collisions 1,2,2,2 Repeat loops# = loops# + 1 Aktuell = MilliSecs () FreeLook(cam,.1) Cls If KeyHit(57) Then wat_whitecaps = 1-wat_whitecaps ; render the water mesh every second frame If EntityY(cam) < 2 Then PositionEntity cam,EntityX(cam),2,EntityZ(cam) If Aktuell - Anfang >20 Then Wat_UpdateWater(water) Anfang=MilliSecs () FPS=Frame Frame=0 If KeyDown (200) MoveEntity cam, 0, 0, 0.5 EndIf If KeyDown (208) MoveEntity cam, 0, 0, -0.5 EndIf EndIf RenderWorld() ;Text 0,0,"fps: "+Int(1000/(MilliSecs()-lastmsc)) Text 0,15,"averagefps: "+Int(1000/(Float((MilliSecs()-startms)/loops))) Text 0,30,"tris: "+TrisRendered() Text 0,45,"press space to enable/disable whitecaps" Text 0,60,"X: "+EntityX(cam) Text 0,70,"Y: "+EntityY(cam) Text 0,80,"Z: "+EntityZ(cam) lastmsc = MilliSecs() Flip 0 Until KeyHit(1) End Function LoadSkyBox( parent=0 ) m=CreateMesh(parent) ;front face b=LoadBrush( "sky_f.bmp",49 ) s=CreateSurface( m,b ) AddVertex s,-1,+1,-1,0,0:AddVertex s,+1,+1,-1,1,0 AddVertex s,+1,-1,-1,1,1:AddVertex s,-1,-1,-1,0,1 AddTriangle s,0,1,2:AddTriangle s,0,2,3 FreeBrush b ;right face b=LoadBrush( "sky_l.bmp",49 ) s=CreateSurface( m,b ) AddVertex s,+1,+1,-1,0,0:AddVertex s,+1,+1,+1,1,0 AddVertex s,+1,-1,+1,1,1:AddVertex s,+1,-1,-1,0,1 AddTriangle s,0,1,2:AddTriangle s,0,2,3 FreeBrush b ;back face b=LoadBrush( "sky_b.bmp",49 ) s=CreateSurface( m,b ) AddVertex s,+1,+1,+1,0,0:AddVertex s,-1,+1,+1,1,0 AddVertex s,-1,-1,+1,1,1:AddVertex s,+1,-1,+1,0,1 AddTriangle s,0,1,2:AddTriangle s,0,2,3 FreeBrush b ;left face b=LoadBrush( "sky_r.bmp",49 ) s=CreateSurface( m,b ) AddVertex s,-1,+1,+1,0,0:AddVertex s,-1,+1,-1,1,0 AddVertex s,-1,-1,-1,1,1:AddVertex s,-1,-1,+1,0,1 AddTriangle s,0,1,2:AddTriangle s,0,2,3 FreeBrush b ;top face b=LoadBrush( "sky_u.bmp",49 ) s=CreateSurface( m,b ) AddVertex s,-1,+1,+1,0,1:AddVertex s,+1,+1,+1,0,0 AddVertex s,+1,+1,-1,1,0:AddVertex s,-1,+1,-1,1,1 AddTriangle s,0,1,2:AddTriangle s,0,2,3 FreeBrush b b=LoadBrush( "sky_d.bmp",49 ) s=CreateSurface( m,b ) AddVertex s,-1,-1,-1,1,0:AddVertex s,+1,-1,-1,1,1 AddVertex s,+1,-1,+1,0,1:AddVertex s,-1,-1,+1,0,0 AddTriangle s,0,1,2:AddTriangle s,0,2,3 FreeBrush b ScaleMesh m,500,500,500 EntityOrder m,1 FlipMesh m EntityFX m,1+8 Return m End Function ; just removes every tri that is completely under a certain y-coord to prevent some cubemappin problems Function RemoveTrisUnderThePlane(mesh,planey#) Local nmesh = CreateMesh() Local vertex[2], nvertex[2] For s = 1 To CountSurfaces(mesh) sur = GetSurface(mesh,s) nsur = CreateSurface(nmesh,GetSurfaceBrush(sur)) For t = 0 To CountTriangles(sur)-1 temp = 0 For i = 0 To 2 vertex[i] = TriangleVertex(sur,t,i) If VertexY(sur,vertex[i]) > planey Then temp = 1 Next If temp = 1 For i = 0 To 2 nvertex[i] = AddVertex(nsur,VertexX(sur,vertex[i]),VertexY(sur,vertex[i]),VertexZ(sur,vertex[i]),VertexU(sur,vertex[i]),VertexV(sur,vertex[i]),VertexW(sur,vertex[i])) VertexNormal nsur,nvertex[i],VertexNX(sur,vertex[i]),VertexNY(sur,vertex[i]),VertexNZ(sur,vertex[i]) VertexColor nsur,nvertex[i],VertexRed(sur,vertex[i]),VertexGreen(sur,vertex[i]),VertexBlue(sur,vertex[i]),VertexAlpha(sur,vertex[i]) Next AddTriangle nsur,nvertex[0],nvertex[1],nvertex[2] EndIf Next Next Return nmesh End Function Function CurveValue#(current#,destination#,curve) current#=current#+((destination#-current#)/curve) Return current# End Function Function FreeLook(camera, sp# = .1) If KeyDown(42) Then sp=sp*10 If sp# > 0 Then FreeLookXS# = (FreeLookXS# + ((KeyDown(32)) - (KeyDown(30))) * sp#) * .75 FreeLookZS# = (FreeLookZS# + ((KeyDown(17) Or (MouseZSpeed()*10)) - (KeyDown(31) Or (MouseZSpeed()*10))) * sp#) * .75 MoveEntity camera, FreeLookXS#, 0, FreeLookZS# EndIf FreeLookRotXS# = ((MouseXSpeed() - FreeLookRotXS#) * .2 + FreeLookRotXS#) * .9 FreeLookRotYS# = ((MouseYSpeed() - FreeLookRotYS#) * .2 + FreeLookRotYS#) * .9 If EntityPitch(camera) + FreeLookRotYS# < -89 pitch# = -89 ElseIf EntityPitch(camera) + FreeLookRotYS# > 89 pitch# = 89 Else pitch# = EntityPitch(camera) + FreeLookRotYS# yaw# = -FreeLookRotXS# + EntityYaw(camera) RotateEntity camera, pitch#, yaw#, 0 MoveMouse GraphicsWidth() / 2, GraphicsHeight() / 2 End Function oceanlib.bb: Code: [AUSKLAPPEN] ; waterlib, Inarie aka Mr.Keks, 2005
; mail@inarie.de ; www.inarie.de ; www.projectblitz.de Type wat ; water tile / water class Field bank ; bank that contains the water wave time Field width,depth ; width and depth of the mesh in quads Field mesh,sur,sur2 Field brush,brush2 Field cam,tex ; cubemappin cam and tex Field tex2, anim# End Type Type wat_surf ; a water circle ^^ Field w.wat ; tile class Field size Field piv End Type Type wat_meshc ; a single mesh instance of the wat tile Field s.wat_surf Field mesh End Type Global wat_gamecam ; handle of the main cam Global wat_whitecaps = 1 ; disable or enable whitecaps on high waves ; save all sin()-values in order to save some render time Dim sin2#(255) For i = 0 To 255 Sin2(i) = Sin(i*360/255) Next ; function to create a water class Function Wat_CreateWater.wat(width, depth) w.wat = New wat w\width = width w\depth = depth w\mesh = CreateMesh() w\brush = CreateBrush() w\brush2 = LoadBrush("white.png",2,.5,.5) w\sur = CreateSurface(w\mesh,w\brush) w\sur2 = CreateSurface(w\mesh,w\brush2) w\bank = CreateBank(width * depth + 1) BrushFX w\brush,16 BrushColor w\brush,70,90,110 BrushShininess w\brush,.3 BrushFX w\brush2,1+2+16+32 PaintSurface w\sur2,w\brush2 HideEntity w\mesh ResizeBank w\bank,width*depth+1 w\tex = CreateTexture(256,256,1+128+256) w\tex2 = LoadAnimTexture("wateranim.bmp",256,124,124,0,25) ScaleTexture w\tex2,.6,.6 TextureBlend w\tex2,3 For i = 0 To width*depth PokeByte w\bank,i,Rand(255);+Sin(i*360/width)*129 Next ScaleEntity w\mesh,1,1.001/256.001,1 w\cam = CreateCamera() HideEntity w\cam Return w.wat End Function ; function to create a water circle Function Wat_CreateSurface.wat_surf(w.wat,fieldsize) s.wat_surf = New wat_surf s\w = w s\size = fieldsize s\piv = CreatePivot() For x = -fieldsize To fieldsize For y = -fieldsize To fieldsize If y*y < fieldsize*fieldsize-x*x If LinePick((x-.5)*w\width,200,(y-.5)*w\depth,0,-180,0,w\depth/2) = 0 m.wat_meshc = New wat_meshc m\s = s m\mesh = CopyEntity(w\mesh,s\piv) PositionEntity m\mesh,(x-(x/2*2<>x)*1)*(w\width)-2*x,0,(y-(y/2*2<>y)*1)*(w\depth)-2*y ScaleEntity m\mesh,2*(x/2*2<>x)-1,1.001/256.001,2*(y/2*2<>y)-1 EntityPickMode m\mesh,2,1 EndIf EndIf Next Next End Function ; function to update all water tiles of a certain water class Function Wat_UpdateWater(w.wat) Local vertex[3] Local vertex2[3] Local vertstobechanged[124*2] ClearSurface w\sur ClearSurface w\sur2 For x = 0 To w\width-1 For z = 0 To w\depth-1 flukt = PeekByte(w\bank,1*(x*w\depth+z)) PokeByte(w\bank,1*(x*w\depth+z),flukt+2) Next Next sw# = 32 ; wave height For x = 1 To w\width-2 For z = 1 To w\depth-2 vertex[0] = AddVertex(w\sur,x,sw*Sin2(PeekByte(w\bank,x*w\depth+z)),z,Float(x)/w\width,Float(z)/w\depth,1) vertex[1] = AddVertex(w\sur,x,sw*Sin2(PeekByte(w\bank,x*w\depth+z+1)),z+1,Float(x)/w\width,Float(z+1)/w\depth,1) vertex[2] = AddVertex(w\sur,x+1,sw*Sin2(PeekByte(w\bank,x*w\depth+w\depth+z+1)),z+1,Float(x+1)/w\width,Float(z+1)/w\depth,1) vertex[3] = AddVertex(w\sur,x+1,sw*Sin2(PeekByte(w\bank,x*w\depth+w\depth+z)),z,Float(x+1)/w\width,Float(z)/w\depth,1) AddTriangle(w\sur, vertex[0], vertex[1], vertex[2]) AddTriangle(w\sur, vertex[0], vertex[2], vertex[3]) If wat_whitecaps ; draw those cool whitecaps onto high waves temp = 0 For i2 = 0 To 3 If VertexY(w\sur,vertex[i2])>sw/1.5 temp = temp + 1 EndIf Next If temp > 0 i3 = 0 vertex2[0] = AddVertex(w\sur2,VertexX(w\sur,vertex[i3]),VertexY(w\sur,vertex[i3])+1,VertexZ(w\sur,vertex[i3]),VertexU(w\sur,vertex[i3]),VertexV(w\sur,vertex[i3])) VertexColor w\sur2,vertex2[0],255,255,255,(VertexY(w\sur,Vertex[i3])-sw/1.5)/sw*1.5 i3 = 1 vertex2[1] = AddVertex(w\sur2,VertexX(w\sur,vertex[i3]),VertexY(w\sur,vertex[i3])+1,VertexZ(w\sur,vertex[i3]),VertexU(w\sur,vertex[i3]),VertexV(w\sur,vertex[i3])) VertexColor w\sur2,vertex2[1],255,255,255,(VertexY(w\sur,Vertex[i3])-sw/1.5)/sw*1.5 i3 = 2 vertex2[2] = AddVertex(w\sur2,VertexX(w\sur,vertex[i3]),VertexY(w\sur,vertex[i3])+1,VertexZ(w\sur,vertex[i3]),VertexU(w\sur,vertex[i3]),VertexV(w\sur,vertex[i3])) VertexColor w\sur2,vertex2[2],255,255,255,(VertexY(w\sur,Vertex[i3])-sw/1.5)/sw*1.5 i3 = 3 vertex2[3] = AddVertex(w\sur2,VertexX(w\sur,vertex[i3]),VertexY(w\sur,vertex[i3])+1,VertexZ(w\sur,vertex[i3]),VertexU(w\sur,vertex[i3]),VertexV(w\sur,vertex[i3])) VertexColor w\sur2,vertex2[3],255,255,255,(VertexY(w\sur,Vertex[i3])-sw/1.5)/sw*1.5 AddTriangle(w\sur2,vertex2[0],vertex2[1],vertex2[2]) AddTriangle(w\sur2,vertex2[0],vertex2[2],vertex2[3]) EndIf EndIf ; saves the numbers of the vertices whose normalcoords have to be changed after updatenormals If x = 1 vertstobechanged[i]=vertex[0] i = i + 1 vertstobechanged[i]=vertex[1] i = i + 1 ElseIf z = 1 vertstobechanged[i]=vertex[0] i = i + 1 vertstobechanged[i]=vertex[3] i = i + 1 ElseIf x = w\width-2 vertstobechanged[i]=vertex[2] i = i + 1 vertstobechanged[i]=vertex[3] i = i + 1 ElseIf z=w\depth-2 vertstobechanged[i]=vertex[1] i = i + 1 vertstobechanged[i]=vertex[2] i = i + 1 EndIf Next Next UpdateNormals(w\mesh) ; change some normalcoords to hide the tiling For i = 0 To 124*2 VertexNormal w\sur,vertstobechanged[i],0,1,0 Next BrushTexture w\brush,w\tex BrushTexture w\brush,w\tex2,Int(w\anim),2 PaintSurface w\sur,w\brush w\anim = (w\anim + .5) Mod 23 For s.wat_surf = Each wat_surf If s\w = w HideEntity s\piv EndIf Next ; render the cubemap texture Wat_UpdateCubemap(w\tex,w\cam,wat_gamecam) For s.wat_surf = Each wat_surf If s\w = w ShowEntity s\piv EndIf Next End Function Function Wat_UpdateCubemap(tex,camera,entity) ; this function isnt by me. dont know who wrote it SetBuffer BackBuffer() ; nevertheless, thx to him for preventing me from havin' to write it on my own ^^ tex_sz=TextureWidth(tex) ShowEntity camera HideEntity entity PositionEntity camera,EntityX#(entity,1),-EntityY(entity,1),EntityZ#(entity,1),1 CameraViewport camera,0,0,tex_sz,tex_sz SetCubeFace tex,0 RotateEntity camera,0,90,0 RenderWorld CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(tex) SetCubeFace tex,1 RotateEntity camera,0,0,0 RenderWorld CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(tex) SetCubeFace tex,2 RotateEntity camera,0,-90,0 RenderWorld CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(tex) SetCubeFace tex,3 RotateEntity camera,0,180,0 RenderWorld CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(tex) SetCubeFace tex,4 RotateEntity camera,-90,0,0 RenderWorld CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(tex) ShowEntity entity HideEntity camera End Function |
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
Die Collisions werden nur beim Erreichen des Befehls UpdateWorld() kontrolliert. Der fehlt in deinem Code komplett und gehört in die Hauptschleife. | ||
Pro SoftBetreff: Fehler behoben! |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Vielen Dank Midimaster ![]() Jetzt funktioniert alles ! ![]() mfg |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group