BlitzExtensions: Nützliche Erweiterungsfunktionen für Blitz

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

PacMani

Betreff: BlitzExtensions: Nützliche Erweiterungsfunktionen für Blitz

BeitragFr, Okt 21, 2011 20:41
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink

Es kann natürlich auch weiterhin sein, dass einige Funktionen noch optimierbar sind. Hierbei bitte ich um freundliche Mithilfe Smile

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.

;Konstanten #######################################################################################
;Blitz-Befehlsparameter ===========================================================================
Const CameraProjModeDisabled = 0, CameraProjModePerspective = 1, CameraProjModeOrthogonal = 2
Const CollisionMethodEllipsoid = 1, CollisionMethodPolygon = 2, CollisionMethodBox = 3
Const CollisionResponseNone = 1, CollisionResponseFullSliding = 2, CollisionResponseSliding = 3
Const EntityBlendNormal = 1, EntityBlendCombine = 2, EntityBlendAdditive = 3
Const EntityFxFullBright = 1, EntityFxVertexColors = 2, EntityFxFlatShaded = 4, EntityFxDisableFog = 8, EntityFxDisableCulling = 16, EntityFxEnableVertexAlpha = 32
Const EntityPickModeNone = 0, EntityPickModeRadius = 1, EntityPickModePolygon = 2, EntityPickModeBox = 3
Const FileTypeInvalid = 0, FileTypeFile = 1, FileTypeDirectory = 2
Const Graphics3DModeAutomatic = 0, Graphics3DModeFullscreen = 1, Graphics3DModeWindowed = 2, Graphics3DModeSizableWindowed = 3
Const MouseLeft = 1, MouseRight = 2, MouseMiddle = 3
Const SpriteViewModeFixedRoll = 1, SpriteViewModeFixed = 2, SpriteViewModeUnfixed = 3, SpriteViewModeFixedPitch = 4
Const TextureFilterColor = 1, TextureFilterAlpha = 2, TextureFilterMasked = 4, TextureFilterMipmapped = 8, TextureFilterClampU = 16, TextureFilterClampV = 32, TextureFilterReflection = 64, TextureFilterEnvironment = 128, TextureFilterVRAM = 256, TextureFilterHighColor = 512
;Tastenscancodes ----------------------------------------------------------------------------------
Const KeyEscape = 1, KeyF1 = 59, KeyF2 = 60, KeyF3 = 61, KeyF4 = 62, KeyF5 = 63, KeyF6 = 64, KeyF7 = 65, KeyF8 = 66, KeyF9 = 67
Const Key1 = 2, Key2 = 3, Key3 = 4, Key4 = 5, Key5 = 6, Key6 = 7, Key7 = 8, Key8 = 9, Key9 = 10, Key0 = 11, KeyBackspace = 14
Const KeyTab = 15, KeyQ = 16, KeyW = 17, KeyE = 18, KeyR = 19, KeyT = 20, KeyY = 21, KeyU = 22, KeyI = 23, KeyO = 24, KeyP = 25, KeyEnter = 28
Const KeyCapsLock = 58, KeyA = 30, KeyS = 31, KeyD = 32, KeyF = 33, KeyG = 34, KeyH = 35, KeyJ = 36, KeyK = 37, KeyL = 38
Const KeyShiftLeft = 42, KeyZ = 44, KeyX = 45, KeyC = 46, KeyV = 47, KeyB = 48, KeyN = 49, KeyM = 50, KeyShiftRight = 54
Const KeyCtrlLeft = 29, KeyWinLeft = 219, KeyAlt = 56, KeySpace = 57, KeyAltGr = 184, KeyWinRight = 220, KeyContextMenu = 221, KeyCtrlRight = 157
Const KeyPrint = 183, KeyRoll = 70, KeyPause = 197
Const KeyIns = 210, KeyHome = 199, KeyPageUp = 201
Const KeyDel = 211, KeyEnd = 207, KeyPageDown = 209
Const KeyArrowUp = 200
Const KeyArrowLeft = 203, KeyArrowDown = 208, KeyArrowRight = 205
Const KeyNumLock = 69, KeyNumDivide = 181, KeyNumMultiply = 55, KeyNumMinus = 74
Const KeyNum7 = 71, KeyNum8 = 72, KeyNum9 = 73, KeyNumPlus = 78
Const KeyNum4 = 75, KeyNum5 = 76, KeyNum6 = 77
Const KeyNum1 = 79, KeyNum2 = 80, KeyNum3 = 81, KeyNumEnter = 156
Const KeyNum0 = 82, KeyNumSeperator = 83

