Seite 1 von 2

#PB_Any (-1) ist 100000?

Verfasst: 02.09.2009 22:07
von Mok
N'Abend!

Hab mir gerade einen Code zusammengebastelt (für 'n Spiel).
Ich hab da einfach #PB_Any als #Sprite-Parameter genommen, weil ich noch nicht weiß, wie viele Grafiken ich brauche.
#PB_Any, das weiß doch jedes Kind, hat den Wert -1, warum bricht die Programmausführung bei der markierten Zeile ab? (Mit der Meldung #Image object number is very high (over 100000), are You sure of that?

Code: Alles auswählen

Procedure ResizeSprite(Sprite$, Breite, Hoehe, NeuerName$)
  SpriteID = LoadSprite(#PB_Any,Sprite$)
  LoadImage(SpriteID,Sprite$) ;*********************************
  ResizeImage(SpriteID,Breite,Hoehe)
  SaveImage(SpriteID,NeuerName$)
EndProcedure

Verfasst: 02.09.2009 22:13
von STARGÅTE
ganz einfach weil LoadSprite(#PB_Any,Sprite$) dir nicht -1 zurück gibt, sonden die SpriteNummer die "zufällig" gewählt wurde und die ist nun mal etwas hoch ...

Das einfachste wäre wenn du beides #PB_Any lädtst

Verfasst: 02.09.2009 22:14
von Mok
STARGÅTE hat geschrieben:ganz einfach weil LoadSprite(#PB_Any,Sprite$) dir nicht -1 zurück gibt, sonden die SpriteNummer die "zufällig" gewählt wurde und die ist nun mal etwas hoch ...
Kann es sein, dass das bei PB3.94 noch gefunzt hat :?:

Verfasst: 02.09.2009 22:26
von Kaeru Gaman
nein.
es funktioniert so wie es ist.

wenn du eine feste Nummer 0 - 100000 wählst, wird mit dieser Nummer als Index ein Verweis angelegt,
in dem das Handle das erzeugten Objektes gespeichert wird.
wenn du #PB_Any verwendest, wird dieses Handle direkt zurückgegeben.

diese Handles kannst du nicht wiederverwenden, Free das Objekt und erzeuge das nächste wieder mit #PB_Any.

Verfasst: 03.09.2009 12:35
von Mok
Kaeru Gaman hat geschrieben:nein.
Sämtlich Codes aus "Programming 2D Scrolling Games" benutzen aber eine ähnliche vorgehensweise und funzten trotzdem :?
Einen Beispielcode kann ich grad nicht posten, da ich das Buch wieder irgendwo verräumt habe...

Verfasst: 03.09.2009 12:47
von DarkDragon
Ist das nicht eine Debugger Warnung? Die kann man doch Notfalls unter den Compiler-Optionen > Kompillieren/Starten > Warnhinweis-Modus verwenden: Warnungen ignorieren abschalten. Ist zwar nicht so schön was du da machst aber wenn es einen triftigen Grund hat und damit nichts anderem in die Quere kommt kann man es so machen.

Verfasst: 03.09.2009 13:16
von Kaeru Gaman
Mok hat geschrieben:
Kaeru Gaman hat geschrieben:nein.
Sämtlich Codes aus "Programming 2D Scrolling Games" benutzen aber eine ähnliche vorgehensweise und funzten trotzdem :?
Einen Beispielcode kann ich grad nicht posten, da ich das Buch wieder irgendwo verräumt habe...
entweder du verwechselst da was, oder der Autor hat Mist verzapft.

ein Handle wiederzuverwenden ist äußerst konterproduktiv:
bei der Wiederverwendung wird es nicht als Handle verwendet, sondern als Index auf den internen Table der dann das neue Handle beinhaltet.

Es ist die völlig falsche und ober unsinnigste Verfahrensweise. basta!

es ist vom ganzen Konzept her nicht dafür gemacht, also lass es.

Es ist mir auch egal wo du's herhast, und warum du der Meinung bist, es ginge oder was auch immer.

und wenn man hundert mal die Warnung abschaltet, es ist immer noch Unsinn.

Es ist scheiße, lass es sein.

Verfasst: 03.09.2009 13:21
von DarkDragon
Kaeru Gaman hat geschrieben:
Mok hat geschrieben:
Kaeru Gaman hat geschrieben:nein.
Sämtlich Codes aus "Programming 2D Scrolling Games" benutzen aber eine ähnliche vorgehensweise und funzten trotzdem :?
Einen Beispielcode kann ich grad nicht posten, da ich das Buch wieder irgendwo verräumt habe...
entweder du verwechselst da was, oder der Autor hat Mist verzapft.

ein Handle wiederzuverwenden ist äußerst konterproduktiv:
bei der Wiederverwendung wird es nicht als Handle verwendet, sondern als Index auf den internen Table der dann das neue Handle beinhaltet.
Das stimmt jetzt aber auch wieder nicht.

Mit PB_Any wird ja ein Index automatisch generiert, der zurückgegeben wird und kein Handle!

Index1 = LoadSprite(#PB_Any, ...)
LoadSprite(Index2, ...)

Spritetabelle:
Index1 - Handle1
Index2 - Handle2

SpriteID/ImageID gibt das Handle zurück.

Da gab es ja anfangs Verwechslungen und ich dachte wir hätten das mittlerweile geklärt, dass Load ... #PB_Any nie die SpriteID/ImageID zurückgibt.

Und so ein Unsinn ist das garnicht die Warnungen abzuschalten. Angenommen du programmierst irgendwas mit einer hohen Anzahl von Sprites und bist gezwungen über die 10000er Grenze hinauszugehen mit den Indizes, auch wenn du nicht alle gleichzeitig geladen hast, dann ist es doch völlig in Ordnung die Compiler-Warnungen zu unterdrücken.

Verfasst: 03.09.2009 13:37
von Kaeru Gaman
oh konträr, Mondamin!

Code: Alles auswählen

Debug "Program start"

Delay(20000)

Debug "Create Image"
Number = CreateImage( 99999, 256, 256 )
; Number = CreateImage( #PB_Any, 256, 256 )
Debug Number

Delay(20000)

End
man beobachte in der Prozessliste den Speicherverbrauch.
mit #PB_Any: 1.356 K -> 1.376 K
mit Nummer : 1.356 K -> 2.956 K

Grund: Mit Nummer wird eine Handle-Liste erzeugt, mit Any nicht.

Verfasst: 03.09.2009 13:46
von DarkDragon
Hmm gut okay, dann gibt das halt einen Pointer zu einem Strukturierten Speicherbereich zurück die die Informationen beinhaltet (aber nicht die SpriteID/ImageID) aber trotzdem ist in Create...(Index) kein Bereich für gültige Zahlenwerte des Index definiert. Und demnach muss es doch möglich sein CreateImage( 100000, 256, 256 ) auszuführen.

Btw.: Ich heiße nicht Mondamin und das hier ist ein Deutsches Forum ;-) . Wenn du mich beleidigst, dann bitte auf Deutsch. Bin doch keine Backmischung.