Seite 1 von 1

RemoveBillboard, Wie?

Verfasst: 13.04.2013 16:01
von FosJonas
Hallo,

Ich nutze in einem Programm Billboards, diese möchte ich natürlich auch wieder Entfernen können.
Aber irgendwie funktioniert das bei mir nicht.
Das Problem ist eigentlich ganz einfach anhand eines leicht abgenderten "BillboardGrass.pb" Examples zu zeigen:

Code: Alles auswählen

;
; ------------------------------------------------------------
;
;   PureBasic - Billboard
;
;    (c) 2011 - Fantaisie Software
;
; ------------------------------------------------------------
;

#CameraSpeed = 2

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D()
  
  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Models", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Scripts", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Packs/skybox.zip", #PB_3DArchive_Zip)
  Parse3DScripts()
  
  InitSprite()
  InitKeyboard()
  InitMouse()
  
  If Screen3DRequester()
    
    ; First create materials
    ;
    
    CreateMaterial(0, LoadTexture(0,"grass1.png"))
    MaterialBlendingMode(0, #PB_Material_AlphaBlend)
    CreateMaterial(1, LoadTexture(1,"Dirt.jpg"))

    
    ; Then create the billboard group and use the previous material
    ;
    ;-Billboard
    
    CreateBillboardGroup(0, MaterialID(0), 96, 96)
    For i = 0 To 600
      b = AddBillboard(#PB_Any, 0, Random(2000)-1000, Random(18) + 30, Random(2000) - 1000)
      RemoveBillboard(b,0)
    Next i
    
    ; create ground
    
    CreatePlane(0, 2000, 2000, 40, 40, 4, 4)
    CreateEntity(0, MeshID(0), MaterialID(1))
    
    ; Add house
    LoadMesh(1, "tudorhouse.mesh")
    CreateEntity(1, MeshID(1), #PB_Material_None, 0, 280, 0)
    ScaleEntity(1, 0.5, 0.5, 0.5)
    
    ; SkyBox
    SkyBox("stevecube.jpg")
    
    ; create camera
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 200, 400, 900, #PB_Absolute)
    CameraLookAt(0, 0, 100, 0)
    
    Repeat
      Screen3DEvents()
      
      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
      EndIf
            
      If ExamineKeyboard()
        
        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed 
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed 
        Else
          KeyX = 0
        EndIf
        
        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed 
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed 
        Else
          KeyY = 0
        EndIf
        
      EndIf
            
      RotateCamera(0, MouseY, MouseX, 0, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)
      
      RenderWorld()
      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf
  
Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End
Nach dem Erstellen lösche ich hierbei die Billboards einfach sofort wieder, allerdings erhalte ich dann immer folgende Fehlermeldung:

Microsoft Visual C++ Runtime Library
Assertion Failed!
Expression: index <mactivebillboards.size() && "Billboard Index out of Bounds"

Wie mache ich das nun Richtig? Hat da jemand eine Idee?

Re: RemoveBillboard, Wie?

Verfasst: 13.04.2013 17:16
von Chimorin
Ich bin mit dem Handy online, deshalb fällt die Antwort kurz aus.
AddBillboard() gibt keinen Wert zurück. Schau mal in die Hilfe. Du versucht 600x Billboard Nr.0 zu löschen ^^

Re: RemoveBillboard, Wie?

Verfasst: 13.04.2013 17:58
von FosJonas
Das habe ich mir auch zuerst gedacht, aber der fehler tritt auch auf wenn ich dem Billboard die ID 1 geben, und das danach Lösche, schon beim ersten durchlauf.

Wenn man also den entscheidenden Code hierdurch ersetzt:

Code: Alles auswählen

For i = 0 To 600
      AddBillboard(i, 0, Random(2000)-1000, Random(18) + 30, Random(2000) - 1000)
      RemoveBillboard(i,0)
    Next
kommt genau der gleiche Fehler.

Re: RemoveBillboard, Wie?

Verfasst: 13.04.2013 19:09
von Chimorin
Ich glaube, ich weiß, wo der Fehler liegt.

Du erstellst ein Billboard "0", dieses wird gelöscht. Jetzt erstellst du ein Billboard "1", was aber falsch ist, da das erste "0" sein müsste.

Mach einfach mal die Schleife weg und setze Zahlen ein... Bei 0 gibts keine Probleme mit dem Löschen, bei "1" gibts den Fehler.
Klingt aber für mich unlogisch und nach Bug, da man doch für seine Billboards irgendwelche Zahlen nehmen könnte :|
Ich glaube, da wurde ein bisschen Schmu getrieben, was auch die fehlende Unterstützung für #PB_Any erklären wurde...

Re: RemoveBillboard, Wie?

Verfasst: 15.04.2013 15:05
von bobobo
ClearBillboards !! oder FreeBillboardGroup zum komplette Löschen
RemoveBillboard suckz

Code: Alles auswählen

;
; ------------------------------------------------------------
;
;   PureBasic - Billboard
;
;    (c) 2011 - Fantaisie Software
;
; ------------------------------------------------------------
;

#CameraSpeed = 2

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D()
  
  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Models", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Scripts", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Packs/skybox.zip", #PB_3DArchive_Zip)
  Parse3DScripts()
  
  InitSprite()
  InitKeyboard()
  InitMouse()
  
  If Screen3DRequester()
    
    ; First create materials
    ;
    
    CreateMaterial(0, LoadTexture(0,"grass1.png"))
    MaterialBlendingMode(0, #PB_Material_AlphaBlend)
    CreateMaterial(1, LoadTexture(1,"Dirt.jpg"))

    
    ; Then create the billboard group and use the previous material
    ;
    ;-Billboard
    
    CreateBillboardGroup(0, MaterialID(0), 96, 96)
    For b = 0 To 600
      
      AddBillboard(b, 0, Random(2000)-1000, Random(18) + 30, Random(2000) - 1000)
    Next b
    
    ; create ground
    
    CreatePlane(0, 2000, 2000, 40, 40, 4, 4)
    CreateEntity(0, MeshID(0), MaterialID(1))
    
    ; Add house
    LoadMesh(1, "tudorhouse.mesh")
    CreateEntity(1, MeshID(1), #PB_Material_None, 0, 280, 0)
    ScaleEntity(1, 0.5, 0.5, 0.5)
    
    ; SkyBox
    SkyBox("stevecube.jpg")
    
    ; create camera
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 200, 400, 900, #PB_Absolute)
    CameraLookAt(0, 0, 100, 0)
    
    
    Repeat
      Screen3DEvents()
      ClearBillboards(0)
    For b = 0 To 600
      
      AddBillboard(b, 0, Random(2000)-1000, Random(18) + 30, Random(2000) - 1000)
    Next b
      
      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
      EndIf
            
      If ExamineKeyboard()
        
        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed 
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed 
        Else
          KeyX = 0
        EndIf
        
        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed 
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed 
        Else
          KeyY = 0
        EndIf
        
      EndIf
            
      RotateCamera(0, MouseY, MouseX, 0, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)
      If CameraY(0)<0 
        ;If IsBillboardGroup(0)
        ;  ForEach bb()
            
        ;    RemoveBillboard(bb(),0)
        ;  Next
          
            
      ;EndIf
      
        
      EndIf
      
      RenderWorld()
      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf
  
Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End