;Funktionen #######################################################################################
;Mathematisches ===================================================================================
;Not A Number -------------------------------------------------------------------------------------
Global NaN# = Sqr(-1)
;Gibt den ersten Wert zurück wenn true, sonst den zweiten -----------------------------------------
Function IIf#(Condition, IfTrue#, IfFalse#)
If Condition Then
Return IfTrue
Else
Return IfFalse
End If
End Function
;Prüft, ob Zahl zwischen beiden Grenzen -----------------------------------------------------------
Function IsBetween(Value#, LowerBound#, UpperBound#)
Return Value >= LowerBound And Value <= UpperBound
End Function
;Maximum von zwei Zahlen --------------------------------------------------------------------------
Function Max#(A#, B#)
If A > B Then
Return A
Else
Return B
End If
End Function
;Minimum von zwei Zahlen --------------------------------------------------------------------------
Function Min#(A#, B#)
If A < B Then
Return A
Else
Return B
End If
End Function
;Liefert Zahl zwischen beiden Grenzen -------------------------------------------------------------
Function Clamp#(Value#, LowerBound#, UpperBound#)
If Value < LowerBound Then
Return LowerBound
Else If Value > UpperBound Then
Return UpperBound
Else
Return Value
End If
End Function
;Schneidet den Dezimalteil ab ---------------------------------------------------------------------
Function Cut#(A#, Decimals)
Local Pow = 10 ^ Decimals
Return Float(Int(A * Pow)) / Pow
End Function
;Wandelt einen Wert zwischen 0-255 in einen zwischen 0.0-1.0 um -----------------------------------
Function ByteToFloat#(Value)
Return Value / 255.0
End Function
;Wandelt einen Wert zwischen 0.0-1.0 in einen zwischen 0-255 um -----------------------------------
Function FloatToByte(Value#)
Return Value * 255
End Function
;Überprüft, ob radiale Objekte kollidieren --------------------------------------------------------
Function CheckCollision(SourceEntity, SourceRadius#, TargetEntity, TargetRadius#)
Return EntityDistance(SourceEntity, TargetEntity) < SourceRadius + TargetRadius
End Function
;Liefert Alpha-, Rot-, Grün- und Blauanteil des übergebenen ARGB-Codes ----------------------------
Dim Argb(3)
Function GetArgbComponents(Value)
Argb(0) = (Value And $FF000000) / $1000000
Argb(1) = (Value And $FF0000) / $10000
Argb(2) = (Value And $FF00) / $100
Argb(3) = Value And $FF
End Function
;Liefert den Argb-Farbcode aus den Werten im Argb-Array -------------------------------------------
Function GetArgbValue()
Return Argb(0) * $1000000 + Argb(1) * $10000 + Argb(2) * $100 + Argb(3)
End Function
;Erstellt Zufallslisten ohne Dubletten zwischen Minimum und Maximum -------------------------------
Dim RandomTemp(0)
Dim RandomList(0)
Function CreateRandomList(Count, Minimum, Maximum)
If Count - 1 > Maximum - Minimum Then
RuntimeError("Can't make " + Count + " different numbers with only " + (Maximum - Minimum) + " choices.")
Else
;Liste mit Zahlen der Reihe nach erstellen
Local RandomTempLength = Count - 1
Dim RandomTemp(RandomTempLength)
For i = 0 To RandomTempLength
RandomTemp(i) = i + Minimum
Next

;Zufällige Zahlenliste daraus erstellen
Dim RandomList(RandomTempLength)
Local PickedIndex
For i = 0 To Count - 1
PickedIndex = Rand(0, RandomTempLength)
RandomList(i) = RandomTemp(PickedIndex)
RandomTemp(PickedIndex) = RandomTemp(RandomTempLength)
RandomTempLength = RandomTempLength - 1
Next
End If
End Function

;String-Funktionen ================================================================================
;Zeilenumbruch ------------------------------------------------------------------------------------
Global LF$ = Chr(13)
;Teilt Zeichenketten auf --------------------------------------------------------------------------
Global SplitCount
Dim SplitString$(0)
Function Split(Value$, SplitChar$)
SplitCount = 0
For i = 1 To Len(Value)
Local CurChar$ = Mid(Value, i, 1)
If CurChar = SplitChar Then SplitCount = SplitCount + 1
Next
Dim SplitString$(SplitCount)
Local CurrentSplit
For i = 1 To Len(Value)
CurChar$ = Mid(Value, i, 1)
If CurChar <> SplitChar Then
SplitString(CurrentSplit) = SplitString(CurrentSplit) + CurChar
Else
CurrentSplit = CurrentSplit + 1
End If
Next
End Function
;Fügt Nullen dem Nachkomma- oder Vorkommaanteil hinzu ---------------------------------------------
Function FitNumber$(A#, PostFill, PreFill = -1, PreFillChar$ = " ")
Split(A#, ".")
While Len(SplitString(1)) < PostFill
SplitString(1) = SplitString(1) + "0"
Wend
While Len(SplitString(0)) < PreFill
SplitString(0) = PreFillChar + SplitString(0)
Wend
Return SplitString(0) + "." + SplitString(1)
End Function
;Entfernt unnötige Endnullen bei Kommazahlen ------------------------------------------------------
Function TrimNumber$(A#)
If Int(A) = A Then
Return Int(A)
Else
Return A
End If
End Function
;Schreibt einen null-terminierten String ----------------------------------------------------------
Function Write0String(Stream, Value$)
For i = 1 To Len(Value)
WriteByte(Stream, Asc(Mid(Value, i, 1)))
Next
WriteByte(Stream, 0)
End Function
;Liest einen null-terminierten String -------------------------------------------------------------
Function Read0String$(Stream)
Local Value$
Repeat
i = ReadByte(Stream)
If i = 0 Then
Return Value
Else
Value = Value + Chr(i)
End If
Forever
End Function
;Zeichnet mehrzeiligen Text -----------------------------------------------------------------------
Function TextMultiline(X, Y, Value$, CentreX = False, CentreY = False, Spacing = 0)
Local CentreHeight
Split(Value, LF)
If CentreY Then CentreHeight = (FontHeight() * (SplitCount + 1) / 2) + (Spacing * SplitCount / 2)
For i = 0 To SplitCount
Text X, Y + i * FontHeight() + Spacing * i - CentreHeight, SplitString(i), CentreX
Next
End Function
;Liefert den einsbasierten Index des ersten Vorkommens des Zeichens von hinten aus ----------------
Function InstrR(String_$, Find$, From = -1, To_ = 1)
If From = -1 Then
From = Len(String_)
End If
If From > To_ Then
For i = From To To_ Step -1
If Mid(String_, i, 1) = Find Then
Return i
End If
Next
End If
Return 0
End Function

;Eingabe ==========================================================================================
;Überprüft, ob die Maus im Rechteck ist -----------------------------------------------------------
Function MouseInRect(X, Y, Width, Height)
Return (MseX >= X And MseX < X + Width) And (MseY >= Y And MseY < Y + Height)
End Function

;Dateisystem ======================================================================================
;Kombiniert Verzeichnisnamen oder Dateinamen ------------------------------------------------------
Function CombinePath$(Path1$, Path2$)
Local CombinedPath$
If Right(Path1, 1) = "\" Then
CombinedPath = Path1 + Path2
Else
CombinedPath = Path1 + "\" + Path2
End If
Return CombinedPath
End Function
;Liefert die Anzahl der Dateien in einem Verzeichnis zurück ---------------------------------------
Function GetFileCount(DirectoryPath$)
Local FileCount = 0

Local FoundObject$
Local Directory = ReadDir(DirectoryPath)
Repeat
FoundObject = NextFile(Directory)
If FoundObject = "" Then
Exit
Else
If FileType(CombinePath(DirectoryPath, FoundObject)) = FileTypeFile Then
FileCount = FileCount + 1
End If
End If
Forever
CloseDir(Directory)

Return FileCount
End Function
;Liefert die Anzahl der Dateien in einem Ordner zurück --------------------------------------------
Function GetDirectoryCount(DirectoryPath$)
Local DirectoryCount = 0

Local FoundObject$
Local Directory = ReadDir(DirectoryPath)
Repeat
FoundObject = NextFile(Directory)
If FoundObject = "" Then
Exit
Else
If FoundObject <> "." And FoundObject <> ".." And FileType(FoundObject) = FileTypeDirectory Then
DirectoryCount = DirectoryCount + 1
End If
End If
Forever
CloseDir(Directory)

Return DirectoryCount
End Function
;Liefert einen zufälligen Dateinamen aus dem übergebenen Verzeichnis zurück -----------------------
Function GetRandomFilename$(Path$)
;Zufallszahl für Dateinummer berechnen
Local FileCount = GetFileCount(Path)
Local FileNumber = Rand(1, FileCount)

;Dateinamen der Datei mit der berechneten Nummer zurückgeben
Local CurrentFile = 0
Local Directory = ReadDir(Path)
Local FoundObject$
Repeat
FoundObject = NextFile(Directory)
If FileType(Path + FoundObject) = FileTypeFile Then
CurrentFile = CurrentFile + 1
End If
Until CurrentFile = FileNumber
CloseDir(Directory)

Return FoundObject
End Function
;Extrahiert den Dateinamen aus einem Pfad ---------------------------------------------------------
Function GetFilename$(Path$)
Local SeperatorIndex = InstrR(Path, "\")
Return Mid(Path, SeperatorIndex + 1, Len(Path) - SeperatorIndex)
End Function
;Extrahiert den Dateinamen ohne Dateierweiterung aus einem Pfad -----------------------------------
Function GetFilenameWithoutExtension$(Path$)
Local Filename$ = GetFilename(Path)
Return Left(Filename, InstrR(Filename, ".") - 1)
End Function

;Bildmanipulation =================================================================================
;Liefert den Inhalt des aktuellen Bildschirms als Bild zurück -------------------------------------
Function GetCurrentScreen()
Local Screen = CreateImage(ResWidth, ResHeight)
CopyRect(0, 0, ResWidth, ResHeight, 0, 0, BackBuffer(), ImageBuffer(Screen))
Return Screen
End Function
;Verdunkelt oder verhellert das Bild um den angegebenen Betrag ------------------------------------
Function ImageGamma(Image, Amount#, Safe = True)
Local Buffer = ImageBuffer(Image)
LockBuffer(Buffer)

;Entweder sicher (ohne Überlauf) berechnen oder schnell mit Gefahr von falschen Farben
If Safe Then
For y = 0 To ImageHeight(Image) - 1
For x = 0 To ImageWidth(Image) - 1
GetArgbComponents(ReadPixelFast(x, y, Buffer))
Argb(1) = Min(Argb(1) * Amount, 255)
Argb(2) = Min(Argb(2) * Amount, 255)
Argb(3) = Min(Argb(3) * Amount, 255)
WritePixelFast(x, y, GetArgbValue(), Buffer)
Next
Next
Else
For y = 0 To ImageHeight(Image) - 1
For x = 0 To ImageWidth(Image) - 1
GetArgbComponents(ReadPixelFast(x, y, Buffer))
Argb(1) = Argb(1) * Amount
Argb(2) = Argb(2) * Amount
Argb(3) = Argb(3) * Amount
WritePixelFast(x, y, GetArgbValue(), Buffer)
Next
Next
End If

UnlockBuffer(Buffer)
End Function


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

BeitragFr, Okt 21, 2011 21:58
Antworten mit Zitat
Benutzer-Profile anzeigen
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)
Return Sqr((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1))
End Function


zum beispiel Smile
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 Very Happy

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

BeitragFr, Okt 21, 2011 22:47
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Okt 22, 2011 3:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für das Wort "Clamping". Darauf bin ich damals nicht gekommen, als ich die Funktion benötigte Smile 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

BeitragSa, Okt 22, 2011 10:01
Antworten mit Zitat
Benutzer-Profile anzeigen
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)
Return Abs(x2-x1)+Abs(y2-y1)
End Function


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? Smile

PacMani

BeitragSa, Okt 22, 2011 10:43
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Okt 23, 2011 20:21
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Okt 23, 2011 20:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Richtig, aber bisher brauchte ich fast alle immer wieder Wink 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

BeitragSa, Nov 05, 2011 15:32
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Nov 06, 2011 0:28
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Nov 06, 2011 0:31
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Nov 06, 2011 19:57
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink
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

BeitragSo, Nov 06, 2011 20:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Möglicherweise kann eine Funktion solch ein BlitzArray [...] sogar mit Return zurückgeben

Kann sie leider nicht Sad
Rest geht aber.
ZEVS

PacMani

BeitragSo, Nov 06, 2011 20:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Wollte ich auch erst so machen, aber vergaß:
BlitzBasic: [AUSKLAPPEN]
Local RandomTempLength = Count - 1
Local RandomTemp[RandomTempLength]

Fehler in zweiter Zeile: Blitz array sizes must be constant - es geht also nicht mit Variablen als Länge Sad Widerspricht allen anderen Programmiersprachen der Welt - aber es geht ja auch mit Dim.

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group