Collisionswert wird nicht zurückgegeben.

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
sechsrad
Rüpel
Beiträge: 112
Registriert: 01.02.2008 13:31

Collisionswert wird nicht zurückgegeben.

Beitrag von sechsrad »

Hallo, unten im Programm wird der Collisionswert vom Entity nicht zurückgegeben. Woran liegt das? Habe mal jedem Entity eine eigene Nummer verpasst ohne "#PB_ANY", damit ich den Fehler finden kann.

Wenn ich dieses eingebe : colli = FirstWorldCollisionEntity()
kommt die Fehlermeldung : Invalid memory acces. (read error at address 8).

mfg

Code: Alles auswählen


#CameraSpeed=10
#EntitySpeed=5

#Camera=0

Dim Node(5)
global colli

Define.f KeyX,KeyY,MouseX,MouseY

  InitEngine3D()

  Add3DArchive("Data\", #PB_3DArchive_FileSystem)
 
  InitSprite()
  InitKeyboard()
  InitMouse()
 
  hWnd = OpenWindow(0,0,0,800,600,"Nodes",#PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered)
  OpenWindowedScreen(hWnd,220,10,500,400,0,0,0)
  
    Add3DArchive("Data\", #PB_3DArchive_FileSystem) 

    EnableWorldPhysics(#True)
    EnableWorldCollisions(#True)
     
    CreateMaterial(0, LoadTexture(0, "gruen.jpg"))
    CreateMaterial(1, LoadTexture(1, "hintergr.jpg"))
    CreateMaterial(2, LoadTexture(2, "gelb.jpg"))
   
    Restore NumericalData
    Read.l Vert
    Read.l Tria
    Read.l Max
 
    CreateMesh(0, vert)
    SetMeshData(0, #PB_Mesh_Vertex | #PB_Mesh_Normal | #PB_Mesh_Color  | #PB_Mesh_UVCoordinate, ?Vertice, Vert);3)
    SetMeshData(0, #PB_Mesh_Face, ?Triangle, Tria); 1)
   
    CreateMesh(1, vert)
    SetMeshData(1, #PB_Mesh_Vertex | #PB_Mesh_Normal | #PB_Mesh_Color  | #PB_Mesh_UVCoordinate, ?Vertice, Vert);3)
    SetMeshData(1, #PB_Mesh_Face, ?Triangle, Tria); 1)
   
    CreateMesh(2, vert) 
    SetMeshData(2, #PB_Mesh_Vertex | #PB_Mesh_Normal | #PB_Mesh_Color  | #PB_Mesh_UVCoordinate, ?Vertice, Vert);3)
    SetMeshData(2, #PB_Mesh_Face, ?Triangle, Tria); 1)
   
    LoadMesh   (3,"test1.mesh")
    CreateMaterial(3,LoadTexture(0,"gruen.jpg"))
    MaterialAmbientColor(3,#PB_Material_AmbientColors)

    LoadMesh   (4,"test1.mesh")
    CreateMaterial(4,LoadTexture(4,"rot.jpg"))
    MaterialAmbientColor(4,#PB_Material_AmbientColors)

    LoadMesh   (5,"test1.mesh")
    CreateMaterial(5,LoadTexture(5,"blau.jpg"))
    MaterialAmbientColor(5,#PB_Material_AmbientColors)
     
    CreateCamera(#Camera,0,0,100,100)
    CameraLocate(#Camera,0,200,300)
    CameraLookAt(#Camera,0,0,0)

    CreateLight(0,RGB(255,255,255),0,500,0)
    AmbientColor(RGB(200,200,200))
 
       CreateEntity(20,MeshID(0),MaterialID(1),0,-45,0)
       ScaleEntity(20,300,1,300)
       EntityPhysicBody(20,#PB_Entity_StaticBody)
       
       anzahl=9
       For x=-2 To 2 Step 2
        For z=-2 To 2 Step 2
          anzahl=anzahl+1
          CreateEntity(anzahl,MeshID(0),MaterialID(0),x*80,0,z*80)
          ScaleEntity(anzahl,30,30,30)
          EntityPhysicBody(anzahl,#PB_Entity_StaticBody)
        Next
       Next
     
      Node(0) = CreateNode(#PB_Any,0,0,0)
      CreateEntity(0,MeshID(2),MaterialID(2))
      ScaleEntity(0,25,5,12)  
      AttachNodeObject(Node(0),EntityID(0),#PB_Node_Entity)
      
      ;-------------------------------

      Node(1) = CreateNode(#PB_Any,0,10,0)
      AttachNodeObject(Node(0),NodeID(Node(1)),#PB_Node_Entity)

      CreateEntity(1,MeshID(3),MaterialID(3))
      ScaleEntity(1,8,8,8) 
      AttachNodeObject(Node(1),EntityID(1),#PB_Node_Entity)

      ;---------------------------------

      Node(2) = CreateNode(#PB_Any,0,33,0)
      AttachNodeObject(Node(1),NodeID(Node(2)),#PB_Node_Entity)

      CreateEntity(2,MeshID(4),MaterialID(4))
      ScaleEntity(2,8,8,8)   
      AttachNodeObject(Node(2),EntityID(2),#PB_Node_Entity)
      
      ;----------------------------------
      
      Node(3) = CreateNode(#PB_Any,0,33,0)
      AttachNodeObject(Node(2),NodeID(Node(3)),#PB_Node_Entity)

      CreateEntity(3,MeshID(5),MaterialID(5))
      ScaleEntity(3,8,8,8)   
      AttachNodeObject(Node(3),EntityID(3),#PB_Node_Entity)
     
      ;-----------------------------------
        
      CreateEntity(9,MeshID(2),MaterialID(2)) ; Bounding Box
      EntityLocate(9, 50,0,0)
      EntityPhysicBody(9,#PB_Entity_BoxBody, #PB_Entity_AbsoluteBodyMove)
      SetEntityMass(9,10)
      ScaleEntity(9,1.0, 0.25, 0.5)
     
      WorldDebug(#PB_World_DebugBody)
     
      Repeat
     
        ExamineKeyboard()
        
        Active=0
        
        If KeyboardPushed(#PB_Key_Q)
          RotateNode(Node(1),1,0,0,#PB_Relative) 
        ElseIf KeyboardPushed(#PB_Key_W)
          RotateNode(Node(1),-1,0,0,#PB_Relative) 
        EndIf
        
        If KeyboardPushed(#PB_Key_E)
          RotateNode(Node(2),1,0,0,#PB_Relative) 
        ElseIf KeyboardPushed(#PB_Key_R)
          RotateNode(Node(2),-1,0,0,#PB_Relative) 
        EndIf
        
        If KeyboardPushed(#PB_Key_T)
          RotateNode(Node(3),1,0,0,#PB_Relative) 
        ElseIf KeyboardPushed(#PB_Key_Y)
          RotateNode(Node(3),-1,0,0,#PB_Relative) 
        EndIf
         
        If KeyboardPushed(#PB_Key_PageUp)
          Speed=-#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_PageDown)
          Speed=#CameraSpeed
        Else
          Speed=0
        EndIf
       
        If KeyboardPushed(#PB_Key_Left)
          Turn_X+1
          RotateNode(Node(0),0,Turn_x,0,#PB_Absolute)
          RotateEntity(9,0,Turn_x,0,#PB_Absolute)
        ElseIf KeyboardPushed(#PB_Key_Right)
          Turn_X-1
          RotateNode(Node(0),0,Turn_x,0,#PB_Absolute)
          RotateEntity(9,0,Turn_x,0,#PB_Absolute)
        EndIf
       
        If KeyboardPushed(#PB_Key_X)
          Move_X=-#EntitySpeed
          Active=1
        ElseIf  KeyboardPushed(#PB_Key_C)
          Move_X=#EntitySpeed
          Active=1
        EndIf
                 
        If KeyboardPushed(#PB_Key_A)
           Move_Y=#EntitySpeed*5
           Active=2
        ElseIf  KeyboardPushed(#PB_Key_Z)
           Move_Y=-#EntitySpeed*5
           Active=2
        EndIf
       
        If KeyboardPushed(#PB_Key_Up)
           Move_Z=#EntitySpeed
           Active=3
        ElseIf KeyboardPushed(#PB_Key_Down)
           Move_Z=-#EntitySpeed
           Active=3   
        EndIf
       
        If Turn_X>360
          Turn_X-360
        ElseIf Turn_X<0
          Turn_X+360
        EndIf
       
        Deg_X=Turn_X+90
        If Deg_X>360
          Deg_X-360
        ElseIf Deg_X<0
          Deg_X+360
        EndIf
                           
       Select Active
          Case 1
            deg.f=(#PI/180)*Turn_X
             MoveEntity(9,Sin(deg)*Move_X * 10.0,0,Cos(deg)*Move_X * 10.0)
          Case 2
             MoveEntity(9,0,Move_Y,0)
          Case 3
            deg.f=(#PI/180)*Deg_X
            MoveEntity(9,Sin(deg)*Move_Z * 10.0,0,Cos(deg)*Move_Z * 10.0)
           Default
            MoveEntity(9,0,0,0)
       EndSelect
     
      If ExamineMouse()
        MouseX=-(MouseDeltaX()/30)*#CameraSpeed/2
        MouseY=-(MouseDeltaY()/30)*#CameraSpeed/2
      EndIf
     
      RotateCamera(0,MouseY/2,MouseX/2,RollZ,#PB_Relative)
      MoveCamera(0,0,0,Speed)
     
      NodeLocate(Node(0), EntityX(9), EntityY(9), EntityZ(9))
      
      ExamineWorldCollisions()
      NextWorldCollision()
      colli = FirstWorldCollisionEntity()
      
      RenderWorld()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit=1
 
End

DataSection
   StringSect:
      Data.s ""

   NumericalData:
   Data.l 24,12,2

   Vertice:  ;x,y,z,nx,ny,nz,col,u,v = Vertex + Normal + Col + UV Koordinaten
   Data.f 1,1,1,0.57735,0.57735,0.57735,0,0,0
   Data.f 1,-1,1,0.57735,-0.57735,0.57735,0,0,0
   Data.f -1,-1,1,-0.57735,-0.57735,0.57735,0,0,0
   Data.f -1,1,1,-0.57735,0.57735,0.57735,0,0,0
   Data.f 1,1,-1,0.57735,0.57735,-0.57735,0,0,0
   Data.f -1,1,-1,-0.57735,0.57735,-0.57735,0,0,0
   Data.f -1,-1,-1,-0.57735,-0.57735,-0.57735,0,0,0
   Data.f 1,-1,-1,0.57735,-0.57735,-0.57735,0,0,0
   Data.f 1,1,1,0.57735,0.57735,0.57735,0,0,0
   Data.f 1,1,-1,0.57735,0.57735,-0.57735,0,0,0
   Data.f 1,-1,-1,0.57735,-0.57735,-0.57735,0,0,0
   Data.f 1,-1,1,0.57735,-0.57735,0.57735,0,0,0
   Data.f 1,-1,1,0.57735,-0.57735,0.57735,0,0,0
   Data.f 1,-1,-1,0.57735,-0.57735,-0.57735,0,0,0
   Data.f -1,-1,-1,-0.57735,-0.57735,-0.57735,0,0,0
   Data.f -1,-1,1,-0.57735,-0.57735,0.57735,0,0,0
   Data.f -1,-1,1,-0.57735,-0.57735,0.57735,0,0,0
   Data.f -1,-1,-1,-0.57735,-0.57735,-0.57735,0,0,0
   Data.f -1,1,-1,-0.57735,0.57735,-0.57735,0,0,0
   Data.f -1,1,1,-0.57735,0.57735,0.57735,0,0,0
   Data.f 1,1,-1,0.57735,0.57735,-0.57735,0,0,0
   Data.f 1,1,1,0.57735,0.57735,0.57735,0,0,0
   Data.f -1,1,1,-0.57735,0.57735,0.57735,0,0,0
   Data.f -1,1,-1,-0.57735,0.57735,-0.57735,0,0,0

   Triangle: ; Vertice x,y,z verbinden/Create Triangle
   Data.w 2,0,3
   Data.w 1,0,2
   Data.w 6,4,7
   Data.w 5,4,6
   Data.w 10,8,11
   Data.w 9,8,10
   Data.w 14,12,15
   Data.w 13,12,14
   Data.w 18,16,19
   Data.w 17,16,18
   Data.w 22,20,23
   Data.w 21,20,22
EndDataSection 
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Code: Alles auswählen

      ExamineWorldCollisions()
      While NextWorldCollision()
        colli1 = FirstWorldCollisionEntity() 
        wauwau2 = SecondWorldCollisionEntity() 
        Debug colli1
        Debug wauwau2
        Debug "---"
      Wend
So müsste es aussehen, aber du wirst trotzdem nichts zurückbekommen, weil das mit Static-Bodies nicht geht. Bekannter Bug (Im selben Thread den ich dir auch mal gegeben hab):

http://www.purebasic.fr/english/viewtopic.php?t=35840
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
sechsrad
Rüpel
Beiträge: 112
Registriert: 01.02.2008 13:31

Beitrag von sechsrad »

Wie kann man das mit einem anderen Trick lösen?
Ist ja blöd, wenn man die Collision nicht prüfen kann.

mfg
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

sechsrad hat geschrieben:Wie kann man das mit einem anderen Trick lösen?
Ist ja blöd, wenn man die Collision nicht prüfen kann.

mfg
Entweder BoxBody/SphereBody nehmen oder aber man nimmt eben eine neue BoundingBox und prüft ob sie sich in irgendeiner weise gegen die befohlene Bewegung auflehnt (Kollision wird erkannt und es wird darauf reagiert aber nicht zurückgegeben).
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
sechsrad
Rüpel
Beiträge: 112
Registriert: 01.02.2008 13:31

Beitrag von sechsrad »

Entweder BoxBody/SphereBody
Zeig mir das mal.
Kollision wird erkannt und es wird darauf reagiert aber nicht zurückgegeben
Kann man das nicht rausholen mit "Peek"?

mfg
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

sechsrad hat geschrieben:
Entweder BoxBody/SphereBody
Zeig mir das mal.
Kollision wird erkannt und es wird darauf reagiert aber nicht zurückgegeben
Kann man das nicht rausholen mit "Peek"?

mfg
1. Naja du hast doch sowieso überall Boxen, wieso nimmst du dann nicht #PB_Entity_BoxBody statt #PB_Entity_StaticBody? Damit wird es nämlich erkannt.

2. Könnte man sicherlich irgendwie, aber dann müsste man es bei jeder neuen Version anpassen etc. was es nicht lohnenswert macht.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
sechsrad
Rüpel
Beiträge: 112
Registriert: 01.02.2008 13:31

Beitrag von sechsrad »

#PB_Entity_BoxBody
Wenn ich das nehme, bewegt sich mein ganze Gebilde und das Rechteckauto fällt ins Endlose.

Woran liegt das?

mfg
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

sechsrad hat geschrieben:
#PB_Entity_BoxBody
Wenn ich das nehme, bewegt sich mein ganze Gebilde und das Rechteckauto fällt ins Endlose.

Woran liegt das?

mfg
Weil deine Box Bodies dann auch an der Gravitation beteiligt sind. Du müsstest WorldGravity auf 0 setzen und die Gravitation selbst steuern.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
super_castle
Beiträge: 557
Registriert: 29.11.2005 15:05

Re: Collisionswert wird nicht zurückgegeben.

Beitrag von super_castle »

Ist dieser BUG endlich behoben, oder wurde diese Verbesserung übersehen.

Gruss
So müsste es aussehen, aber du wirst trotzdem nichts zurückbekommen, weil das mit Static-Bodies nicht geht. Bekannter Bug (Im selben Thread den ich dir auch mal gegeben hab):
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: Collisionswert wird nicht zurückgegeben.

Beitrag von c4s »

...Einfach mal ausprobieren und selber rausfinden.
Sonst kannst du im verlinkten Thread auch nachgucken. Da steht kein "fixed" von daher scheint es nicht behoben bzw. kein wirklicher Fehler zu sein.
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
Antworten