Seite 1 von 1
Enumeration beginnt statt 0 bei 1?
Verfasst: 03.02.2026 20:55
von Delle
Hallo zusammen,
warum ist die SpriteID von #Hintergrund 1, anstatt 0?
Code: Alles auswählen
Enumeration
#Hintergrund
#Figur1
#Figur2
#Figur3
EndEnumeration
If OpenWindow(100, 0, 0, 1920, 1080, "", #PB_Window_ScreenCentered)
If OpenWindowedScreen(WindowID(100), 0, 0, 1920,1080, 0, 0, 0)
SetFrameRate(60)
SpriteQuality(#PB_Sprite_BilinearFiltering)
LoadSprite(#Hintergrund, "hintergrund.png"):Debug SpriteID(#Hintergrund)
LoadSprite(#Figur1, "1.png",#PB_Sprite_AlphaBlending):Debug SpriteID(#Figur1)
LoadSprite(#Figur2, "2.png",#PB_Sprite_AlphaBlending):Debug SpriteID(#Figur2)
LoadSprite(#Figur3, "3.png",#PB_Sprite_AlphaBlending):Debug SpriteID(#Figur3)
...
Welches Objekt schreibt sich denn als 0 rein? Das Fenster vielleicht? Der Screen?
Ich habe es auch mit expliziten Zuweisungen probiert, auch ohne Erfolg:
Code: Alles auswählen
Enumeration
#Hintergrund = 0
#Figur1 = 1
#Figur2 = 2
#Figur3 = 3
EndEnumeration
Hat jemand eine Idee?

Re: Enumeration beginnt statt 0 bei 1?
Verfasst: 03.02.2026 21:18
von HeX0R
Vielleicht geht Dir ja damit ein Licht auf:
Code: Alles auswählen
#Hintergrund = 712
#Figur1 = 99
#Figur2 = 123
#Figur3 = 0
InitSprite()
OpenWindowedScreen(OpenWindow(0, 0, 0, 1920, 1080, "", #PB_Window_ScreenCentered), 0, 0, 1920,1080, 0, 0, 0)
CreateSprite(#Hintergrund, 128, 128):Debug SpriteID(#Hintergrund)
CreateSprite(#Figur1, 128, 128):Debug SpriteID(#Figur1)
CreateSprite(#Figur2, 128, 128):Debug SpriteID(#Figur2)
CreateSprite(#Figur3, 128, 128):Debug SpriteID(#Figur3)
Re: Enumeration beginnt statt 0 bei 1?
Verfasst: 03.02.2026 21:34
von Delle
Nee, leider nicht
Macht die Enumeration in dem Falle mehr Schaden als Nutzen?
Für mich wäre halt günstig gewesen, wenn #Figur1 auch gleich der SpriteID = 0 entspricht...
Aber so werde ich wohl oder übel für jede Figur die tatsächliche SpriteID in einer Linked List speichern...
Re: Enumeration beginnt statt 0 bei 1?
Verfasst: 03.02.2026 23:14
von mk-soft
Du must nicht die SpriteID wissen, sondern nur bei bedarf verwenden. Es ist das OS spezifische Handle, welches auch jeder zeit anders sein kann
Es ist immer besser Enumeration zu verwenden. Und zwar für jeden Objekt Type eine eigene Enumeration. (window, gadgets, images, sprites, etc)
Zum fortsetzen von Object besser Named Enumerations verwenden.
Hierzu siehe in der PB-Hilfe dir den Eintrag PureBasic Objekte an.
Re: Enumeration beginnt statt 0 bei 1?
Verfasst: 04.02.2026 13:03
von NicTheQuick
Alle Werte wie SpriteID(), WindowID(), ConnectionID(), ImageID(), usw. liefern immer OS-interne Handles. Die kannst du nicht selbst bestimmen.
Außerdem verstehe ich nicht wie du darauf kommst, dass SpriteID() den Wert aus der Enumeration zurückgeben sollte. Wäre ja komisch, weil dann bräuchte man SpriteID() nicht mehr.
Re: Enumeration beginnt statt 0 bei 1?
Verfasst: 05.02.2026 13:53
von Michael Vogel
Wie Nic so quick gesagt hat, benötigt es interne Referenzen, die halt nicht immer so 'schön' durchnummeriert werden...
Bei Purebasic-internen IDs sind diese oft netterweise fortlaufende Werte, etwa bei den Sprites. Hier wird allerdings mit Eins begonnen, da - wie in den Hilfeseiten ersichtlich - Fehler durch den Rückgabewert Null angezeigt werden.
Bei Betriebssystem-nahen Befehlen werden normalerweise die entsprechenden Referenzen (Handles) genommen, deren Werte können von Purebasic natürlich nicht beeinflusst werden. Dies merkt man beispielsweise bei OpenWindow, wo ein erneuter Aufruf einen anderen Wert zurückliefert. Im Gegensatz dazu verwendet PureBasic bei einem erneuten CreateSprite die freigewordene ID.
Die gute Nachricht: für einfache Programmierjobs werden diese IDs nicht benötigt, somit muss man sich zu Beginn keine Gedanken darüber machen.
Code: Alles auswählen
InitSprite()
OpenWindowedScreen(OpenWindow(0,0,0,256,256,"",#PB_Window_ScreenCentered),0,0,256,256,0,0,0)
Debug CreateSprite(0,32,32)
Debug CreateSprite(0,32,32)
Debug SpriteID(0)
;
Debug OpenWindow(0,0,0,0,0,"")
Debug OpenWindow(0,0,0,0,0,"")
Debug WindowID(0)
Re: Enumeration beginnt statt 0 bei 1?
Verfasst: 05.02.2026 18:25
von Delle
Danke für alle Hinweise!
Ich hab die Enumerationen jetzt entfernt und arbeite so:
Code: Alles auswählen
f1 = LoadSprite(#PB_Any, "1.png",#PB_Sprite_AlphaBlending)
AddFigur(1, "Delle", Random(1920), 300+Random(400), "nein", "ja", "nein", f1)
ForEach ...
DisplayTransparentSprite(Figuren()\sprite, Figuren()\x+5, Figuren()\y+5, 90-abschlag, RGB(0,0,0))
f1 = Figuren()\sprite
Die Werte von f1 usw. werden bei der Figur mit in einer LL gespeichert und sind mir (jetzt) herzlich egal, ich glaube es sind jeweils 10-stellige Nummern oder sowas...
Re: Enumeration beginnt statt 0 bei 1?
Verfasst: 05.02.2026 19:19
von mk-soft
Jetzt muss du dir die dynamische PB-ID von Sprite (Variable f1) merken und wenn du das Sprite nicht mehr brauchst oder überschreiben willst, das Sprite mit FreeSprite(f1) explizit freigeben. Mit Enumeration kannst du das Sprite direkt überschreiben.
Du hättest auch die Enumeration mit 1 starten können (Wenn es dich stört mit 0 anzufangen). Somit wäre im internen Array für die Sprites der Platz 0 freigeblieben.
Re: Enumeration beginnt statt 0 bei 1?
Verfasst: 06.02.2026 13:42
von Axolotl
Meine Gedanken zu Enumeration (Konstanten im Allgemeinen)
Ich verwende immer (außer vllt. in Beispielen) benannte Enumerationen für alle Object-Typen ab 1 (s.Beispiel) und Konstanten. Weil NULL für mich immer und (fast) überall als Fehlerwert gilt.
Anmerkung: Es gibt tatsächlich API-Funktionen wo #ERROR_SUCCESS zurückgegeben wird und dessen Wert ist tatsächlich NULL!
Da mir der eigentilche Wert im weiteren egal ist, und ich immer auch ordenlich auf die Enums oder Konstanten prüfe, könnten sich die Werte sogar zwischen den kompilierungen beliebig oft ändern.....
Nach meiner Meinung ist das ja auch der Sinn von der Verwendung von Enums und Const....
Hinweis: Hilfe zu
Handles und Nummern
Code: Alles auswählen
Enumeration EWindow 1
#WND_Main
; .....
#WND_Trace
EndEnumeration
Enumeration EGadget 1
#GDT_btnAdd
#GDT_btnCancel
; .....
#GDT_edtOutput
EndEnumeration
; Advantage: Continuation is possible at any time without errors.
Enumeration EWindow ; continued
#WND_Preferences
; .....
EndEnumeration
Re: Enumeration beginnt statt 0 bei 1?
Verfasst: 06.02.2026 14:13
von mk-soft
Der Vorteil von Enumerations ist auch das man ein Event Management mit virtuellen Funktionstabellen verbinden kann.
Mache ich zum Beispiel bei meine EventDesigner.
Part of Event Management
Code: Alles auswählen
...
Prototype _MyPrototypeInvoke()
Structure _MyEventInvoke
Invoke._MyPrototypeInvoke[0]
EndStructure
Global *vTableMyEventSizeWindow._MyEventInvoke = ?vTableMyEventSizeWindow
Global *vTableMyEventCloseWindow._MyEventInvoke = ?vTableMyEventCloseWindow
Global *vTableMyEventMenu._MyEventInvoke = ?vTableMyEventMenu
Global *vTableMyEventGadget._MyEventInvoke = ?vTableMyEventGadget
...