Hi!
Ich wollte mal eine theoretische Frage stellen:
Nehmen wir an, ich habe folgende Programmaufstellung:
DIM a[3]
DIM b[3]
FOR tmp = 0 to 2
a[tmp] = tmp
b[tmp] = tmp
NEXT
LOADSPRITE "bla.png", a[0]
LOADSPRITE "hui.png", b[0]
usw.
Bei einem, diesem dort oben, sehr ähnlichen Beispiel hatte ich das Problem, daß mir bloß jedes Mal "hui.png" ausgegeben wurde, obwohl ich SETTEXTURE a[0], -1 angegeben hatte.
Irgendwer eine Idee?
Gruß
W.
PS.: Mir ist natürlich klar, dass ich beiden Variablen den selben Wert zuweise. Ist es dann so, daß a[0] einen Wert bekommt und b[0] den Wert a[0] überschreibt? Denn falls ja, dann muß ich meine halbe Programmstruktur umschreiben.
PPS.: Bis zu welcher Höhe können Zuweisungen zahlentechnisch gehen? Damit meine ich sowas wie: LOADSPRITE "asd.asd", 10000 <-- Ist ein solcher Wert überhaupt möglich?
PPPS.: Hilft es vielleicht bloß eine mehrdimensionale Variable zu schreiben? Worin liegt dann der Unterschied von
a[1][0] = 1
a[0][1] = 1
Würde mir das System die selbe identische Textur anzeigen?
Tja W.
A[0] = 0
A[1] = 1
A[2] = 2
...
B[0] = 0
B[1] = 1
B[2] = 2
Muss ich noch mehr dazu sagen ?
Wenn du das so hast :
LOADSPRITE "bla.png", 0
LOADSPRITE "hui.png", 0
Zählt immer das als letztes geladene Sprite!
Tja, dann bleibt bloß noch die Frage, wie ich das umbaue...
Danke, übrigens! Damit habe ich zumindest schon mal die Möglichkeit die GLDB einzubauen... =)
Gernot hatte das schon mal irgendwo gepostet. Schreib dir einfach eine Funktion, die die Spritenummern hochzählt
z.b.
function newsprite:
static spritenr
inc spritenr, 1
return spritenr
endfunction
Die Zuweisung dann einfach immer mi Funktionsaufruf
A[0] = newsprite() // = 0
A[1] = newsprite() // = 1
B[0] = newsprite() // = 2
usw.
kannst die Grafik ja auch gleich laden lassen innerhalb der Funktion, wenn du magst
achja, hier das Teil von Gernot:
http://www.glbasic.com/forum/viewtopic.php?id=177
Das ist super! Genau danach habe ich gesucht! =D
Damit sind jede Menge Probleme gelöst! Danke...
Oder:
FUNCTION SpriteLoad: Name$
LOCAL num,XX,YY
GETSPRITESIZE num, XX, YY
WHILE XX <> 0
INC num,1
GETSPRITESIZE num, XX, YY
WEND
LOADSPRITE Name$, num
RETURN num
ENDFUNCTION
Also:
File[0] = SpriteLoad("test.png")
File[1] = SpriteLoad("test2.png")
Vorteil:
Keine Globale !!!!
Gut, beim Quentin auch, aber ist halt Geschmackssache...
Ich teste mal beide Möglichkeiten! =D
Quentins Variante funzt bis jetzt ziemlich gut, heute Nachmittag ist deine dran, Schranzi! =)
Funktionieren werden beide.
Schranzors Methode hat den Vorteil, daß man sicher sein kann, keine schon belegte Spritenummer zu überklatschen. Das ist bei meiner Variante nicht so, nur, wenn man die Spritenummern ausschließlich über diese Funktion vergibt. Da kann man ja aber nie sicher sein ;)
Jetzt noch eine Frage:
Eine Textur entladen läuft wie? Oder macht es da mehr Sinn, einfach das Ding zu überschreiben???
Und noch was: So, wie ich das gesehen habe, kann man ja theoretisch so auch (mit Dim usw.) dynamisch viele Objekte und Texturen laden, oder??? Damit meine ich, daß man keine fix gesetzten Grenzen hat, außer vielleicht den Arbeitsspeicher des Rechners...
Sprite freigeben geht mit
LOADSPRITE "", spritenr
Beispiel:
LOADSPRITE "grau.bmp", 1
DRAWSPRITE 1, 100, 100
GETSPRITESIZE 1, sx, sy
PRINT "Breite: " + sx + " Höhe: " + sy, 0, 0
SHOWSCREEN
MOUSEWAIT
LOADSPRITE "", 1
GETSPRITESIZE 1, sx, sy
PRINT "Breite: " + sx + " Höhe: " + sy, 0, 0
SHOWSCREEN
MOUSEWAIT
END
Das schon! Ich frage mich halt nur, ob ich den gesamten Bereich wieder runter reduzieren muß...
1 2 3 5 6 --> 1 2 3 4(5 - 1) 5(6 - 1)
Also, wenn die Textur Nr. 4 entladen wurde.
Andererseits ist Schranz0rs Code ja so ausgelegt, daß er mir beim nächsten Laden die Lücke bei 4 ja wieder ausfüllen würde, oder?
wie du schon sagtest, mit Schranzors Methode werden auch die Lücken wieder gefüllt. Das Teil zählt ja immer von Nummer 0 hoch, bis es eine freie Spritenummer findet.
Dann werde ich wohl wirklich seine Methode verwenden, denn die ist so wirklich am optimalsten...
FUNCTION SpriteUnload: Name$
local num
num = Name$
LOADSPRITE "", num
RETURN num
ENDFUNCTION
So sollte das doch funktionieren, oder? Brauche ich dann eigentlich noch das RETURN? Normalerweise nicht, oder? <-- (sehr viele ODERs drin)
*ggg* du hast einen Hang zu polnischen Grenze, Oder?
eine Funktion SpriteUnload ist wenig sinnvoll, weil LOADSPRITE "", spritenr ja vollkommen ausreicht. Beim nächsten Aufruf von Schranzors Funktion kann diese Nummer ja dann wieder verwendet werden.
Stimmt schon! =)
Das Problem ist nur, daß ich etwas größer plane. Die Idee ist, das gesamte Objekt aus meiner (halbfertigen) GLDB zu laden und per Schleifen zu jagen. In den Schleifen werden Objekte, Texturen & Bumps geladen. Ausgegeben wird das Ganze dann in Komination + Newton Grundmodell, das natürlich auch schon geladen ist.
Deshalb dachte ich daran, es eben so zu lösen, da es ansonsten ziemlich schwierig wird, das Ganze über eine Schleife zu entladen...
Garnicht entladen und einfach überschreiben?
Stimmt natürlich!
Aber auf deine Art funzt das nicht ganz, denn er erhöht einfach immer weiter! Deshalb habe ich einfach eine kurze UNLOAD - Funktion geschrieben, die ich kurz drüber laufen lasse. Das geht dann schon...
Bin ziemlich dankbar für die Funktion! Die ist nämlich genial...