BlitzExtensions: Nützliche Erweiterungsfunktionen für Blitz
Übersicht BlitzBasic Codearchiv
PacManiBetreff: BlitzExtensions: Nützliche Erweiterungsfunktionen für Blitz |
Fr, Okt 21, 2011 20:41 Antworten mit Zitat |
|
---|---|---|
Hallo zusammen,
diese Datei habe ich bisher in allen meinen Spielen genutzt und sie ist deswegen auch immer wieder angewachsen zu einem (geordnetem) Sammelsurium von allerlei Funktionen. Neben Konstanten für jede Taste und den wichtigsten Befehlsparametern der Blitz-Standardbefehle bietet sie mathematische Funktionen und Methoden zum Bearbeiten oder Analysieren von Strings, seit einer Stunde auch 2 Befehle zur Arbeit mit Bildern. Achtung: Einige wenige Funktionen erwarten bestimmte Werte in bestimmten Variablen. Die Mausvariablen für MouseInRect() müssten z.B. in MseX und MseY gespeichert worden sein oder die Auflösungsbreite und Höhe für GetCurrentScreen() in ResWidth und ResHeight. Man kann sich die Funktionen aber auch so um Parameter erweitern, dass diese Werte dynamisch übergeben werden. Das überlasse ich euch Es kann natürlich auch weiterhin sein, dass einige Funktionen noch optimierbar sind. Hierbei bitte ich um freundliche Mithilfe Hier folgt der Code und darunter die Erläuterung der einzelnen Befehle inklusive Parameter. Ich hoffe, diese Datei ist für euch hilfreich: BlitzBasic: [AUSKLAPPEN] ;Stellt hilfreiche Erweiterungen für Blitz bereit. Mathematische Funktionen Funktionen, die mit Zahlen arbeiten und mit ihnen etwaige Dinge anstellen... IIf# Je nachdem, ob die übergebene Bedingung wahr oder falsch ist, werden die entsprechenden angegebenen Werte zurückgeliefert. Condition: Die Bedingung, auf die überprüft wird. IfTrue#: Der Wert, der zurückgegeben wird, wenn die Bedingung wahr ist. IfFalse#: Der Wert, der zurückgegeben wird, wenn die Bedingung falsch ist. Bsp.: IIf(8 > 10, 1.1, 1.2) = 1.2 IsBetween Liefert zurück, ob sich die übergebene Zahl zwischen den angegebenen Zahlen befindet. Value#: Die zu prüfende Zahl. LowerBound#: Die untere Grenze (Minimum). UpperBound#: Die obere Grenze (Maximum). Bsp.: IsBetween(5, 2, 10) = True Max Liefert die größere der beiden übergebenen Zahlen zurück. A#: Die erste zu prüfende Zahl. B#: Die zweite zu prüfende Zahl. Bsp.: Max(324.23, 239.11) = 324.23 Min Liefert die kleinere der beiden übergebenen Zahlen zurück. A#: Die erste zu prüfende Zahl. B#: Die zweite zu prüfende Zahl. Bsp.: Min(5, 8) = 8 Clamp# Ähnlich wie IsBetween. Wenn die Zahl kleiner ist als das Minimum, wird das Minimum zurückgegeben, wenn die Zahl zwischen den Grenzen liegt wird die Zahl unverändert zurückgegeben. Liegt sie über dem Maximum, so wird das Maximum zurückgegeben. Value#: Die zu prüfende Zahl. LowerBound#: Die untere Grenze (Minimum). UpperBound#: Die obere Grenze (Maximum). Bsp.: Clamp(23, 0, 10) = 10 Cut# Diese Funktion schneidet den Nachkommastellenanteil einer Zahl so weit ab, bis die übergebene Anzahl Dezimalstellen erreicht ist. A#: Die Zahl mit dem abzuschneidenden Nachkommastellenanteil. Decimals: Die Anzahl maximal erlaubter Nachkommastellen. Bsp.: Cut(23.224663, 3) = 23.224 ByteToFloat# Wandelt einen Wert zwischen 0-255 in eine Fließkommazahl zwischen 0.0-1.0 um und gibt sie zurück. Value: Der umzuwandelnde Wert zwischen 0-255. Bsp.: ByteToFloat(127) = 0.5 FloatToByte Das Gegenstück zu ByteToFloat#: Erwartet eine Fließkommazahl zwischen 0.0-1.0 und gibt den dazugehörigen Byte-Wert zurück. Value#: Die umzuwandelnde Fließkommazahl zwischen 0.0-1.0. Bsp.: FloatToByte(0.25) = 64 CheckCollision Überprüft, ob sich zwei Entities mit den angegebenen Radien überschneiden (sollte von daher mehr CheckRadialCollision heißen). Eine schnelle Alternative zu MeshesIntersect bei kreisförmigen Objekten. SourceEntity: Das erste Objekt, das auf Kollision mit dem zweiten Objekt überprüft werden soll. SourceRadius#: Der Radius des ersten Objekts. TargetEntity: Das zweite Objekt, das auf Kollision mit dem ersten Objekt überprüft werden soll. TargetRadius#: Der Radius des zweiten Objekts. GetArgbComponents Löst den Alpha-, Rot-, Grün- und Blauanteil aus der Farbe mit dem übergebenen Hexwert und speichert diese Anteile im Argb()-Array. Value: Der Hexwert der aufzulösenden Farbe. Bsp.: Argb($FF7F00FF) ;~ Argb(0) = 255, Argb(1) = 128, Argb(2) = 0, Argb(2) = 255 GetArgbValue Rechnet aus den Argb-Werten im Argb-Array wieder die hexadezimale Farbe zurück. CreateRandomList Erstellt eine Liste mit der übergebenen Anzahl zufälliger Ganzzahlen zwischen dem angegebenen Minimum und Maximium und beachtet dabei, dass keine doppelten Zahlen (Dubletten) in der Liste vorkommen - wie z.B. bei einer Lottoziehung. Das Ergebnis ist in RandomList() gespeichert. Count: Die Anzahl zu generierender Ganzzahlen. Minimum: Der niedrigste Wert, den eine Zahl in der Liste annehmen darf. Maximum: Der höchste Wert, den eine Zahl in der Liste annehmen darf. Bsp.: CreateRandomList(6, 1, 49) ;Lottoziehung String-Funktionen Funktionen zum Bearbeiten und Analysieren von Zeichenketten alias String-Tangas. Split Teilt den String in mehrere Einzelstrings an jedem Vorkommen des übergebenen Zeichens und speichert die Teilstrings im SplitString$()-Array. Value$: Die aufzuteilende Zeichenkette. SplitChar$: Das Zeichen, nach dem gesucht werden soll und an dessen Stelle die Zeichenkette aufgetrennt wird. Bsp.: SplitString("Ein|dummer|Test", "|") ;~ SplitString(0) = "Ein", SplitString(1) = "dummer", SplitString(2) = "Test" FitNumber$ Wandelt die übergebene Nummer in einen String um und füllt sie mit Nullen im Nachkommastellenbereich aus oder zusätzlich mit dem Füllzeichen im Vorkommastellenbereich. A#: Die aufzufüllende Nummer PostFill: Die Anzahl Zeichen, die im Nachkommastellenanteil mit Nullen ergänzt werden. PreFill = -1: Die Anzahl Zeichen, die im Vorkommastellenanteil mit dem übergebenden Zeichen aufgefüllt werden. PreFillChar$ = " ": Das Zeichen, das im Vorkommastellenanteil zum Auffüllen genutzt wird. Bsp.: FitNumber(3.23, 5, 3, "X") = "XX3.23000" TrimNumber$ Wandelt die übergebene Zahl in einen String um, der keine unnötigen Nullen im Nachkommastellenbereich enthält. A#: Die umzuwandelnde Nummer Bsp.: TrimNumber(324.000) = "324" Write0String Schreibt einen null-terminierten String in den übergebenen Stream. Mehr dazu hier: https://www.blitzforum.de/foru...hp?t=36503 Stream: Der Ausgabestream, in den geschrieben wird. Value$: Der zu schreibende Text Read0String$ Liest einen null-terminierten String aus dem übergebenen Stream. Mehr dazu hier: https://www.blitzforum.de/foru...hp?t=36503 Stream: Der Eingabestream, aus dem gelesen wird. TextMultiline Eine erweiterte Text-Funktion, mit der mehrzeiliger Text geschrieben, ausgerichtet und zentriert werden kann. X: Die X-Koordinate, an der Textzeichen anfangen geschrieben werden. Y: Die Y-Koordinate, an der Textzeichen anfangen geschrieben werden. Value$: Der (mehrzeilige) Text, der gezeichnet werden soll. CentreX = False: Zentriert den Text an der X-Koordinate. CentreY = False: Zentriert den Text an der Y-Koordinate Spacing = 0: Zusätzlicher Abstand zwischen den Textzeilen InstrR Das Gegenstück zu Instr, hier wird der String von hinten nach dem Zeichen durchsucht und dessen Index im String zurückgegeben. Optional wird auch nur zwischen einem bestimmten Bereich in dem String gesucht. String_$: Der zu durchsuchende String. Find$: Das zu findende Zeichen From = -1: Der Zeichenindex, von der aus der String durchsucht werden soll. To_ = 1: Der Zeichenindex, an dem die Durchsuchung des Strings enden soll. Bsp.: InstrR("Hallo! Wie geht's?", "e", 5) = 13 Eingabe Eine Forever Alone-Funktion momentan nur, um die Arbeit mit Mauseingaben zu erleichtern. MouseInRect Überprüft, ob sich der Mauszeiger in dem angegebenen Rechteck befindet. Die Mauszeiger-Koordinaten müssen in MseX und MseY gespeichert sein. X: X-Koordinate des Rechtecks, in dem sich die Maus befinden soll. Y: Y-Koordinate des Rechtecks, in dem sich die Maus befinden soll. Width: Breite des Rechtecks, in dem sich die Maus befinden soll. Height: Höhe des Rechtecks, in dem sich die Maus befinden soll. Dateisystem Hier werden sich vor allem .NET-Nutzer freuen, die viele dieser Funktionen aus der .NET-Path-Klasse wiedererkennen werden. CombinePath$ Liefert den zusammengeführten Pfad der beiden Ordnerpfade zurück (z.B. ohne doppelte Trennstriche). Path1$: Der erste Pfad. Path2$: Der zweite Pfad. Bsp.: CombinePath("C:\Spiel", "Level\level.txt") = "C:\Spiel\Level\level.txt" GetFileCount Liefert die Anzahl Dateien in dem Ordner mit dem übergebenen Pfad zurück. DirectoryPath$: Der Pfad zu dem Verzeichnis, dessen Dateien gezählt werden sollen. GetDirectoryCount Liefert die Anzahl Unterordner in dem Ordner mit dem übergebenen Pfad zurück. DirectoryPath$: Der Pfad zu dem Verzeichnis, dessen Unterordner gezählt werden sollen. GetRandomFilename$ Liefert einen zufälligen Dateinamen aus dem Ordner mit dem übergebenen Pfad zurück. Path$: Der Pfad des Verzeichnisses, aus dem ein Dateiname zufällig gewählt werden soll. Bsp.: GetRandomFilename("C:\Windows") = "explorer.exe" ;oder "win.ini" etc. GetFilename$ Extrahiert den Dateinamen aus dem übergebenen absoluten oder relativen Pfad und gibt ihn zurück. Path$: Der Pfad der Datei, absolut oder relativ. Bsp.: GetFilename("C:\Test\TollesBild.png") = "TollesBild.png" GetFilenameWithoutExtension$ Extrahiert den Dateinamen ohne Dateierweiterung aus dem übergebenen absoluten oder relativen Pfad und gibt ihn zurück. Path$: Der Pfad der Datei, absolut oder relativ. Bsp.: GetFilenameWithoutExtension("C:\Test\TollesBild.png") = "TollesBild" Bildmanipulation Einige wenige Befehle zur Arbeit mit Bildern. GetCurrentScreen Der aktuelle Bildschirminhalt (genauer gesagt der Inhalt des BackBuffers) wird als Bild zurückgegeben. Dazu muss die Auflösungsbreite und -höhe in ResWidth bzw. ResHeight gespeichert sein! Bsp.: Local ImgBildschirm = GetCurrentScreen() ImageGamma Erhellt oder verdunkelt das übergebene Bild. Image: Das zu bearbeitende Bild. Achtung: Genau dieses Bild wird manipuliert und keine Kopie bearbeitet! Amount#: Der Gammawert. 1.0 entspricht keiner Änderung, kleinere Werte verdunkeln das Bild, höhere Werte erhellen es. Safe = True: Wird dieser Parameter auf False gesetzt, wird das neue Bild minimal schneller berechnet, aber dann ist Vorsicht bei Erhellung (Gammawert > 1.0) geboten, denn dann können falsche Farben entstehen. Bei Verdunkelung sollte dies aber kein Problem sein. |
||
- Zuletzt bearbeitet von PacMani am So, Nov 06, 2011 12:15, insgesamt 10-mal bearbeitet
PhillipK |
Fr, Okt 21, 2011 21:58 Antworten mit Zitat |
|
---|---|---|
Puh, sind ja doch ein paar mehr funktionen.
Beim groben drüberlesen musste ich schmunzeln. Es gibt also tatsächlich noch eine person, die fauler ist, als ich selbst? IIf zb ^^ Alles in allem eine sehr.. exotische sammlung. Etwas viel häufiger genutztes (zumindest von mir) ist zb eine Sqr-abstandsberechnung. Heißt: BlitzBasic: [AUSKLAPPEN] Function WurzelDistanz:Float(x1:Float,y1:Float,x2:Float,y2:Float) zum beispiel Aber ich denke, das kommt immer auf den eigenen geschmack an. Wie gesagt - teilweise exotisch, aber jeder muss selbst wissen, was er nutzen möchte. Von daher gibts nichts zu meckern - wers für unfug hält, ist nicht angewiesen, die sachen zu nutzen ^^ Ein paar nützliche dinge sind aber auch drin Das ganze kann man sicher noch erweitern wenn du magst. Vielleicht sammelt sich ja ein kleiner Hilfsfunktionen-thread *g* ps: Zitat: NormalizeSimple#
Ähnlich wie IsBetween. Wenn die Zahl kleiner ist als das Minimum, wird das Minimum zurückgegeben, wenn die Zahl zwischen den Grenzen liegt wird die Zahl unverändert zurückgegeben. Liegt sie über dem Maximum, so wird das Maximum zurückgegeben. Value#: Die zu prüfende Zahl. LowerBound#: Die untere Grenze (Minimum). UpperBound#: Die obere Grenze (Maximum). Bsp.: NormalizeSimple(23, 0, 10) = 10 Normalize? Das kenne ich von Vektoren, um sie auf die Länge 1 zu bringen. Das sieht mir eher nach Clamping aus - dh ober oder untergrenze oder das dazwischen. |
||
hazumu-kun |
Fr, Okt 21, 2011 22:47 Antworten mit Zitat |
|
---|---|---|
Zum Thema NormalizeSimple muss ich meinem Vorposter zustimmen.
Aber mir ist direkt eingefallen wofür man das gebrauchen könnte: Usereingaben auf einen Bereich begrenzen. Sehr gute Funktionssammlung! Ich bevorzuge aber sowas immer individuell neu zu programmieren, der Übung wegen. |
||
Warum kann es keine omnipotente Macht geben?
Weil diese omnipotente Macht in der Lage sein müsste, einen so schweren Stein zu schaffen, dass sie ihn nicht heben kann -> nicht omnipotent |
PacMani |
Sa, Okt 22, 2011 3:56 Antworten mit Zitat |
|
---|---|---|
Danke für das Wort "Clamping". Darauf bin ich damals nicht gekommen, als ich die Funktion benötigte Die würde ich dann entsprechend umbenennen.
@PhillipK: Zumindest zum Vergleichen von Entfernungen habe ich gehört, dass man auf die Wurzel verzichten sollte. Das Wurzelziehen soll zumindest in der Hauptschleife genutzt doch schon ein wenig Zeit beanspruchen. Und die Quadrate der Entfernungen lassen sich für Vergleiche immerhin noch nutzen - nur wenn man dann mal die tatsächliche Entfernung benötigt muss natürlich wie von dir gezeigt die Wurzel her. |
||
PhillipK |
Sa, Okt 22, 2011 10:01 Antworten mit Zitat |
|
---|---|---|
Ich verzichte teilweise gänzlich auf Wurzelentfernungen^^
Meist reicht ja schon eine ABS - Variante. Der name der dahinter steht, ist mir grade entfallen, ich nenn's immer "Pixelweg" : BlitzBasic: [AUSKLAPPEN] Function Pixelweg:Float(x1:Float, y1:Float, x2:Float, y2:Float) Das liefert eine Karoförmige distanz. Ps: (dochnoch gefunden, Manhatten Metrik / Distanz) Naja - reicht meistens auch schon als distanzfindung^^ Ist kein wunderschöner kreis, aber hiermit lässt sich - zumindest für grobe vorvergleiche - auch gut mit arbeiten. Ps: Ich habe auch so eine funktionssammlung, die in jedes Projekt mit einfliest.. ist das ein "standart" unter Programmierern? |
||
PacMani |
Sa, Okt 22, 2011 10:43 Antworten mit Zitat |
|
---|---|---|
Ich denke, jeder, der schonmal mehr als ein Spiel programmiert hat brauchte zumindest die eine oder andere Sache mehrmals. Von daher kann ich eigentlich nur dazu raten, allgemeine, wiederverwendbare Dinge in eine eigene Datei zu schreiben. Von daher ist es bei mir schon Standard. | ||
blackgecko |
So, Okt 23, 2011 20:21 Antworten mit Zitat |
|
---|---|---|
Sauberer ist es aber, man ordnet wiederverwendbare Codestücke nach Einsatzgebieten und schreibt sie in verschiedene Dateien.
Wenn man in einem Projekt die alte Funktion braucht, die ini-Dateien ausliest, dann ist es ja Quatsch, wenn man zusammen mit dieser einen Funktion noch kiloweise anderen (unnötigen) Code importiert. |
||
So long and thanks for all the fish.
Fedora 17 | Windows 7 || BlitzPlus | BlitzMax Rechtschreibflame GO!!! Deppenapostroph | SeidSeit | Deppenakzent | DassDas | Deppenleerzeichen | TodTot | enzigste.info - Ja, ich sammel die. |
- Zuletzt bearbeitet von blackgecko am So, Okt 23, 2011 21:03, insgesamt einmal bearbeitet
PacMani |
So, Okt 23, 2011 20:22 Antworten mit Zitat |
|
---|---|---|
Richtig, aber bisher brauchte ich fast alle immer wieder Und einen INI-Leser würde ich auch als völlig eigene Klasse in C++ implementieren und von daher auch in BB in eine eigene Datei schreiben - aber diese Funktionen hier sind alle Einzelgänger die nicht großartig zusammenhängen. | ||
- Zuletzt bearbeitet von PacMani am Sa, Nov 05, 2011 15:37, insgesamt einmal bearbeitet
PacMani |
Sa, Nov 05, 2011 15:32 Antworten mit Zitat |
|
---|---|---|
Neue Funktion hinzugefügt:
CreateRandomList Erstellt eine Liste mit der übergebenen Anzahl zufälliger Ganzzahlen zwischen dem angegebenen Minimum und Maximium und beachtet dabei, dass keine doppelten Zahlen (Dubletten) in der Liste vorkommen - wie z.B. bei einer Lottoziehung. Das Ergebnis ist in RandomList() gespeichert. Count: Die Anzahl zu generierender Ganzzahlen. Minimum: Der niedrigste Wert, den eine Zahl in der Liste annehmen darf. Maximum: Der höchste Wert, den eine Zahl in der Liste annehmen darf. Bsp.: CreateRandomList(6, 1, 49) ;Lottoziehung |
||
blackgecko |
So, Nov 06, 2011 0:28 Antworten mit Zitat |
|
---|---|---|
Dieses Verfahren kann bei langen Listen seeeehr lange dauern (bis hin zu einer Fast-Endlosschleife) und ist deshalb nicht empfehlenswert. Du musst nur mal probieren createrandomlist(100000,1,100000) zu berechnen.
Ich würd dir eine andere Methode empfehlen: Erstell eine Liste, in der der Reihe nach alle Zahlen stehen, die erlaubt sind. Und dann pick dir zufällig so viele raus wie du brauchst. Jedes Mal wenn eine Stelle frei wird, nimmst du die letzte Zahl der Liste, setzt sie an die freie Stelle und zählst irgendeine Variable, in der die Länge der Liste steht, um eins runter. |
||
So long and thanks for all the fish.
Fedora 17 | Windows 7 || BlitzPlus | BlitzMax Rechtschreibflame GO!!! Deppenapostroph | SeidSeit | Deppenakzent | DassDas | Deppenleerzeichen | TodTot | enzigste.info - Ja, ich sammel die. |
PacMani |
So, Nov 06, 2011 0:31 Antworten mit Zitat |
|
---|---|---|
Sehr durchdacht, gute Idee. Ist an sich vielleicht etwas unhandlicher, aber für Listen wie in deinem Beispiel genannt wohl ein Muss. Funktionieren würde es nur dann nicht, wenn die Liste vorab schon fest berechnet sein muss und nicht im Nachhinein Zahlen gepickt werden.
Für kleinere Listen (ich testete mit bis zu 500 Zahlen) reicht aber auch in schlimmeren Fällen mit vielen Dubletten obige Methode, bisher wurde sie in nicht bemerkbarer Zeit berechnet, deswegen würde ich die Methode der Einfachheit halber doch erstmal drin lassen. Aber mir fällt gerade ein, dass man dies auch kombinieren könnte und die Methode CreateRandomList tatsächlich so arbeiten lässt wie von dir vorgeschlagen und dann in einer zweiten Liste die gepickten Werte speichert. EDIT: Hab's nun so angepasst. |
||
blackgecko |
So, Nov 06, 2011 19:57 Antworten mit Zitat |
|
---|---|---|
Noch ein Tip für schöneren Code: In BlitzBasic kann man soweit ich mich erinnere auch innerhalb von Funktionen Arrays erstellen:
BlitzBasic: [AUSKLAPPEN] Local RandomTemp[Count]So oder so in der Art. Musst halt mal ausprobieren, ich hab hier grad kein BB. Dann müsste das Array halt nicht global sein Möglicherweise kann eine Funktion solch ein BlitzArray (so heißen die Dinger doch?) sogar mit Return zurückgeben... |
||
So long and thanks for all the fish.
Fedora 17 | Windows 7 || BlitzPlus | BlitzMax Rechtschreibflame GO!!! Deppenapostroph | SeidSeit | Deppenakzent | DassDas | Deppenleerzeichen | TodTot | enzigste.info - Ja, ich sammel die. |
ZEVS |
So, Nov 06, 2011 20:00 Antworten mit Zitat |
|
---|---|---|
Zitat: Möglicherweise kann eine Funktion solch ein BlitzArray [...] sogar mit Return zurückgeben
Kann sie leider nicht Rest geht aber. ZEVS |
||
PacMani |
So, Nov 06, 2011 20:51 Antworten mit Zitat |
|
---|---|---|
Wollte ich auch erst so machen, aber vergaß:
BlitzBasic: [AUSKLAPPEN] Local RandomTempLength = Count - 1 Fehler in zweiter Zeile: Blitz array sizes must be constant - es geht also nicht mit Variablen als Länge Widerspricht allen anderen Programmiersprachen der Welt - aber es geht ja auch mit Dim. |
||
Übersicht BlitzBasic Codearchiv
Powered by phpBB © 2001 - 2006, phpBB Group