RemoveBillboard, Wie?

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
FosJonas
Beiträge: 121
Registriert: 12.11.2008 19:31

RemoveBillboard, Wie?

Beitrag 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?
Purebasic 5.10 | Kubuntu 12.04 (64 bit) | Opera 12.01 | Nvidia GT 9800
Xubuntu 12.04 (64 bit) | Intel HD Graphis (Onboard)
Benutzeravatar
Chimorin
Beiträge: 451
Registriert: 30.01.2013 16:11
Computerausstattung: MSI GTX 660 OC mit TwinFrozr III
6Gb DDR 3 RAM
AMD Phenom II X4 B55 @ 3,6GHz
Windows 7 Home Premium 64-bit

Re: RemoveBillboard, Wie?

Beitrag 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 ^^
Bild

- formerly known as Bananenfreak -
Benutzeravatar
FosJonas
Beiträge: 121
Registriert: 12.11.2008 19:31

Re: RemoveBillboard, Wie?

Beitrag 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.
Purebasic 5.10 | Kubuntu 12.04 (64 bit) | Opera 12.01 | Nvidia GT 9800
Xubuntu 12.04 (64 bit) | Intel HD Graphis (Onboard)
Benutzeravatar
Chimorin
Beiträge: 451
Registriert: 30.01.2013 16:11
Computerausstattung: MSI GTX 660 OC mit TwinFrozr III
6Gb DDR 3 RAM
AMD Phenom II X4 B55 @ 3,6GHz
Windows 7 Home Premium 64-bit

Re: RemoveBillboard, Wie?

Beitrag 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...
Bild

- formerly known as Bananenfreak -
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: RemoveBillboard, Wie?

Beitrag 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
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Antworten